可扩展的有状态python RabbitMQ使用者的设计

时间:2018-11-23 17:15:09

标签: python multithreading rabbitmq multiprocessing

我正在实施由Cloud Foundry上的多个应用程序组成的自然语言处理产品。 这些应用程序占用大量CPU(而不是I / O占用大量资源),通过RabbitMQ进行通信,并且大多数是在Python3中开发的。

  • 这些Python3应用程序之一[1]消耗了兔子队列,并仅根据接收到的消息的有效负载执行给定任务。 此有效负载是独立的,即包含应用程序执行其工作所需的所有信息。

  • 另一个应用程序[2]需要等待满足特定条件:例如,它首先需要接收一条有关“ topic1”的消息,然后接收一条有关“ topic2”的消息,然后该应用程序才能执行其工作。该处理将利用两条消息中的两个有效载荷。

现在的问题是如何确保可以同时放大[1]和[2]以跟上消息量的增加。

  • 对于[1],应该足以多次部署相同的应用程序(即,多个工作程序),并让每个人以循环方式使用相同的队列。
  • 对于[2],应保持状态(即看到的消息),因此仅采用与上述相同的方法是不够的。这是因为有关“ topic1”的消息可以由第一工作人员处理,有关“ topic2”的消息可以由第二工作人员处理,并且在没有其他数据结构的情况下,每个工作人员都不知道另一条消息。

因此,对于[2],我可以看到两个选项:

  • 使用多处理(由于在多个Python运行时中发现了GIL,因此不使用多线程):[2]的单个工作线程消耗了Rabbit队列,每条消息被分派到不同的进程。 有状态性是通过在不同进程之间共享的线程安全的内存中数据结构来实现的。在这种情况下,并行性对Rabbit是透明的。
  • 使用外部存储(例如Redis或SQL db):[2]的多个工作程序以循环方式使用队列,但是共享相同的存储(与上面的内存中数据结构相似的作用)。 在这种情况下,兔子知道并行性,因为队列将有多个使用者。

消息主要由纯文本和序列化的numpy 300维单词嵌入组成。 每秒可能达到约1万条消息。处理将由运行的神经网络或NLP库组成。

关于如何最好地实现可伸缩体系结构的任何建议?

0 个答案:

没有答案