如何正确阅读和处理现有Flask应用程序的NSQ消息?

时间:2018-02-20 17:26:45

标签: python multithreading flask tornado pynsq

所以我的问题是:

  1. 我现有Flask应用程序,它有几个Celery周期性任务(因此运行Flask应用程序和运行任务的Celery工作程序)。
  2. 现在我们的基础架构出现了NSQ和第三个将消息推送到NSQ的应用程序,所以我必须向现有的Flask应用程序添加功能,这些应用程序可以从NSQ读取这些消息并做一些工作(可能在DB中创建实体或启动Celery任务)

    1. 我查看了pynsq官方客户端,它基于tornado.IOLoop,所以它要求IOLoop一直启动,文档中的示例运行良好,但我不知道如何在一个帖子中运行带有现有Flask应用程序的Reader。

    2. 我查看了基于gevent的广告gnsq库,似乎可以在单独的帖子中启动其阅读器。

    3. 我认为可行的方法可以做到:

      1. 可能在单独的线程中运行Reader(run_forever),所以当Reader发现消息时 - 我可以将一些工作委托给启动on_message事件的回调处理函数。

      2. 当我可以从队列中读取消息并处理它时,可能存在这种方式,例如从Celery任务中,我在30秒内运行一次。但我无法找到,当我看到无限循环并读取消息时,我看到的所有库都提供了长轮询方式。

      3. 创建单独的应用程序,负责从NSQ读取消息并重新使用现有Flask应用程序中的一些代码。 (或者只是将该应用程序从NSQ的“门户”应用到我的Flask应用程序中。)

      4. P.S。当Flask应用程序启动时,我尝试在线程中启动Reader,我在gnsq库中取得了一些成功,它的Reader连接到NSQ,并且在消息上运行处理程序的代码,但是使用基于IOLoop的pynsq - 当我是试图在线程中运行nsq.run()失败,似乎我不能在主线程中运行“pynsq”nsq.run())

        请指出我正确的方向,我有点困难如何正确使用它。

        P.S。也许有人可以给我建议从同步代码中读取来自NSQ的消息的正确方法,我的意思是例如当一些代码在celery任务中启动时,在那段代码中我可以以某种方式读取和处理NSQ消息吗?

0 个答案:

没有答案