实现Redis点对点队列,保证消息任意一个消费者处理一次
Implement Redis point-to-point queue to guarantee message processing once by any consumer
Redis 对 PUBSUB 有很好的实现,其中发布在频道上的消息将被为该主题注册的多个接收者接收。
实现点对点(即队列)语义的理想方式是什么?多个接收者在一个队列中注册,一旦消息被推送到队列,它将仅由 1 个接收者(侦听器)处理?任何 Java 参考示例都会有所帮助。
这里的想法是读取一个包含交易记录的大文件,因此每个交易应该只处理一次。
我可以看到建议使用 Redis Streams,但我没有看到合理的 Java 参考实现
只需使用 LPUSH msgqueue
将项目放入列表并让所有客户执行:
while running
BRPOP msgqueue
# process popped item
done
请注意,没有像 PUBSUB 主题那样的直接实现。在这里使用 Queue 的另一个原因是 Publish Subscribve 中也没有持久订阅,即当订阅者未启动时发送消息时您的消息将丢失。但下面的队列实现会在这里节省一点。
最终答案
LPUSH TEST_QUEUE 测试消息
伦 TEST_QUEUE
BRPOP 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);
}
}
Redis 对 PUBSUB 有很好的实现,其中发布在频道上的消息将被为该主题注册的多个接收者接收。
实现点对点(即队列)语义的理想方式是什么?多个接收者在一个队列中注册,一旦消息被推送到队列,它将仅由 1 个接收者(侦听器)处理?任何 Java 参考示例都会有所帮助。
这里的想法是读取一个包含交易记录的大文件,因此每个交易应该只处理一次。
我可以看到建议使用 Redis Streams,但我没有看到合理的 Java 参考实现
只需使用 LPUSH msgqueue
将项目放入列表并让所有客户执行:
while running
BRPOP msgqueue
# process popped item
done
请注意,没有像 PUBSUB 主题那样的直接实现。在这里使用 Queue 的另一个原因是 Publish Subscribve 中也没有持久订阅,即当订阅者未启动时发送消息时您的消息将丢失。但下面的队列实现会在这里节省一点。
最终答案
LPUSH TEST_QUEUE 测试消息 伦 TEST_QUEUE BRPOP 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);
}
}