实现Redis点对点队列,保证任何消费者对消息处理一次。

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

Redis对PUBSUB有很好的实现,在一个通道上发布的消息会被为该主题注册的多个接收者接收。

什么是实现点对点(即队列)语义的理想方式,例如,多个接收者注册在一个队列中,一旦消息被推送到队列中,它将被只有一个接收者(监听器)处理?任何Java参考例子都会有帮助。

这里的想法是读取一个包含事务记录的巨大文件,因此每个事务应该只被处理一次。

我可以看到Redis Streams是建议的,但我没有看到一个完善的Java参考实现。

redis middleware spring-data-redis
1个回答
0
投票

只要使用 LPUSH msgqueue 把项目放在列表中,让所有的客户端都这样做。

while running
    BRPOP msgqueue
    # process popped item
done

0
投票

请注意,没有像PUBSUB主题那样直接实现。在这里使用队列的另一个原因是,在Publish Subscribve中没有Durable Subscription,也就是说,当订阅者在发送消息的时候没有起床,你的消息就会丢失,但下面的队列实现可以节省一点时间。最终答案

LPUSH TEST_QUEUE 测试信息LLEN TEST_QUEUEBRPOP TEST_QUEUE 0

Java实现

while(true){
redisTemplate.opsForList().leftPop("TEST_QUEUE",0, TimeUnit.SECONDS);
int keySize =this.pushOperation.size("TEST_QUEUE"); 
//iterate keySize {
redisTemplate.opsForList().leftPop("TEST_QUEUE",0, TimeUnit.SECONDS);
}
}
© www.soinside.com 2019 - 2024. All rights reserved.