【问题标题】:Making a zmq server run forever in Django?让 zmq 服务器在 Django 中永远运行?
【发布时间】:2013-10-03 15:30:29
【问题描述】:

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

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

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

我现在在想:

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

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

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

【问题讨论】:

  • 你的第一选择看起来像我要走的路:拥有一个专门的进程来管理 zeromq 套接字(而 Django 进程处理 HTTP 请求)。

标签: python django celery zeromq


【解决方案1】:

设置管理命令是实现此目的的好方法,尤其是当您在自己的硬件上运行时。

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

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

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

【讨论】:

  • 我创建了一个管理命令,在研究了使用 celery 实现它的方法后,我认为这要简单得多。不过感谢云的解释,我可能有一天会使用它!
  • 不需要定期任务。而是设置一个守护进程。这有很多优点,比如使用 pidfile 并通过 Monit 之类的工具对其进行监控。
猜你喜欢
  • 1970-01-01
  • 2014-12-02
  • 2023-03-27
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 2014-11-06
相关资源
最近更新 更多