1

找不到有关此主题的任何内容。

我有一个 Windows TCP C++ 服务器应用程序,我想不时更新它。


正如您显然理解的那样,这会带来一个问题 - 从用户的角度来看,服务器应该是 24/7 的。
更新时,还希望保持与用户的当前 TCP 连接。


我一直在考虑一个类似模块的系统,例如套接字处理模块将驻留在“sockets.dll”中,服务器的逻辑将驻留在“logic.dll”中。
采用这种方法似乎打开了潘多拉的盒子。
- 我将如何进行模块的实际“交换”?想象一下,X 工作线程不断地从一个模块向另一个模块发送数据——交换时我需要一种(轻快)的方式来暂停/暂停它们;也许是信号?
- 协议版本,甚至函数签名在更新时可能会发生变化。如何处理?
- 其他问题,例如未被注意到的逻辑错误。
- 谁知道会出现其他问题。


除了上述之外,我还担心如何更新 10 台服务器?我的意思是,它们都相互连接,相互交流。
如果更新引入了协议修改,它可能会导致巨大的问题,在这种情况下,我需要将整个集群(服务器)作为一个整体进行更新;关闭整个操作?这听起来不对,根本不对!我怎么做?我在这里缺少哪些概念以及如何学习它/它们?


我能做些什么吗?
你会怎么做?你做过这样的事吗?
您知道解决问题的任何机制/文章/项目/源示例/等吗?

任何有价值的建议都非常受欢迎!!

4

2 回答 2

1

这是一个想法:

  • 旧版本下载更新并启动它。
  • 旧版本通过将新连接转发到更新版本(侦听不同端口)来停止接受新连接。
  • 旧版本在完成连接后关闭。
  • 新版本检测旧版本何时退出并切换端口。

基本上,这个想法是让两个版本同时运行。

于 2010-09-12T00:56:25.103 回答
0

在协议更改方面,我建议您对协议进行版本控制。在参与服务器之间的连接开始时,让发起者或接收者(我认为这并不重要)宣布它理解的协议的最新版本,然后另一方以实物回应。他们退回到他们理解的最新版本。

是的,这意味着在一段时间内维护两个协议版本的代码,但是一旦您知道所有服务器都已更新并使用新协议,您就可以淘汰旧代码。

假设您也可以控制所有可能的客户端软件,那么您也可以对您的客户端执行相同的操作。当然,如果您无法控制用户升级的时间,这可能需要更长时间地维护旧协议代码。

于 2010-09-15T16:20:19.967 回答