Redis Pub / Sub Ack / Nack

时间:2015-08-16 17:11:03

标签: go redis publish-subscribe

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

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

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

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

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")

两个例程都将接收它并运行过程函数。

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

Redis流(现在是Redis 5.0)支持对由组完成的任务的确认。

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