我有多个用nodejs或python / django或...编写的应用程序 这些服务运行良好。但是需要彼此进行发布/订阅异步通信。
在nodejs中没有问题,可以轻松地将其发布/订阅到任何Redis通道。
问题:我的问题是如何继续订阅Redis频道并接收与其他服务一起发布的数据?
注意:许多链接建议使用Django频道。但是我想那不是做到这一点的方法。如果可以的话,任何人都可以帮助我,并提供有关操作方法的详细信息。
更新: 默认情况下,Django不是像nodejs那样基于事件的。因此,如果我使用redis客户端,则应该每秒检查一次redis,看看是否发布了任何内容。我认为在python中仅使用redis客户端是不够的。
真的很感激。
答案 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消息处理,您可以使用与其配合使用的任何库。例如,aioredis
或redis-py