當(dāng)開發(fā)遇到運(yùn)維
對(duì)于很多團(tuán)隊(duì)來說,開發(fā)和運(yùn)維現(xiàn)在還是兩個(gè)世界的人,開發(fā)人員寫著屬于自己的代碼,然后丟給運(yùn)維人員。但作為開發(fā)人員,我們必須知道,運(yùn)維的方式對(duì)于開發(fā)上的抉擇是有影響的。
和這個(gè)世界上的許多項(xiàng)目一樣,我現(xiàn)在正在開發(fā)的項(xiàng)目也有一些后臺(tái)定時(shí)運(yùn)行的任務(wù)。這是一個(gè)Java應(yīng)用,但我并不想把這些定時(shí)任務(wù)扔進(jìn)Java EE容器里,沒有必要讓這些后臺(tái)應(yīng)用和前臺(tái)應(yīng)用搶資源。所以,我們就把它做成了一個(gè)獨(dú)立的應(yīng)用。好,問題來了,誰來做定時(shí)調(diào)度?
因?yàn)槲覀兊膽?yīng)用最終會(huì)部署在Linux操作系統(tǒng)上,所以,我的***個(gè)直覺就是采用Cron。這是一個(gè)已經(jīng)存在了幾十年的解決方案,沒有任何問題,而且,開發(fā)團(tuán)隊(duì)幾乎不需要做任何額外工作。這個(gè)方案一直存在到我們和運(yùn)維團(tuán)隊(duì)交流為止。
“我們不允許使用任何系統(tǒng)任務(wù)”,運(yùn)維團(tuán)隊(duì)開門見山地否決了我們的解決方案。運(yùn)維團(tuán)隊(duì)給出的理由是,他們無法保證一臺(tái)機(jī)器上只運(yùn)行一個(gè)應(yīng)用,如果其中一個(gè)應(yīng)用掛了,運(yùn)維人員也許會(huì)清理一些資源,換句話說,如果你的應(yīng)用用了這些東西,也許會(huì)被一不小心地刪掉了。“所以,按照我們規(guī)定,每個(gè)應(yīng)用只能開辟自己的目錄,運(yùn)用自己目錄下東西。”
這是一個(gè)合理的要求,所以,我們需要調(diào)整自己的設(shè)計(jì)方案,把原來交由系統(tǒng)處理的調(diào)度轉(zhuǎn)成由自己的應(yīng)用處理。當(dāng)然,在Java世界,這不是太大的難度,Quartz框架很好地幫我們處理了這些。
其實(shí),與調(diào)度方案同時(shí)被推翻的還有我的另外一個(gè)方案。這次我原本想嘗試把我們的日志寫到系統(tǒng)日志里。如果你不知道的話,rsyslog可以讓我們把自己的日志寫到/var/log下。很顯然,這樣的方案在這樣約束下也是不行的。我們只好回到Java的傳統(tǒng)方式上,把日志寫到自己的目錄下。
這是兩個(gè)由運(yùn)維反過來影響開發(fā)方案的小例子。運(yùn)維是開發(fā)的一種很重要的組成部分,運(yùn)維團(tuán)隊(duì)的一些工作方式直接影響到開發(fā)上的一些決策。所以,如果開發(fā)和運(yùn)維還是兩個(gè)團(tuán)隊(duì),開發(fā)團(tuán)隊(duì)不妨多找運(yùn)維團(tuán)隊(duì)聊聊,更多地了解關(guān)于部署的方方面面。當(dāng)然,更好的解決方案是走向通往DevOps的康莊大道。