【问题标题】:Redis Pub/Sub Ack/NackRedis Pub/Sub Ack/Nack
【发布时间】:2015-11-09 08:20:03
【问题描述】:

Redis Pub/Sub 中有确认的概念吗?

例如,当使用 RabbitMQ 时,我可以让两个工作人员在不同的机器上运行,当我将消息发布到队列时,只有一个工作人员会确认/确认并处理消息。

但是我发现使用 Redis Pub/Sub,两个工作人员都会处理消息。

考虑这个简单的例子,我在两台不同的机器/客户端上运行这个 go 例程:

go func() {
    for {
        switch n := pubSubClient.Receive().(type) {
        case redis.Message:
            process(n.Data)
        case redis.Subscription:
            if n.Count == 0 {
                return
            }
        case error:
            log.Print(n)
        }
    }
}()

当我发布消息时:

conn.Do("PUBLISH", "tasks", "task A")

两个 goroutine 都会接收到它并运行 process 函数。

有没有办法实现与 RabbitMQ 类似的行为?例如。第一个确认消息的工作人员将是唯一接收并处理消息的工作人员。

【问题讨论】:

    标签: go redis publish-subscribe


    【解决方案1】:

    Redis PubSub 更像是一种广播机制。

    如果你想要队列,你可以使用BLPOP 和RPUSH 来获得相同的交互。请记住,RabbitMQ 做了 Redis 中不存在的各种其他事情。但是,如果您正在寻找简单的作业调度/请求处理方式,这将很好。

    【讨论】:

    • 谢谢。这就是我最终使用的,按预期工作。对于那些不/不能在我的库中使用 RabbitMQ 但 AMQP 是标准的人,我只需要将其作为代理的额外选项。
    【解决方案2】:

    不,Redis 的 PubSub 不保证交付,也不限制可能收到消息的订阅者的数量。

    【讨论】:

    • 谢谢。我想我应该坚持使用 RabbitMQ。
    • 授予 - 您还应该查看 Redis 的创建者 (Salvatore Sanfilippo) 的最新项目 Disque,该项目完全适合您的需求(即分布式消息队列):github.com/antirez/disque
    • 它似乎还没有准备好生产。但是是的,我知道disque。
    • @RichardKnop 他们对 Linux 也这么说 ;)
    【解决方案3】:

    Redis 流(现在使用 Redis 5.0)支持在一组任务完成时确认任务。

    https://redis.io/topics/streams-intro

    【讨论】:

      猜你喜欢
      • 2019-11-29
      • 1970-01-01
      • 2016-01-18
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      相关资源
      最近更新 更多