用c++和c#开发应用服务器的时候,会遇到这种情况,知道当前运行的服务器逻辑有bug,但是却无法及时的停机替换有bug的服务,而导致问题的扩大话或者其他不良的后果。为此,我考虑了运行时逻辑替换的可能性。
首先,设计逻辑的时候,把数据和逻辑分开。这样,可以在替换逻辑的时候减少数据的交互,降低bug的出现几率。
其次,逻辑模块间使用接口来进行交互。这样的好处是其他逻辑模块不依赖编译器生成的代码,也不会进行inline优化,以便于能够完全的替换掉逻辑模块。
再次,逻辑模块内的不同部分,最好也使用接口来进行交互。这样可以最大程度上提高灵活性,降低替换成本。
最后,逻辑接口实现完全的状态拷贝的功能。这个是最后最关键的一步。
实现了这些东西后,我们的逻辑模块就可以方便的进行替换。提高了服务器的灵活性,也提升了服务的稳定运行时间。
不过,需要注意的是,在没有这些需求的情况下,最好不要进行这种危险的行动。因为稍微不小心,就可能在状态拷贝的时候,漏掉一个或者多个关键状态而引起服务器发生意想不到的问题。