草庐IT

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

coder 2023-10-26 原文

我的 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/

有关python - 阻塞直到新的副本集配置到位的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  3. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  4. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  5. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  6. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

随机推荐