Sockets 如何始终优雅地断开服务器上的套接字?
在我们的flask socketio应用程序中,我们有一个Sockets 如何始终优雅地断开服务器上的套接字?,sockets,flask,redis,flask-socketio,disconnect,Sockets,Flask,Redis,Flask Socketio,Disconnect,在我们的flask socketio应用程序中,我们有一个socket.on(“disconnect”),每当套接字客户端断开连接时,就会调用它来处理数据库状态更新。但是,当我们的服务器由于重新启动或崩溃而被终止时,无法调用此断开连接功能(因为服务器暂时不存在),并且会被丢弃。当服务器备份时,无法正确处理与每个前端的所有套接字断开连接,因此状态不一致 有没有办法在服务器备份时“缓存”这些断开连接事件以运行?理想情况下,最终目标是让所有套接字也自动重新连接,但目前我们先断开连接,然后手动重新连接。
socket.on(“disconnect”)
,每当套接字客户端断开连接时,就会调用它来处理数据库状态更新。但是,当我们的服务器由于重新启动或崩溃而被终止时,无法调用此断开连接功能(因为服务器暂时不存在),并且会被丢弃。当服务器备份时,无法正确处理与每个前端的所有套接字断开连接,因此状态不一致
有没有办法在服务器备份时“缓存”这些断开连接事件以运行?理想情况下,最终目标是让所有套接字也自动重新连接,但目前我们先断开连接,然后手动重新连接。我们的设置是Gunicorn flask线程通过一个带有flask套接字io的redis事件队列进行Nginx负载平衡。您应该注册进程信号
def handler(signum, frame):
# loop and handle all socket disconnect
# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
您应该注册进程信号
def handler(signum, frame):
# loop and handle all socket disconnect
# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
处理此问题的最佳方法是不要强制杀死服务器。相反,处理一个信号,比如SIGINT,并在相应的信号处理程序中断开所有客户机的连接
另一种方法是在数据库中跟踪已连接的客户端(例如,redis)。如果应用程序被终止并重新启动,它可以在启动新服务器实例之前通过这些用户并执行任何必要的清理。处理此问题的最佳方法是不要强制终止服务器。相反,处理一个信号,比如SIGINT,并在相应的信号处理程序中断开所有客户机的连接
另一种方法是在数据库中跟踪已连接的客户端(例如,redis)。如果应用程序被终止并重新启动,它可以在启动新的服务器实例之前通过这些用户并执行任何必要的清理。您能举个例子说明如何将信号处理程序放置在代码库中吗?非常感谢。上的已接受答案显示了如何为SIGINT编写信号处理程序。您能否给出一个示例,说明如何将信号处理程序放置在代码库中?非常感谢。上的已接受答案显示了如何为SIGINT编写信号处理程序。谢谢!我们通常应该把这个放在代码库的什么地方?谢谢!我们通常应该把它放在代码库的什么地方?