我的Python Web应用程序有几个连接注册到同一个MongoDb服务器,但有3个不同的数据库.该应用程序由4名Gunicorn工作人员运行.
我正在使用副本集.
当主节点关闭时,当前查询失败并在MongoReplicaSetClient中安排刷新(2.8,但我猜在3.2中它是相同的).如果时间选择了新的主节点,并且MonitorThread获取有关更新客户端连接的信息,则下一个查询可能会成功.
但刷新仅影响此客户端.连接同一MongoDB服务器的其他客户端不受影响 - 每个客户端都会发生相同的故事.这意味着如果每个工作者连接到同一个MongoDB服务器上的3个数据库,并且我重复相同的HTTP请求,当主要服务器失败时使用所有3个数据库,则无限时间更新所有连接的客户端.如果每个HTTP请求循环到4个中的每个工作者,我们需要12个请求来更新每个Mongo客户端.但实际上这些要求并不是循环的.
查看PyMongo代码,
MongoReplicaSetClient._send_message_with_response
我看到当主要关闭时,self.disconnect
调用哪些调用self.__schedule_refresh
.此方法具有参数sync
,允许"阻止直到刷新完成".
我的想法是捕获AutoReconnect
异常并调用__schedule_refresh(sync=True)
连接到故障主节点和块的所有客户端,直到新的副本集配置到位.因此,在数据库正常之前,不会处理HTTP请求(导致500).
但这__schedule_refresh
是一种私人方法.此外,我不知道是否在所有客户端上顺序调用它会很快 - 看起来MonitorThread
它是否间隔工作.
或者也许我可以使用MongoReplicaSetClient.refresh
.
你对这个想法有什么看法?它有缺点吗?
你能帮我实现一下吗?