1

我试图找出让 zeroMQ 侦听器在我的 django 应用程序中永久运行的最佳方法。

我在我的 Django 项目中设置了一个 zmq 服务器应用程序,它充当我们网络中其他应用程序的内部 API(不需要通过 http/requests 的东西,因为这些应用程序是内部的)。我希望我的 django 项目中的 zmq 侦听器始终处于活动状态。

我想要我的 Django 项目中的 zmq 监听器,所以我可以访问所有项目模型(用于查询)和其他 django 上下文内容。

我目前在想:

  • 设置一个 Django 管理命令,它将运行侦听器并使其永远保持活动状态(也就是 zmq 侦听器代码中的无限循环)或

  • 使用芹菜工人始终保持 zmq 监听器活着?但我不完全确定如何让芹菜工人重新启动一项任务,除非它没有运行。所有 celery 文档都是关于频率/延迟运行的。或者也许我应该让 celery 在给定的时间间隔内清除任务并重新启动它。

关于性能影响或替代方法的任何提示、建议?

4

1 回答 1

1

设置管理命令是执行此操作的好方法,尤其是在您在自己的硬件上运行时。

如果您在云中运行,其中一台机器可能会随着您的进程一起消失,那么后者是一个更好的选择。这就是我的做法:

  1. 设置每 N 秒运行一次的周期性任务(您需要在某处运行 celerybeat)
  2. 当任务产生时,它首先检查共享网络资源(redis、zookeeper 或 db),以查看另一个进程是否具有活动/有效租约。如果存在,则中止。
  3. 如果没有有效的租约,获取你的租约(注意这里的并发!),并开始你的无限循环,确保你定期更新租约。
  4. 添加检测,以便您知道谁、在哪里运行进程。
  5. 在多个盒子上启动 celery workers,从你的周期性任务指定的同一个队列中消费。

第二种解决方案更复杂,更难做对;因此,如果可以的话,单例很好,并考虑使用类似 supervisord 的东西来确保进程在由于某种原因出现故障时重新启动。

于 2013-10-04T18:59:21.460 回答