微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何总是优雅地断开服务器杀死套接字?

如何解决如何总是优雅地断开服务器杀死套接字?

在flask socketio应用中,我们有一个socket.on("disconnect"),每当套接字客户端断开连接时,就会调用contest来处理数据库状态更新。但是,当我们的服务器由于重启或崩溃而被杀死时,将无法调用此断开连接功能(因为该服务器暂时不存在),并被丢弃。当服务器备份时,与每个前端断开的所有套接字断开连接都无法正确处理,因此状态不一致。

有没有一种方法可以“缓存”这些断开连接的事件,以便在服务器备份时运行?最终目标是理想地使所有插座也自动重新连接,但是目前我们先断开连接,然后手动重新连接。我们的设置是将Gunicorn烧瓶线程与Nginx进行负载均衡,并使用带有烧瓶套接字io的redis事件队列。

解决方法

您应该注册过程信号

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)。如果该应用程序被杀死并重新启动,它可以通过这些用户并在启动新服务器实例之前执行所有必要的清理。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。