【问题标题】:Message queues for controlling external python program via Django通过 Django 控制外部 python 程序的消息队列
【发布时间】:2020-07-07 15:43:22
【问题描述】:

我在之前的项目中使用 ZeroMQ 在不同服务器上的两个不同 python 程序之间发送消息。我现在有一个程序,我想使用 Django 作为前端。

在消息队列和 python 上进行大量谷歌搜索,最常见的是 Celery 和 RabbitMQ。但这似乎不是我想要的。 Celery 似乎很适合在 Django 应用程序中生成任务并处理它们并将结果写回 Django。

我正在寻找的是一种解决方案,它允许我在创建或删除新模型项时向其他 python 程序发送消息。当其他 python 程序收到类似的错误时,我想向 Django 发送一条消息并创建一个新的错误模型项。

有什么好办法吗?我能做的是使用不同的技术从 django 发送和接收。我可以将简单的 UDP 发送到我的其他程序,然后通过 HTTP API 将内容发回 django。但我认为拥有某种形式的消息传递系统来处理这个问题并确保消息到达会更好。

【问题讨论】:

  • 是什么阻碍了您继续使用 ZeroMQ?
  • 如何将它集成到 django 中?我是否还需要一个单独的 ZMQ 客户端进程,然后我仍然需要一种将数据发布到 django 的方法。
  • 我从未使用过 ZeroMQ 但 django 只是 python 程序。您如何将数据放入 zeromq 应该是相同的。它可能发生在您的视图函数或其他任何地方。您已经提到使用 API 将数据发回 django,这完全没问题,不是吗?
  • 嗯,其实我检查了一下ZeroMQ,听起来它的级别很低,并且没有交付可靠性。我猜你需要使用 RabbitMQ,它更好地支持排队系统。但是,您仍然可以在 django 中以正常的 python 方式使用它而不会出现问题。
  • 好的。凉爽的。 RabbitMQ 似乎是我应该使用的东西,但大多数信息似乎与芹菜有关。但是我会在哪里把代码放在我的 django 项目中。 zeromq 中的标准方法是创建上下文并将其绑定到地址。然后您需要在发送消息之前稍等片刻,因为在发送消息之前已连接的那些可能没有时间连接。如果您想继续发送消息,请使用 whileloop。在 Django 中是否有一个地方可以在服务器启动时创建上下文和绑定,然后导入对象并调用其函数。

标签: python django rabbitmq zeromq pyzmq


【解决方案1】:

不知道你在哪里卡住了,所以我会尝试涵盖所有内容。

在我目前正在进行的项目中,我们使用 API 和 rabbitmq 来传递消息。

我们有一个 python 非 django 进程在监听 rabbitmq 队列,所以当 Django 需要与它通信时,我们只需将 JSON 格式的消息泵入队列,该进程会提取消息并处理它们。

您实际上可以将 django 模型和其他 API 用于非 django 应用程序。如果这是你想要做的,这里有一个链接开始

http://blog.gabrielsaldana.org/using-django-models-in-external-python-scripts/

我们的其他外部进程需要将信息传回 Django,所以我们只是做了一些 API 端点,外部进程只是使用 HTTP POST 发送数据。

要在每次创建或保存模型时执行操作,您需要查看 Django 信号。

https://docs.djangoproject.com/en/1.9/topics/signals/

如果我仍然遗漏了什么,您需要更好地解释您要解决的问题到底是什么

【讨论】:

  • 感谢您的回答。非常有帮助。我希望我可以在 Django 中处理 rabbitmq 消息的接收,然后做一些事情,比如将数据保存到数据库中。但据我了解,您的意思是最好将队列用于传出消息,并让我的外部进程通过 Django API 侦听消息和来自外部进程的传入消息。在 python 脚本中使用来自 django 的模型似乎很有趣,但我希望选择在不同服务器上分离进程。我不是每次都需要发送消息,所以信号可能有点过分。
  • Django 不是服务器,它完全基于请求-响应事务,因此仅使用 django 持续监听消息是不可行的。如果您想进行异步处理,Celery 与 django 集成得很好,因此您可以让外部进程调用 django API 并将 django 卸载任务到 celery。同样,我不确定您要解决的实际问题是什么,所以我的建议不能更具体。
  • 没关系。您的意见帮助很大。 :) 我的外部 python 程序现在是一个简单的应用程序,可以从简单的 GPRS 调制解调器写入和读取 TCP 套接字。 I. 我想控制调用哪些调制解调器,并能够停止读取某些套接字并重新启动它们。然后我想添加统计信息和错误日志,因此与 web 应用程序接口似乎是一个不错的方法。一直在研究 Rail 来做 web 应用程序,但是因为我喜欢 Python,所以我决定改为学习 Django。其他应用程序将连接到网络应用程序。
  • 好吧,您的外部进程可以通过标准 HTTP 请求向 django 发送统计数据,因为 django 已经使用 HTTP 并且 python 标准库包括对发出 HTTP 请求的支持。至于 django 与外部进程对话,有很多方法可以做到这一点。如果你已经在做普通的网络套接字,你可以在你的外部进程中启动一个套接字服务器,并通过套接字与其通信。您可以使用 python 标准库中的 HTTP 服务器,也可以让 django 谈论 HTTP。如果您希望发送大量消息并且顺序对您很重要,您可以使用像 rabbitmq 这样的队列服务器。
猜你喜欢
  • 1970-01-01
  • 2021-08-23
  • 2020-11-17
  • 2011-08-27
  • 2023-03-04
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 2018-07-10
相关资源
最近更新 更多