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