一次服務(wù)重構(gòu)上線后的反思

背景

我們的一個(gè)服務(wù)模塊使用websocket技術(shù),通過(guò)長(zhǎng)鏈接來(lái)協(xié)同廣播用戶的操作行為,但是服務(wù)職責(zé)不單一,邊界劃分不清晰,承載了很多職責(zé)之外的業(yè)務(wù),所以決定對(duì)服務(wù)進(jìn)行徹底重構(gòu),差不多是重寫(xiě)。

經(jīng)過(guò)一個(gè)多月的努力,服務(wù)重構(gòu)完成,包括架構(gòu)、集群方式調(diào)整,數(shù)據(jù)存儲(chǔ)、操作模型設(shè)計(jì)等,經(jīng)過(guò)嚴(yán)格測(cè)試后上線,雖然核心業(yè)務(wù)可用,但還是出現(xiàn)很多本不該出現(xiàn)的問(wèn)題,現(xiàn)總結(jié)一下,權(quán)當(dāng)做最近一段時(shí)間工作的總結(jié),和對(duì)問(wèn)題的反思,以后的工作中要引以為戒。

一、不要忽視簡(jiǎn)單的業(yè)務(wù)邏輯、代碼

無(wú)論業(yè)務(wù)多簡(jiǎn)單,都不要小覷它,必須要有單元測(cè)試,且要盡量覆蓋到每一個(gè)分支、每一行代碼,據(jù)說(shuō)行業(yè)中行覆蓋率達(dá)到60%以上,就已經(jīng)很好了,最好的是68%。

刪除確認(rèn)無(wú)用的代碼,問(wèn)題往往出現(xiàn)在這些不經(jīng)意的地方,可有可無(wú)的代碼不僅給業(yè)務(wù)的理解帶來(lái)困難,給維護(hù)者增加維護(hù)成本,甚至影響整個(gè)代碼的質(zhì)量。因?yàn)槟愀杏X(jué)這些代碼不重要,從而意識(shí)上就不會(huì)過(guò)多的關(guān)注它,結(jié)果往往就是因?yàn)檫@些代碼造成系統(tǒng)難用,或者不可用,影響整個(gè)服務(wù)。

二、重視偶發(fā)的、不起眼的exception

對(duì)于偶發(fā)的錯(cuò)誤,也要引起足夠重視,刨根問(wèn)底,找到根本原因并解決它。否則,一旦上線,就會(huì)放大這些問(wèn)題,造成整個(gè)服務(wù)不可用。有時(shí)只要在平時(shí)開(kāi)發(fā)、測(cè)試的過(guò)程中稍稍關(guān)注一下發(fā)現(xiàn)的問(wèn)題,就能很快的解決它。

這次重構(gòu)后,在自測(cè)的過(guò)程中,偶發(fā)出現(xiàn)一個(gè)序列化錯(cuò)誤,簡(jiǎn)單看了一下錯(cuò)誤拋出的地方,是調(diào)用第三方服務(wù)的,所以就沒(méi)有放在心上,當(dāng)時(shí)就感覺(jué)是第三方服務(wù)可能偶爾出現(xiàn)的返回?cái)?shù)據(jù)格式問(wèn)題,另外第三方服務(wù)也沒(méi)有修改,一直在線上穩(wěn)定運(yùn)行,所以就沒(méi)有過(guò)多的關(guān)注。上線后,該錯(cuò)誤頻繁拋出,就進(jìn)行了回滾,經(jīng)查證原因是在解析第三方服務(wù)返回的數(shù)據(jù)時(shí)候,一個(gè)符號(hào)寫(xiě)錯(cuò)了,造成序列化失敗,如果在開(kāi)發(fā)、自測(cè)的過(guò)程中對(duì)這個(gè)問(wèn)題關(guān)注一下,根本就不會(huì)把它帶到線上,也不會(huì)造成服務(wù)回滾,浪費(fèi)了很多時(shí)間與精力。

三、碰到的疑問(wèn)要立即驗(yàn)證確認(rèn)

平時(shí)在開(kāi)發(fā)、自測(cè)的過(guò)程中,會(huì)碰到一些自己不確定的地方,無(wú)論是業(yè)務(wù),還是技術(shù),都要及時(shí)確認(rèn)驗(yàn)證,不要想著隨后有時(shí)間了再說(shuō),一旦有了這個(gè)想法,即便以后有時(shí)間了,你也不會(huì)去處理,這也許就是拖延癥吧,那么問(wèn)題隨后就會(huì)進(jìn)一步放大,導(dǎo)致服務(wù)不可用。

四、多關(guān)注測(cè)試日志

服務(wù)提測(cè)后,多數(shù)RD會(huì)認(rèn)為此時(shí)重點(diǎn)在QA,而自己相對(duì)來(lái)說(shuō)就會(huì)輕松一些(*^__^*) ,實(shí)際上此時(shí)RD也確實(shí)是比開(kāi)發(fā)時(shí)的時(shí)候時(shí)間多一點(diǎn)。但是,如果你的想法是現(xiàn)在終于有時(shí)間來(lái)放松一下了,聊聊天、刷刷微信、微博,看看新聞啥的,等著QA來(lái)告訴你問(wèn)題,那就大錯(cuò)特錯(cuò)了,千萬(wàn)不要浪費(fèi)此時(shí)的空閑時(shí)間。

此時(shí),如果QA問(wèn)題不多、或者沒(méi)有匯報(bào)問(wèn)題的時(shí)候,RD的時(shí)間還是比較空余的,此時(shí)對(duì)RD來(lái)說(shuō)是很好的時(shí)機(jī),因?yàn)楝F(xiàn)在問(wèn)題不多,沒(méi)人打擾,才能夠真正的靜下心來(lái)好好想一想,回顧一下還有沒(méi)有什么問(wèn)題自己沒(méi)有注意到;一些棘手的問(wèn)題當(dāng)時(shí)考慮的是否全面,是否有遺漏;一些邏輯是否能夠更加嚴(yán)謹(jǐn)?shù)?。站在一個(gè)更高的層面看看是否還有能夠優(yōu)化、完善的地方,多看看測(cè)試日志,利用好這段時(shí)間,能夠發(fā)現(xiàn)并解決很多問(wèn)題,不要等到上線后出問(wèn)題讓自己后悔不已?;剡^(guò)頭來(lái)看,上線的問(wèn)題,其實(shí)測(cè)試日志中都出現(xiàn)過(guò),上線前有人關(guān)注一下,就不會(huì)導(dǎo)致上線后問(wèn)題的發(fā)生。畢竟QA是對(duì)功能進(jìn)行測(cè)試,很多不明顯的異常他們是不知道的,QA不反饋,不代表沒(méi)有問(wèn)題,QA也會(huì)有遺漏,也不能察覺(jué)到所有的錯(cuò)誤,所以在QA測(cè)試過(guò)程中,RD也要多測(cè)試、多關(guān)心日志,多思考,將問(wèn)題殺死在搖籃之中。

本次上線前,有2天時(shí)間,QA在進(jìn)行整體的回歸測(cè)試,而RD都在放松、浪費(fèi)自己的時(shí)間,沒(méi)有一人去看測(cè)試日志,結(jié)果上線后,一堆錯(cuò)誤日志,導(dǎo)致回滾,下來(lái)再看,這些錯(cuò)誤在測(cè)試日志中早已經(jīng)存在,如果2天內(nèi)多多關(guān)注測(cè)試日志,就不會(huì)將錯(cuò)誤帶到線上,造成上線失敗。

五、不要抱任何僥幸心理

對(duì)于任何問(wèn)題,都不要抱有僥幸心理,說(shuō)可能是環(huán)境的差異才導(dǎo)致的,如果確實(shí)是環(huán)境問(wèn)題導(dǎo)致的,也要拿出確實(shí)可信的理由,不要認(rèn)為現(xiàn)在的問(wèn)題上到線上就沒(méi)事了,一定要刨根問(wèn)底,找到根源,如果確實(shí)是環(huán)境的問(wèn)題,要看看線上環(huán)境有沒(méi)有該問(wèn)題,該問(wèn)題是如何發(fā)生的等。通常情況下,你感覺(jué)有問(wèn)題的地方,也確實(shí)是有問(wèn)題,無(wú)論什么環(huán)境。

總得來(lái)說(shuō),這次重構(gòu)學(xué)會(huì)了很多東西,也讓自己對(duì)事物、對(duì)人的看法與以往有了很大不同,無(wú)論開(kāi)始你認(rèn)為多么復(fù)雜的事情,只要一步步認(rèn)真的去思考、去動(dòng)手,都會(huì)慢慢的明朗起來(lái),最終解決它。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容