gpt4 book ai didi

python - 阻塞直到新的副本集配置到位

转载 作者:可可西里 更新时间:2023-11-01 09:06:25 26 4
gpt4 key购买 nike

我的 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 是一个私有(private)方法。我也不知道在所有客户端上按顺序调用它是否会很快——看起来 MonitorThread 是按时间间隔工作的。

或者也许我可以使用 MongoReplicaSetClient.refresh .

你觉得这个想法怎么样?它有缺点吗?

你能帮我实现吗?

最佳答案

有趣的问题。

如果您在一个有大量请求传入的环境中运行,我建议反对让任何工作人员阻止 IO,尤其是像等待这样的网络调用让小学上来。

我建议尝试从您的 mongo 客户端捕获可能表明服务器已关闭的异常,并将 503 返回给调用者。 503 通常是传达资源不可用并建议稍后重试的好方法。

您的 mongo 数据库在使用过程中停机,让应用服务器检测到这一点,转储请求并返回 503s 是一种处理流量的方法,否则流量将开始阻塞、线程耗尽并终止应用服务器。让应用服务器摆脱所有这些会导致等待和可能失败的调用。

这是 REST 服务中常用的习惯用法:http://www.restpatterns.org/HTTP_Status_Codes/503_-_Service_Unavailable

您甚至可以添加“Retry-After” header 以指示客户端将来何时应尝试重试。有关 Retry-After header 以及某些浏览器如何解释它的更多信息:

Retry-after HTTP response header - does it affect anything?

HTH

关于python - 阻塞直到新的副本集配置到位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34632127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com