Redis PUB/SUB活动何时启动并忘记?

2024-05-28 20:28:04 发布

您现在位置:Python中文网/ 问答频道 /正文

Redis事件是“火与忘”。如果没有人在听,他们就不会被发现。没有历史。但在互联网上,我没有找到任何能回答以下问题的答案(我正在使用redis py和aioredis for python):

代码是否确实需要侦听事件才能接收它,或者redis连接是否会为我缓存事件

假设我有一个循环:

redis_db = Redis(...)

while True:
    print("Hey, I'm listening now!")
    msg = redis_db.blocking_subscribe("some_topic") # pseudo-code, because I'm using various libraries
    if msg == "calc":
        do_a_heavy_5_seconds_calculation()
        print("YAY, I was busy and am back up now!")

那么,我会错过5s计算中发生的所有事件,还是我的redis_db会为我缓存它们

换句话说。。。如果我没有连接,或者如果我有连接,但是没有在听,那么触发并忘记是否适用


Tags: 答案代码pyredisfordb事件msg
3条回答

“触发并忘记”适用于服务器与客户端的合同。这意味着,假设客户端已连接,则消息将只发送一次。如果消息在网络中丢失,并且永远无法到达客户端,则仅此而已。如果消息到达客户机,并且客户机进程/服务器在读取之前崩溃,那么就是这样

在您的例子中,客户机(redis py)侦听与服务器建立连接的网络套接字。套接字本身由操作系统处理,并缓冲传入的消息。只要您通过读取套接字来不断排空,消息就不会丢失

正如您所提到的,如果您使用的是Redis Pub/Sub,那么这是一个火灾和遗忘,因此您的应用程序必须启动并运行,并侦听事件

我必须说我还没有测试过你的用例

对于你的逻辑,为了有更多的控制,我建议你看看Redis Streams

  • 首先,这不是一个一劳永逸的发布-订阅系统,而是一个更具弹性的消息传递系统
  • 应用程序将控制要读取、必须读取的消息,并在读取时发送ack

您的伪代码将很容易用流实现,并具有更好的控制

两者兼而有之。您需要一个连接,并且该连接必须处于“订阅”状态。一旦执行“blocking_subscribe”方法,您就有效地将该连接状态更改为“subscription state”,因此无论您的python线程是否同时忙于处理其他消息,redis都将继续为您缓冲这些消息。当然,如果它由于任何原因崩溃,那么连接服务器端缓冲区将丢失

相关问题 更多 >

    热门问题