当前位置:首页 > MQ > 正文内容

redis实现消息消费确认(ack机制)

phpmianshi6年前 (2015-05-07)MQ67

消息中间件有很多,例如 ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ。这些消息系统都很专业,无论是可靠性,容错性,高性能都有自己独特的特点,那为什么我们还要用redis做消息队列

1.为什么用redis做消息队列

1.1拥有普通消息组件的特性

  • redis的list,set等集合都支持pop,push这些出栈入栈的操作,详见 redis命令

  • redis支持订阅发布模式

  • 能依靠双队列实现消息确认模式

1.2轻量易用

搭建一个mq需要你学习它,有的mq搭建还不是那么容易,但是redis很方便搭建,用的人多,学习成本也低

1.3 省钱省力省时

一般的公司都有redis方面的应用,例如做缓存,我们就不需要额外的服务器资源来重新搭建mq,对于开发人员来说,学习redis很简单,大多数也用过,开放起来很轻松也很快。

 

2.redis实现消息确认 ack机制

像RabbitMQ这种消息队列一般都有先消费再commit提交确认消费的机制,而kafka也可以通过提交偏移量来实现ack:Kafka ack消费确认-提交和偏移量 详解,redis则要另辟蹊径,前面分享过 java实现Redis消息发布和订阅,这里主要讲解redis消息确认的案例。

2.1 如何用redis实现消息发布和消费

使用list,set等集合的 pop和push就能快速实现实时的消息消费和发布

例如redis List(列表) 的 LPUSH 和 RPOP

2.2 redis如何实现消息确认 ack

2.2.1 什么是ack

ACK的全称为Acknowledge character,即确认字符,表示接收到的字符无错误。意思就是我把消息处理完了我再告诉mq,我业务逻辑都搞完了,你服务器可以把这条消息删了。这就是为了防止消息丢失,防止业务层消费了消息,而没把活干完。

2.2.2 redis实现ack的原理

  • 维护两个队列,假如一个消息队列的key叫做task,另外一个队列的key是doing表示正在处理的任务

  • 每次消费task的消息的同时就放到doing队列

  • 处理完消息就删除doing对应的消息

  • 使用定时任务检查doing队列,检查消息中的时间属性(这个需要产生消息的时候就可以加入时间戳),如果超时就把消息回滚到task队列

redis适合一般的业务系统,而像大数据处理系统,日志收集,就需要类似kafka这种大名鼎鼎的MQ!


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

RabbitMQ - 架构及工作原理

RabbitMQ - 架构及工作原理

1. 系统架构从示意图可以看出消息生产者并没有直接将消息发送给消息队列,而是通过建立与Exchange的Channel,将消息发送给Exchange,Exchange根据规则,将消息转发给指定的消息队...

RabbitMQ的PHP实现代码

接下来看一下创建队列及接收消息的TP5.1示例:需要提前启动消费者,绑定交换机与队列,并指定路由键1.测试多消费者监听同一个事件,打开2个消费者,启动生产者,发现2个消费者可以同时收到消息2.测试消费...

kafka和rabbitmq什么区别,各自适合什么场景?

RabbitMQ1.RabbitMQ遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上,适合企业级的消息发送订阅。2.RabbitMQ的broker由Ex...

 中间件RabbitMQ在生产环境占用CPU过多的情况

中间件RabbitMQ在生产环境占用CPU过多的情况

我们项目中用的消息中间件是RabbitMQ,这个消息中间件在使用起来停方便的,也比较健壮,但是使用不当,会对服务器造成很大的压力,会把CPU占用比占到70%左右,今天就来分析一下造成这个结果的原因。要...

Rabbitmq官方的六种工作模式

Rabbitmq官方的六种工作模式

RabbitMQ的六种工作模式:官网介绍:https://www.rabbitmq.com/getstarted.html这里简单介绍下六种工作模式的主要特点:简单模式:一个生产者,一个消费者work...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。