【问题标题】:High availability for Python's asyncioPython 的 asyncio 的高可用性
【发布时间】:2015-03-25 09:47:44
【问题描述】:

我正在尝试使用 Python 的 asyncio 模块创建一个异步应用程序。但是,我可以在文档中找到的所有实现都基于单个事件循环。

有什么方法可以启动多个运行同一个应用程序的事件循环,从而实现高可用性和容错?换句话说,我想通过插入新节点来横向扩展我的应用程序,这些节点将在负载均衡器后面共享协同程序的执行。

我知道异步编程和线程安全之间存在一个固有的问题,也许我的想法甚至是不可能的。如果是这样,如何在异步架构上避免这种 SPOF?

【问题讨论】:

  • 你说的是抽象网络代码还是像aiohttp这样的特定网络服务器?
  • 你可以运行多个事件循环,但我猜你可能想运行你的 asyncio 程序的多个实例并使用 nginx 或其他一些网络服务器来对它们进行负载平衡。如果那是您正在寻找的东西,我认为您可以获得有关 serverfault 的帮助
  • 我相信建议是每个进程一个事件循环。如果单个事件循环进程受计算约束,您可以将其克隆到在其他内核上运行的其他进程,正如@leech 建议的那样,但您最好只分出计算任务。我相信 asyncio 有一个多处理接口,我现在还没有看过。
  • @TerryJanReedy 用于处理多个进程的唯一内置接口是BaseEventLoop.run_in_executor,使用ProcessPoolExecutor 作为执行器。

标签: python python-3.x asynchronous python-asyncio


【解决方案1】:

处理这个问题的标准方法是启动多个服务器进程(每个都有自己的事件循环),前面有一个负载平衡器。每个此类进程通常不能使用多个 CPU 内核,因此您可能希望拥有与内核一样多的进程。

【讨论】:

  • 您可能需要与内核一样多的进程。 1:1 的比例假设每个进程都完全受 CPU 限制。
  • 如果 IO 是异步的,那么进程确实应该是 CPU 绑定的。您是否有数据表明情况并非如此? (很有可能,我并没有在现实的生产场景中真正验证这一点)
  • 谢谢,我同意这是要走的路,特别是考虑到我正在考虑使用微服务架构。通过使用 Docker,并且可能拥有数十个微服务容器,1:1 的比例是不可能的,但我同意@acjay。我们可能会受 CPU 限制(考虑异步 IO),但也许因为每个容器代表系统的很小一部分,我们可能会很高兴......好吧,这当然是另一个需要涵盖并进行一些基准测试的主题。无论如何,感谢您的宝贵时间!
【解决方案2】:

我以前做过。我什至编写了代码来监控我产生的进程。但事实证明 Python 和 asyncio 本身就相当稳定,我从未见过停止整个事件循环的严重错误。因此,我不建议仅出于高可用性的目的而生成多个进程。

如果你有兴趣,代码在这里:https://github.com/l04m33/shinpachi

您可能想查看shinpachi/__init__.pyshinpachi/processes.py

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 2015-09-30
    • 1970-01-01
    • 2018-01-11
    • 2016-04-21
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多