用c++和c#開發(fā)應(yīng)用服務(wù)器的時候,會遇到這種情況,知道當(dāng)前運(yùn)行的服務(wù)器邏輯有bug,但是卻無法及時的停機(jī)替換有bug的服務(wù),而導(dǎo)致問題的擴(kuò)大話或者其他不良的后果。為此,我考慮了運(yùn)行時邏輯替換的可能性。
首先,設(shè)計(jì)邏輯的時候,把數(shù)據(jù)和邏輯分開。這樣,可以在替換邏輯的時候減少數(shù)據(jù)的交互,降低bug的出現(xiàn)幾率。
其次,邏輯模塊間使用接口來進(jìn)行交互。這樣的好處是其他邏輯模塊不依賴編譯器生成的代碼,也不會進(jìn)行inline優(yōu)化,以便于能夠完全的替換掉邏輯模塊。
再次,邏輯模塊內(nèi)的不同部分,最好也使用接口來進(jìn)行交互。這樣可以最大程度上提高靈活性,降低替換成本。
最后,邏輯接口實(shí)現(xiàn)完全的狀態(tài)拷貝的功能。這個是最后最關(guān)鍵的一步。
實(shí)現(xiàn)了這些東西后,我們的邏輯模塊就可以方便的進(jìn)行替換。提高了服務(wù)器的靈活性,也提升了服務(wù)的穩(wěn)定運(yùn)行時間。
不過,需要注意的是,在沒有這些需求的情況下,最好不要進(jìn)行這種危險的行動。因?yàn)樯晕⒉恍⌒模涂赡茉跔顟B(tài)拷貝的時候,漏掉一個或者多個關(guān)鍵狀態(tài)而引起服務(wù)器發(fā)生意想不到的問題。