REDIS(限定条件下)实现并发的可靠消息队列
2018-12-21 18:15
477 查看
问题描述:
在著名的生产/消费模式中,生产者生产消息,消费者消费消息,生产者将生产的消息推送到消息队列中,消费者从消息队列中获取消息进行处理,若消费者获取消息后没有处理完成就发生了异常,则可能导致消息的丢失。
可靠消息队列是指在上述这种情况下,消息如果能够得到保持,并被后续的消费者继续消费则称该消息队列为可靠的消息队列,反之则称为不可靠的消息队列
网上有一种观点认为通过让redis创建两个队列,将消息从第一个队列转存到第二个队列(使用rpoplpush),在转存的过程中,消费者会获取到该信息的值,当消费者处理完成后再去将该消息从第二个队列中移除,若消费者挂掉,则消息由于转存到了第二个队列,此时只要再启动一个client定期去处理第二个队列的消息即可。这种方法存在两个问题,第一,多个消费者同时将消息转存入第二个队列,当消费者处理完这个消息之后,该消息在第二个队列中很难找到(因为在这个过程中第二个队列可能已经被插入了多个消息)。第二,假设你的消息很特别,内容不会重复,你可以通过lrem函数找到并删除消息,另外启动的那个专门处理第二个队列的client面对的队列中的信息数量必须很小,如果很大client处理不过来又不能使用并发,因为使用并发必须将消息pop出队列2,如果pop出队列2,那就又回到了我们本来要绕开的问题。
综上所述,若要使用redis实现并发的可靠消息队列,必须满足以上限定条件,所以不如直接换用rabbitmq吧,mq自带的消息确认机制,轻松的解决了这个问题。
相关文章推荐
- PHP中利用redis实现消息队列处理高并发请求
- 消息队列 秒杀实现 redis 高并发 定时任务
- Redis实现可靠低延时的消息队列
- PHP中利用redis实现消息队列处理高并发请求
- PHP中利用redis实现消息队列处理高并发请求--简洁代码实现效果
- jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换
- redis实现有序的消息队列
- Spring Boot教程(一)在springboot中用redis实现消息队列
- Redis实现简单消息队列
- redis作为消息队列实现代码
- Redis实现简单的消息队列
- jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换
- 聊聊高并发(十四)理解Java中的管程,条件队列,Condition以及实现一个阻塞队列
- Redis队列 实现消息推送功能
- Redis实现消息队列
- 【Redis】php+redis实现消息队列
- SpringBoot非官方教程 | 第十四篇:在springboot中用redis实现消息队列
- 如何用redis实现消息队列抢单功能
- 用redis来实现具有ack机制的消息队列
- 用redis实现支持优先级的消息队列