消息队列的用途
概要的说有三点 解耦 异步 错峰,但使用了消息队列会导致系统可用性降低和复杂性的增加。
常见的消息队列的特点
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决定消息是什么状态(可发送,删除)