Redis PUB / SUB事件何时触发并忘记?

问题描述 投票:0回答:2

Redis事件是一劳永逸的。如果没有人在听,他们将不会被发现。没有历史但是我在互联网上找不到任何可以回答以下问题的东西(我正在使用redis-py和aioredis用于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为我缓存它们?

换句话说,如果我没有连接或有连接,但是是不听,则免除即付即用吗?

python redis ipc redis-py
2个回答
1
投票

正如您提到的,如果您使用的是Redis Pub / Sub,那将是一场大火,并且忘记了,因此您的应用程序必须启动并运行并收听事件。

我不得不说我还没有测试您的用例。

为了您的逻辑,有更多控制权,建议您查看Redis Streams

  • 首先,这不是一劳永逸的发布订阅,而是一种更具弹性的消息传递系统。
  • 您的应用程序将控制要读取的消息,必须读取的消息以及读取时发送的确认。

您的伪代码将很容易在Streams中实现,并且具有更好的控制。


0
投票

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

在您的情况下,客户端(redis-py)侦听与服务器建立连接的网络套接字。套接字本身由操作系统处理,并缓冲传入的消息。只要您继续从套接字中读取消息来耗尽套接字,消息就不会丢失。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.