感谢明朝互动对我的培养,公司的强制每日总结制度让我养成了总结的好习惯。我不希望遗忘这个难得的好习惯,借助简书记录成长的一点一滴;
内容太庞大,感觉无从说起。但是不好好总结总结,感觉对不起老师和自己。论文写完了,ppt做完了,系统也上线了。这篇文章不想介绍什么技术,只是想记录一下心情。
Github地址:https://github.com/shanxuanchen/GdinojJudge
说实话,这个系统很庞大。庞大不是在于代码量,而是在于架构和思想,原理和难点。首先就是架构的演变。
架构的演变
原来的判题系统是集中式判题,内核轮训数据库的方式来获取提交请求的。这个毛病其实很显然的,数据库存在锁机制,用判题进程去轮训修改数据库这个做法其实是很糟糕的。但是我去向hustoj的老师去提出我的想法的时候,他们都觉得这个没有问题。也不需要这样的改进。我做出来的结果证明了我是对的。
后来我就做了上图的改进。我使用了rabbitmq来做中间件,判题集群跟业务就可以完全解除耦合。这个轮训数据库的傻逼做法终于得到解决。但是之前的想法是用erlang来封装网络层再用nif来封装内核,来调用判题服务的。不过我做着做着就感觉不对劲了。这个tm不是复杂了吗,我只是想从消息队列中获取数据啊。
那时候距离要交小组项目演示已经剩下不多的时间了,我心头的那个急啊。那时候还剩5天,这5天我是基本都是通宵的。后来架构发生了大规模的变化如下图。
逻辑的架构是没有发生改变的。主要是判题服务器这个部分。我没有用erlang来编写网络层了,我直接用C来获取rabbitmq的消息!然后再直接开启进程判题。然后我开始思考消息的封装协议,我一开始是打算用protobuf来打包消息的。性能也确实比较好。但是时间不够了啊!!只能转头用json来封装了。不过json也不差。也就是说,从web发送过来的请求放进消息队列之前都已经被封装成json格式了。在判题内核中还需要对json解码。这个难度不大。cpp大把的开源库。
结果
连续5晚的几乎通宵,更可气的是web的版本拖了很久还没上线,我还花了一天左右的时间硬是把web版本硬推上线,真是一把心酸一把泪。
感悟
一开始跟佳哥做了很多项目,坚持到现在的就只剩下oj了。我是满满的没有办法啊。如果可以,我希望我能坚持到佳哥退休。30多年,我相信可以的。对佳哥的感激和知遇之恩我觉得我一辈子都还不清了,多少感激的话都觉得很无力。
在明朝实习的时候,柳光要我研究rabbimq源码。我那时候看得十分仔细和认真,并且把各个模式我都自己用erlang写了一遍。最后问思强我的毕设应该怎么做的时候,我最终就确定了初步架构。现在想起来感觉请柳光和思强一顿饭不够啊。
有很多人觉得我,为了一个毕设放弃这么好的工作,放弃这么多东西不值得。但是他们不知道,这个毕设不仅仅是我一个人的东西。我做这个系统并不只是为了我毕业而做,我也是为了学校的acm/icpc而做。我曾经说过,有一些恩情,就是要怎么还也还不清的。acm/icpc这个比赛对我来说有太重要的意义了。因为它,我开始爱上了编程;因为它,我开始没天没夜的学算法;因为它,我开始了人人推广的创业;因为它,我结识了佳哥;因为它,我敢于去参加数模;因为它,我有着非凡的自学能力和领悟能力。
然而我的学校却没有一个好的氛围去参加这个比赛,甚至很多人都不知道它的存在。这是一个弱校的悲哀,更是我的无奈。但是,我不甘心。我只能用绵薄之力去一点点地改变它。
计划
至于接下来要怎么走,我确实需要几天好好想想。这次使用linux API编写内核驱动让我找回了当年的感觉。估计也是这个方向比较好,现在还比较模糊。