【问题标题】:How to get messages published to Redis before subscribing to the channel如何在订阅频道之前获取发布到 Redis 的消息
【发布时间】:2018-10-28 04:39:02
【问题描述】:

我正在编写一个应用程序来获取发布到 Redis 中的通道的消息并进行处理。这是一个长期存在的应用程序,基本上从不收听频道。

def msg_handler():
    r = redis.client.StrictRedis(host='localhost', port=6379, db=0)
    sub = r.pubsub()
    sub.subscribe(settings.REDIS_CHANNEL)
    while True:
        msg = sub.get_message()
        if msg:
            if msg['type'] == 'message':
                print(msg)
def main():

    for i in range(3):
        t = threading.Thread(target=msg_handler, name='worker-%s' % i)
        print('thread {}'.format(i))
        t.setDaemon(True)
        t.start()
    while True:
        print('Waiting')
        time.sleep(1)

当我运行这个程序时,我注意到它没有收到在程序启动之前发布到频道的消息。在应用订阅频道后,将消息发送到频道可以正常工作。

在制作中,很可能在节目开始之前,频道中就有一些消息。有没有办法获取这些旧消息?

【问题讨论】:

  • sn-p 没有运行,因为缺少必要的东西。什么是settings.REDIS_CHANNEL?。您启动了三个侦听器,但从不发送消息。你能模拟填充的 REDIS_CHANNEL 吗?
  • 消息的producerconsumer 不在同一个应用程序中是很正常的,这正是这里的情况。我没有包含代码发布消息,因为它工作得很好。而REDIS_CHANNEL 显然只是一个常数。为什么重要?
  • 因为我无法重现您的问题。您可能想深入研究 pubsub 的代码,以找出您没有收到消息的原因。
  • @Christoph 如果您在订阅之前发布并且仍然收到消息,我会感到惊讶。当我阅读更多关于此的内容时,似乎 Redis 没有 Guarantee delivery,这意味着“如果在发布发生时订阅者没有在监听,则该订阅者的事件将丢失。”根据link

标签: python redis publish-subscribe


【解决方案1】:

Redis PUB/SUB 不存储已发布的消息。它将他们发送给当时正在听的人。如果您需要访问旧消息,您可以:

  1. 使用Redis Streams。它们现在处于测试阶段,即将推出第 5 版。
  2. 使用另一个 PUBSUB 系统,例如nats.io

【讨论】:

  • 在这种情况下,RabbitMQ 会是更好的选择吗?
  • 我自己不使用 RabbitMQ,但是根据这个问题:stackoverflow.com/questions/33546568/… RabbitMQ 可以配置为获取 prevoius 消息。我知道这能走多远。在 nats-streaming 中,你有很多控制权。
猜你喜欢
  • 2012-06-12
  • 1970-01-01
  • 2011-12-31
  • 2021-05-30
  • 2015-03-01
  • 2016-04-18
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
相关资源
最近更新 更多