为什么我订阅某个频道没有错误后,redis 却报告没有订阅者?

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

我正在尝试通过 websockets 发送实时反馈,并且我通过 redis 从 Rest-api 服务器发送数据到 websocker 服务器(均用 python/django 编写)来实现这一点。在 websocket 服务器中,我订阅了一个名为“events”的频道,如下所示:

redis_connection = redis.Redis(
    host=settings.REDIS_HOST,
    port=settings.REDIS_PORT,
    db=settings.REDIS_CACHE_DB,
)
pubsub = redis_connection.pubsub()
pubsub.subscribe(events=process_event)

在rest-api服务器中,我将数据发布到同一个redis通道,如下所示:

connection.publish("events", json.dumps({"user_email": user.email, "message": message}))

在试图找出为什么没有事件到达“process_event”处理程序时,我发现发布方法返回频道的订阅者数量,因此我将该行更新为:

count = connection.publish("events", json.dumps({"user_email": user.email, "message": message}))
print(f"Published to events channel with {count} subscribers")

即使在上述订阅之后,结果始终为 0。当我直接尝试查询订阅者计数时,我进入了 redis-stack Docker 容器,看到了以下内容:

redis-cli

127.0.0.1:6379> PUBSUB NUMSUB 事件

  1. “事件”
  2. (整数)0

127.0.0.1:6379>

redis-stack 本身的日志似乎无法识别任何订阅或发布。但是,如果我使用命令“redis-cli monitor”,我会看到两者都出现:

1727460056.950779 [0 172.17.0.1:58210]“客户端”“SETINFO”“LIB-NAME”“redis-py” 1727460056.952892 [0 172.17.0.1:58210]“客户端”“SETINFO”“LIB-VER”“5.0.8” 1727460056.954072 [1 172.17.0.1:58210]“选择”“1”

1727460056.956442 [1 172.17.0.1:58210]“订阅”“活动”

1727460122.677189 [0 172.17.0.1:45874]“客户端”“SETINFO”“LIB-NAME”“redis-py” 1727460122.678973 [0 172.17.0.1:45874]“客户端”“SETINFO”“LIB-VER”“5.0.8” 1727460122.681286 [1 172.17.0.1:45874]“选择”“1”

1727460122.683120 [1 172.17.0.1:45874] "发布" "事件" "{"user_email": "[电子邮件受保护]", "message": "消息内容"}"

毕竟,PUBSUB NUMSUB 事件仍然给出相同的结果。

python django redis publish-subscribe redis-stack
1个回答
0
投票

所以为什么你没有运行任何事件是因为它不像套接字,你没有收到推送通知,你创建的

pubsub
对象需要拉取消息:
redis_pubsub.get_message()

为什么,你在

NUMSUB
上得到0——我怀疑当你发送消息时你的客户端没有连接。
您有两个进程正在运行,并且当服务进入睡眠状态或被清理时,子客户端将关闭,因为它没有更多任务(如果您稍后不给它任何其他任务,例如检查消息是否到达,它可能会超出范围并被删除)。

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