Redis Pub/Sub Ack/Nack

Redis Pub/Sub Ack/Nack

RedisPub/Sub中有致谢的概念吗?

例如,当使用 RabbitMQ 时,我可以在不同的机器上有两个工人 运行,当我向队列发布一条消息时,只有一个工人会 ack/nack 它并处理消息。

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

考虑这个简单的例子,我在两个不同的 machines/clients:

上有这个 go routine 运行ning
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")

两个 go routines 都会接收它和 运行 process 函数。

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

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

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

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

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

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