鱼友1029
2024-12-12
MQ知识点回顾: 1. 保证消息顺序性: a. 常见实现方式: i. 单一生产者->单个队列->单一消费者(性能瓶颈) ii. 支持分区的消息队列(RocketMQ&Kafka)可以通过将消息放到相同分区的方式保证消费顺序 iii. 支持顺序队列的消息队列(RabbitMQ)可以通过使用单个队列或者利用规则分配到不同顺序队列的方式保证顺序消费 b. RocketMQ i. 生产者:同步发送方式自定义MessageQueueSelector根据参数arg选择目标队列 ii. 消费者 1) 选择顺序消费模式从同一个队列中按顺序读取消息 2)MessageListenerOrderly三次加锁过程: a)ConsumeMessageOrderlyService初始化时会启动定时任务向Broker为当前客户端申请分布式锁,获取成功后Consumer就锁定了Broker上的MessageQueue,确定为唯一消费者 b)一次性拉取多条消息到ProcessQueue,同时提交到消费线程池执行 c)消费过程中申请MessageQueue锁,确保同一时间同一队列只有一个线程能够处理消息 d)对ProcessQueue加锁确保重平衡阶段不会出现重复消费,因为重平衡后消费者可能发生切换,此时之前消费者在Broker上的锁需要释放,释放锁的线程需要尝试对ProcessQueue加锁,如果失败证明消费还在进行中,消费位点信息还未提交,Broker上的锁不能释放,其他客户端此时消费可能会重复消费消息 c. Kafka:分区内有序(同一分区在一个日志文件中,文件读写有序) i. 生产者 1)直接指定分区partition 2)通过指定相同key 3)自定义partitioner重写partition方法通过自定义hash方法指定分区 ii. 消费者:单线程消费者 d. RabbitMQ i. 生产者: 1)Message Grouping根据相同属性将详细放到同一个顺序队列中 2)自定义路由策略将相同业务逻辑的消息放到同一个顺序队列中 ii. 消费者:每个队列仅对应一个消费者 2. 延时消息 a. RabbitMQ通过设置过期时间TTL监听死信队列实现,可设置任意时间,但是可能出现头部阻塞 b. RocketMQ通过延迟存储方式实现,消息先存储在内存中到达延时时间再存储磁盘的方式实现,不支持任意时长,存在大量任务时性能下降,RocketMQ 5.0之后采用了基于时间轮方式提高了投递性能,支持更小时间粒度
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP