5

我开发了一套音频流服务器,它们都使用 Twisted,当然它们是 Python 的。它们可以工作,但是一个问题一直困扰着我,当我在正在运行的服务器中发现一些错误,或者我想在服务器中添加一些东西时,我需要停止它们并启动它们。与 HTTP 服务器不同,可以随时重新启动它们,但对于音频流服务器则不行。一旦我重新启动我的流媒体服务器,这意味着我的用户将遇到断开连接。

我确实尝试设置一个检修孔(Twisted 服务器的 ssh 服务,您可以登录并在控制台中输入 Python 代码来做某事),然后连接到控制台,即时重新加载 Python 模块。它有时有效,但很难控制。您永远不知道服务器中有多少旧类的实例,其中一些可能难以访问,并且类的关系会非常复杂。此外,它在某些情况下可能会起作用,但有时您确实需要重新启动服务器,例如,您正在使用 selector reactor 运行服务器,而您想使用 epoll reactor 运行它,那么您必须重新启动它。另一个例子,当内存使用率过高时,你也必须重新启动它们。

为了构建这样的系统,我有一个想法出现在我的脑海中,我在想是否可以将这些连接和数据从一个进程移交给另一个进程。例如:

我们有一个名为 Broadcasting 的服务器,正在运行的实例在 rev.123 下,我们想用 rev.124 替换它。

Broadcasting rev.123 is running....
Startup Broadcasting rev.124 ....
Broadcasting rev.124 is stand by
Hand over connections from instance of rev.123 to instance of rev.124
Stop Broadcasting rev. 123 instance

这可能吗?我不知道套接字句柄的生命周期是否绑定到进程,我认为当创建者进程被杀死时,由进程创建的套接字将被关闭,但我不确定。如果可能的话,是否有任何指南或文章来设计这种热代码交换机制?有没有什么可以实现我想要的 Twisted 已经完成的事情?

谢谢。

4

1 回答 1