感謝明朝互動(dòng)對我的培養(yǎng),公司的強(qiáng)制每日總結(jié)制度讓我養(yǎng)成了總結(jié)的好習(xí)慣。我不希望遺忘這個(gè)難得的好習(xí)慣,借助簡書記錄成長的一點(diǎn)一滴;
內(nèi)容太龐大,感覺無從說起。但是不好好總結(jié)總結(jié),感覺對不起老師和自己。論文寫完了,ppt做完了,系統(tǒng)也上線了。這篇文章不想介紹什么技術(shù),只是想記錄一下心情。
Github地址:https://github.com/shanxuanchen/GdinojJudge
說實(shí)話,這個(gè)系統(tǒng)很龐大。龐大不是在于代碼量,而是在于架構(gòu)和思想,原理和難點(diǎn)。首先就是架構(gòu)的演變。
架構(gòu)的演變
原來的判題系統(tǒng)是集中式判題,內(nèi)核輪訓(xùn)數(shù)據(jù)庫的方式來獲取提交請求的。這個(gè)毛病其實(shí)很顯然的,數(shù)據(jù)庫存在鎖機(jī)制,用判題進(jìn)程去輪訓(xùn)修改數(shù)據(jù)庫這個(gè)做法其實(shí)是很糟糕的。但是我去向hustoj的老師去提出我的想法的時(shí)候,他們都覺得這個(gè)沒有問題。也不需要這樣的改進(jìn)。我做出來的結(jié)果證明了我是對的。
后來我就做了上圖的改進(jìn)。我使用了rabbitmq來做中間件,判題集群跟業(yè)務(wù)就可以完全解除耦合。這個(gè)輪訓(xùn)數(shù)據(jù)庫的傻逼做法終于得到解決。但是之前的想法是用erlang來封裝網(wǎng)絡(luò)層再用nif來封裝內(nèi)核,來調(diào)用判題服務(wù)的。不過我做著做著就感覺不對勁了。這個(gè)tm不是復(fù)雜了嗎,我只是想從消息隊(duì)列中獲取數(shù)據(jù)啊。
那時(shí)候距離要交小組項(xiàng)目演示已經(jīng)剩下不多的時(shí)間了,我心頭的那個(gè)急啊。那時(shí)候還剩5天,這5天我是基本都是通宵的。后來架構(gòu)發(fā)生了大規(guī)模的變化如下圖。
邏輯的架構(gòu)是沒有發(fā)生改變的。主要是判題服務(wù)器這個(gè)部分。我沒有用erlang來編寫網(wǎng)絡(luò)層了,我直接用C來獲取rabbitmq的消息!然后再直接開啟進(jìn)程判題。然后我開始思考消息的封裝協(xié)議,我一開始是打算用protobuf來打包消息的。性能也確實(shí)比較好。但是時(shí)間不夠了啊!!只能轉(zhuǎn)頭用json來封裝了。不過json也不差。也就是說,從web發(fā)送過來的請求放進(jìn)消息隊(duì)列之前都已經(jīng)被封裝成json格式了。在判題內(nèi)核中還需要對json解碼。這個(gè)難度不大。cpp大把的開源庫。
結(jié)果
連續(xù)5晚的幾乎通宵,更可氣的是web的版本拖了很久還沒上線,我還花了一天左右的時(shí)間硬是把web版本硬推上線,真是一把心酸一把淚。
感悟
一開始跟佳哥做了很多項(xiàng)目,堅(jiān)持到現(xiàn)在的就只剩下oj了。我是滿滿的沒有辦法啊。如果可以,我希望我能堅(jiān)持到佳哥退休。30多年,我相信可以的。對佳哥的感激和知遇之恩我覺得我一輩子都還不清了,多少感激的話都覺得很無力。
在明朝實(shí)習(xí)的時(shí)候,柳光要我研究rabbimq源碼。我那時(shí)候看得十分仔細(xì)和認(rèn)真,并且把各個(gè)模式我都自己用erlang寫了一遍。最后問思強(qiáng)我的畢設(shè)應(yīng)該怎么做的時(shí)候,我最終就確定了初步架構(gòu)。現(xiàn)在想起來感覺請柳光和思強(qiáng)一頓飯不夠啊。
有很多人覺得我,為了一個(gè)畢設(shè)放棄這么好的工作,放棄這么多東西不值得。但是他們不知道,這個(gè)畢設(shè)不僅僅是我一個(gè)人的東西。我做這個(gè)系統(tǒng)并不只是為了我畢業(yè)而做,我也是為了學(xué)校的acm/icpc而做。我曾經(jīng)說過,有一些恩情,就是要怎么還也還不清的。acm/icpc這個(gè)比賽對我來說有太重要的意義了。因?yàn)樗议_始愛上了編程;因?yàn)樗议_始沒天沒夜的學(xué)算法;因?yàn)樗议_始了人人推廣的創(chuàng)業(yè);因?yàn)樗医Y(jié)識(shí)了佳哥;因?yàn)樗腋矣谌⒓訑?shù)模;因?yàn)樗矣兄欠驳淖詫W(xué)能力和領(lǐng)悟能力。
然而我的學(xué)校卻沒有一個(gè)好的氛圍去參加這個(gè)比賽,甚至很多人都不知道它的存在。這是一個(gè)弱校的悲哀,更是我的無奈。但是,我不甘心。我只能用綿薄之力去一點(diǎn)點(diǎn)地改變它。
計(jì)劃
至于接下來要怎么走,我確實(shí)需要幾天好好想想。這次使用linux API編寫內(nèi)核驅(qū)動(dòng)讓我找回了當(dāng)年的感覺。估計(jì)也是這個(gè)方向比較好,現(xiàn)在還比較模糊。