war*_*iuc 5 python mongodb pymongo
我的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.
你对这个想法有什么看法?它有缺点吗?
你能帮我实现一下吗?
有趣的问题。
如果您在有大量请求传入的环境中运行,我建议不要在 IO 上设置任何工作块,尤其是等待主节点出现之类的网络调用。
我建议尝试从 mongo 客户端捕获异常,这些异常可能表明服务器已关闭并向调用者返回 503。503 通常是传达资源不可用并建议稍后重试的好方法。
您的 mongo 数据库将在使用过程中关闭,让应用程序服务器检测到这一点,转储请求并返回 503 是处理流量的一种方法,否则流量将开始阻塞,耗尽线程并终止应用程序服务器。让应用程序服务器放弃所有这些会导致等待和可能失败的调用。
这是 REST 服务中使用的常见习惯用法:http://www.restpatterns.org/HTTP_Status_Codes/503__-_Service_Unavailable
您甚至可以添加“Retry-After”标头来指示客户端将来何时应尝试重试。有关 Retry-After 标头以及某些浏览器如何解释它的更多信息:
华泰
| 归档时间: |
|
| 查看次数: |
55 次 |
| 最近记录: |