Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 阻止,直到新的副本集配置就位_Python_Mongodb_Pymongo - Fatal编程技术网

Python 阻止,直到新的副本集配置就位

Python 阻止,直到新的副本集配置就位,python,mongodb,pymongo,Python,Mongodb,Pymongo,我的Python web应用程序在同一个MongoDb服务器上注册了几个连接,但有3个不同的数据库。该应用程序由4名Gunicorn工作人员运行 我使用的是复制集 当主服务器关闭时,当前查询失败,并在MongoReplicaSetClient中计划刷新(2.8,但我猜在3.2中是相同的)。如果此时选择了一个新的主线程,并且MonitorThread获取更新客户端连接的信息,则下一个查询可能会成功 但是刷新只影响这个客户端。连接到同一MongoDB服务器的其他客户端不受影响——每个客户端的情况都是

我的Python web应用程序在同一个MongoDb服务器上注册了几个连接,但有3个不同的数据库。该应用程序由4名Gunicorn工作人员运行

我使用的是复制集

当主服务器关闭时,当前查询失败,并在MongoReplicaSetClient中计划刷新(2.8,但我猜在3.2中是相同的)。如果此时选择了一个新的主线程,并且MonitorThread获取更新客户端连接的信息,则下一个查询可能会成功

但是刷新只影响这个客户端。连接到同一MongoDB服务器的其他客户端不受影响——每个客户端的情况都是一样的。 这意味着,如果每个worker连接到同一MongoDB服务器上的3个数据库,并且我在重复相同的HTTP请求,该请求在主服务器出现故障时使用所有3个数据库,那么更新所有连接的客户端将花费无限长的时间。如果每个HTTP请求对4个工作进程中的每个工作进程进行循环,那么我们需要12个请求来更新每个Mongo客户端。但实际上,这些请求并不是循环的

查看PyMongo代码 我看到,当主电源关闭时,
self.disconnect
被调用。此方法具有参数
sync
,该参数允许“在刷新完成之前阻止”

我的想法是在连接到故障主服务器的所有客户端上捕获
AutoReconnect
异常并调用
\u schedule\u refresh(sync=True)
,直到新的副本集配置就位为止。因此,在数据库正常之前,不会处理HTTP请求(导致500个请求)

但是,
\u计划\u刷新
是一种私有方法。另外,我不知道在所有客户机上顺序调用它是否会很快——看起来,
MonitorThread
会每隔一段时间执行它的工作

或者我可以用

你觉得这个主意怎么样?它有缺点吗

你能帮我实现吗?

有趣的问题

如果您运行的环境中有大量请求传入,我建议不要在IO上设置任何工作程序块,尤其是在等待主进程的网络调用中

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

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

这是REST服务中使用的一个常见习惯用法:

您甚至可以添加一个“Retry After”(重试之后)标题,以指示客户端将来何时应尝试重试。有关Retry After标头以及某些浏览器如何解释它的更多信息: