订阅Django项目中的Redis频道

时间:2019-01-31 16:25:03

标签: django redis microservices publish-subscribe

我有多个用nodejs或python / django或...编写的应用程序 这些服务运行良好。但是需要彼此进行发布/订阅异步通信。

在nodejs中没有问题,可以轻松地将其发布/订阅到任何Redis通道。

问题:我的问题是如何继续订阅Redis频道并接收与其他服务一起发布的数据?

注意:许多链接建议使用Django频道。但是我想那不是做到这一点的方法。如果可以的话,任何人都可以帮助我,并提供有关操作方法的详细信息。

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

真的很感激。

2 个答案:

答案 0 :(得分:1)

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

如果只想发布/订阅。最好的工具是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.')

答案 1 :(得分:1)

为了处理对Redis的订阅,您将需要有一个单独的连续运行的进程(服务器),该进程侦听Redis,然后对您的数据进行处理。 django-channels将通过在worker

中运行代码来完成相同的操作

如上所述,Django通过使用Django management command方法提供了一种方便的方式来运行“服务器”。运行django管理命令时,您具有对代码(即ORM)的完全访问权限。

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

对于Redis消息处理,您可以使用与其配合使用的任何库。例如,aioredisredis-py