消息队列的用途
概要的说有三点 解耦 异步 错峰,但使用了消息队列会导致系统可用性降低和复杂性的增加。
常见的消息队列的特点
1、吞吐量 kafka和RocketMQ要比ActiveMQ和RabbitMQ高一个数量级。
2、时效性 RabbitMQ是基于erlang设计,并发能力很强,性能和延时都很优,达到了了微秒级其余单个都是毫秒级。
3、高可用 都可以实现高可用ActiveMQ和RabbitMQ是主从架构设计,kafka和RocketMQ是分布式设计,一个节点多个副本,机器问题不会导致数据丢失。
4、功能性 kafka只提供了简单的MQ功能,在大数据领域的实时计算和日志采集被大规模采用,其于三和功能都很完备。
5、消息完整性 ActiveMQ和RabbitMQ丢失数据的可能性较低,kafka和RocketMQ理论不会丢失数据
消息队列的高可用是如何实现
RabbitMQ是采用镜像集群的模式来实现的,kafka早期版本是采用分片来实现,新版本采用创建节点副本来实现(replica)
MQ如何保证消息的顺序性
RabbitMQ:拆分成多个queue,每个queue对应一个Consumer,在consumer内部用内存队列做排队分发给业务类
Kafka:写N个内存Queue,具有象同Key的都存放在一个queue中,工作线程只消费特定的队列的消息
如何避免消息的重复性消费
生产消息时MQ内部会给消息生成一个唯一的id,作为去重和失败重传的标识,消息体中也要有全局唯一id作为去重和幂等的依据,避免一条消息被重复消费。
消息长期在队列积压要如何处理
解决思路:有限修复consumer的问题,确保其消费速度,然后停掉consumer,然后新建一个新的topic,分片为原来的10倍,然后部署一个comsumer程序,将之前挤压的消息写入到新的queue,然后10倍的机器部署consumer,每个机器消费一个分片,相当于之前的处理速度增大十倍,等消息消费完后恢复原来的架构。
消息过期失效如何处理
RabbitMQ设可以设置过期时间的,消息超过TTL的设置会被清理掉,这种会导致消息丢失,可以采用批量重导来优化,当长时间挤压导致过期时可以把这一部分数据写入数据库,等待业务过峰后再导入MQ。
如何保证数据一致性,事务消息如何实现
消息推送给MQ后,本地收到来自MQ的ACK确认后才执行事务提交操作,完成后再告诉MQ决定消息是什么状态(可发送,删除)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)