如何总是优雅地断开服务器kill上的套接字?

lo8azlld  于 2021-06-09  发布在  Redis
关注(0)|答案(2)|浏览(339)

在我们的flask socketio应用程序中,我们有一个 socket.on("disconnect") 每当socket客户机断开连接时调用,以处理db状态更新。但是,当我们的服务器由于重启或崩溃而被终止时,这个断开连接函数不能被调用(因为服务器暂时不存在),并且被丢弃。当服务器备份时,所有与每个前端的套接字断开连接都无法正确处理,因此状态不一致。
有没有办法“缓存”这些断开连接事件,以便在服务器备份时运行?最终目标是让所有的套接字都能自动重新连接,但目前我们先断开连接,然后再手动重新连接。我们的设置是gunicorn flask线程是nginx负载平衡的,带有flask socket io的redis事件队列。

o3imoua4

o3imoua41#

你应该注册进程信号

def handler(signum, frame):
    # loop and handle all socket disconnect

# Set the signal handler and a 5-second alarm

signal.signal(signal.SIGALRM, handler)
6ju8rftf

6ju8rftf2#

处理这个问题的最好方法是不要强制杀死你的服务器。相反,处理sigint之类的信号,并断开相应信号处理程序中的所有客户机的连接。
另一种方法是在数据库中跟踪连接的客户机(例如redis)。如果应用程序被终止并重新启动,它可以在启动新的服务器示例之前检查这些用户并执行任何必要的清理。

相关问题