【问题标题】:Pub/Sub Redis, can I monitor whether any published messages are consumed?Pub/Sub Redis,能否监控已发布的消息是否被消费?
【发布时间】:2015-04-01 01:53:45
【问题描述】:

我有一个通过不同主题发布消息的 redis 实例。与其实现复杂的心跳机制(很复杂,因为如果消息没有被消费,实例会在一段时间后停止发布消息),有没有办法检查 pubs 是否被任何人消费?

例如,实例RedisServertopic1topic2 发布消息。 RedisClient1 订阅 topic1RedisClient2 订阅 topic2。当RedisClient2 出于某种原因停止使用topic2 的消息时,我希望RedisServer 知道它并决定何时停止向topic2 发布消息。 topic2 消费的终止是不可预测的,因此我无法通知 RedisServer 终止/取消订阅。

我想如果有办法让 redis 实例知道某个主题的消息是否被消费,那么这将是非常有用的信息。

知道这是否可能吗?

【问题讨论】:

    标签: c# redis publish-subscribe stackexchange.redis


    【解决方案1】:

    鉴于您使用的是最新版本的 redis (> 2.8.0),这两个命令可能会对您有所帮助:

    PUBSUB CHANNELS [pattern]
    

    列出与模式匹配的当前活动频道(= 至少有一个订阅者的频道)。

    PUBSUB NUMSUB [chan1 ... chanN]
    

    返回指定频道的订阅者数量(但不适用于模式)。

    注意:这两种解决方案都无法让您确定消息是否已被真正处理!如果您需要了解任务的完成情况(如果您的消息正在触发某些事情),那么我建议您搜索一个完整的作业队列(例如 Resque,如果您想坚持使用 Redis)


    编辑:这是 Redis 文档。以上所有:http://redis.io/commands/pubsub

    【讨论】:

    【解决方案2】:

    您也可以使用 PUBLISH 的结果。它会给你收到消息的订阅者数量:http://redis.io/commands/publish

    这样您就不需要轮询 PUBSUB 命令,只需在发布消息后执行“停止发布”消息逻辑即可。

    您最多只发布一条没有人订阅的消息。

    【讨论】:

    • 我不知道,这更好,更容易处理。您是否知道该计数是否包括订阅了与发送 Publish 的主题匹配的模式的那些?
    • 它应该包括模式订阅。但是您仍然需要不时从我的答案中轮询方法,以便知道何时可以再次“发布”(这是必需的)
    • 顺便说一句。正如您似乎使用 Stackexchange.Redis,它的 Publish 方法返回订阅者的数量
    • @pysco68,我的理解是这就是 João Parreira 所说的,即 Publish 方法返回订阅者的数量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2011-11-04
    • 2021-08-01
    • 2013-10-17
    • 2020-09-28
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多