让zmq服务器在Django中永远运行?

时间:2013-10-03 15:30:30

标签: python django celery zeromq

我正试图找到让dMango应用程序永久运行zeroMQ监听器的最佳方法。

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

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

我现在在想:

  • 设置一个Django管理命令,它将运行监听器并使其永久保持活动(在zmq监听器代码中也称为无限循环)或

  • 使用芹菜工作者始终保持zmq监听器的活动状态?但我不确定如何让芹菜工人重新启动任务,只有它没有运行。所有芹菜文档都与频率/延迟运行有关。或者也许我应该让芹菜在给定的时间间隔内清除任务。无论如何重启..

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

1 个答案:

答案 0 :(得分:1)

设置管理命令是一种很好的方法,尤其是当您在自己的硬件上运行时。

如果您在云中运行,机器可能会随着您的流程而消失,那么后者是更好的选择。这就是我做到的:

  1. 设置一个每N秒运行一次的定期任务(你需要在某处运行celerybeat)
  2. 当任务产生时,它首先检查共享网络资源(redis,zookeeper或db),以查看另一个进程是否具有活动/有效lease。如果存在,则中止。
  3. 如果没有有效的租约,请获取您的租约(谨防此处的并发!),然后开始无限循环,确保定期续订租约。
  4. 添加检测,以便您知道进程运行的位置。
  5. 在多个盒子上启动芹菜工作者,从同一个队列中消耗您的周期性任务。
  6. 第二种解决方案更复杂,更难以正确;所以,如果可以的话,单身人士很棒并且考虑使用像supervisord这样的东西,以确保如果由于某种原因出现故障,该过程将重新启动。