【问题标题】:Subscribe to a redis channel in Django project订阅 Django 项目中的 redis 频道
【发布时间】:2019-01-31 16:25:02
【问题描述】:

我有多个使用 nodejs 或 python/django 或 ... 这些服务运行良好。但需要彼此进行 pub/sub 异步通信。

在 nodejs 中没有问题,并且可以轻松地发布/订阅到任何 redis 频道。

问题:我的问题是如何持续订阅redis频道并接收其他服务发布的数据?

注意:许多链接建议使用 django-channels。但我想这不是这样做的方法。如果是这样,任何人都可以帮助我并详细说明如何操作。

更新: 默认情况下,Django 不像 nodejs 那样基于事件。因此,如果我使用 redis 客户端,我应该例如每秒检查一次 redis 并查看是否发布了任何内容。我认为在 python 中仅使用一个 redis 客户端就足够了。

真的很感激。

【问题讨论】:

  • 为什么不在 python django 中使用 Redis Pub/Sub。我的意思是,为什么你不能在 django 中使用 Redis?从 NodeJS 订阅频道?
  • 我还没有工作。但是使用django-celerylink 可能是异步发布/订阅任务的不错选择。
  • 问题是 django 不是基于事件的。如果我想拥有类似 nodejs 的性能,我应该使用 django 的实时框架。像扭曲一样。
  • 我确实使用过 django-celery。但它更像是一个任务队列。我认为这不是我的问题的确切解决方案。

标签: django redis microservices publish-subscribe


【解决方案1】:

有很多选择。如果您有FIFO 问题,您必须使用队列才能将一个微服务连接到另一个。对我来说,如果你没有大数据问题可以使用RabbitMQ,它非常实用非常有效,否则如果你有大数据问题可以使用Kafka。服务种类繁多。

如果您只想要 Pub/Sub。最好的工具是 Redis,它非常快速且易于集成。如果您担心如何在 Python 中实现它,请查看article

[更新]

可以在 django 中创建 manage.py 命令并订阅该管理文件中的 redis 并执行与 django 服务器分开的此脚本:

class Command(BaseCommand):
def handle(self, *args, **options):

    r = redis.StrictRedis(host='localhost', port=6379, db=1)
    p = r.pubsub()
    p.psubscribe('topic.*')
    for message in p.listen():
        if message:
            print('message received, do anything you want with it.')

【讨论】:

  • 所以你说我应该在我的django应用程序旁边运行一个python脚本,它总是听redis。但我想念 django 的 ORM 功能。如果我在 django 中创建一个 manage.py 脚本并查找在 redis 上发布的任何内容怎么办?
  • 也是一种选择。我假设您也可以使用Django Redis Pub/Sub 库。
  • 不,这不是我想要的。我只想要一个带有 redis for django 的简单 pub/sub 解决方案。
【解决方案2】:

为了处理对 redis 的订阅,您需要有一个单独的持续运行的进程(服务器)来监听 redis,然后使用您的数据进行处理。 django-channels 将通过在 worker 中运行代码来做同样的事情

如上所述,Django 通过使用Django management command 方法提供了运行“服务器”的便捷方式。运行 django 管理命令时,您可以完全访问您的代码,即也可以访问 ORM。

只有您提到的Async 通信的细节。这里需要考虑到 Django 的 ORM 是严格的同步代码,并且需要注意如何将 ORM 与异步代码一起使用。可能你需要在这里澄清async 是什么意思。

至于 redis 消息处理,您可以使用任何与它一起工作的库。例如,aioredisredis-py

【讨论】:

    猜你喜欢
    • 2016-05-22
    • 2022-08-09
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2012-06-12
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多