1. MQ简介
什么是MQ,MQ主要解决的问题,MQ的实际应用范围
生产者消费者模型,数据共享交换平台的工作原理,生产者发送消息平台
具有高性能、高可靠、高实时、分布式的消息队列中间件。
在处理 异步 ,解耦,最终一致性,并行 的场景下优先考虑使用
具有的特点:
能够保证严格的消息顺序
提供丰富的消息拉取模式,支持消费者主动从服务端拉取,支持服务端主动推送给所有的消费者
高效的订阅者水平扩展能力
实时的消息订阅机制
亿级消息堆积能力,只要资源充足
选择RocketMQ的理由:
强调集群模式无单点,可扩展,任意一点高可用,水平扩展
海量数据的堆积能力,消息堆积后,写入延迟低
支持上万个队列
消息失败重试机制
消息可查询
开源社区灵活
成熟度(支持阿里双十一)
2. MQ的使用
MQ的主要名词解释
producer 消息的生产者,在生产消息时,指定topic 消息的内容,MQ服务端地址,重试次数,tag内容,messageQueue选择队列的方式
consumer 消息的消费者,需要指定MQ服务端地址,订阅的topic,如果需要进行子消息类型的过滤则还可以依据tag进行处理
nameserver 负责整个系统的协调工作,所有的客户端要在服务端进行注册,并且存在心跳检测,服务端定期检测各个客户端的活跃状态。
broker 消息的暂存和发送
topic 区分不同类型的消息
messageQueue 每个topic可以配置多个队列,用来并发高效的生产和消费消息
tag 同一类型的消息可以做子过滤
offset 消息偏移量,当消费端是自己主动从服务器端拉取消息时需要维护此偏移量保证从上一次停止的地方继续消费
MQ的运行方式
先启动服务端,运行nameserver和broker是。broker启动时指定所属的MQ服务端,进而注册自己的状态信息至nameserver。
producer 运行,并注册到nameserver上,通过设置消息的属性来向服务端发送消息,nameserver注册消息的topic,分组信息等。
Consumer 运行,指定要订阅的topic,并注册到nameserver中。可以通过不同的Consumer类型来设置消息的获取方式,是服务器端接收到消息就发送给自己还是,自己想要的时候主动去服务端拿
MQ的场景使用
可靠性优先场景(有序消息处理)
牺牲掉部分并发的性能来使MQ完全按照服务自己业务逻辑的方式来生产和消费消息,支撑自己的业务逻辑,也可以理解为使MQ的消息具有原子性。
有序消息可分为
全局消息有序:整个Topic内的消息是有序的,这样不能用高并发、高吞吐量的功能,因为加了锁成为了单线程处理
局部消息有序:维护消息的有序性要靠生产者和消费者一起完成,即生产者生产的消息按照生产顺序向同一个MessageQueue发送消息,
消费者在消费消息前先获得消息对应的Queue的锁,保证Queue不被并发消费,即单个Queue不并发,多个Queue之间并发,提高处理能力
消息重复问题:
消息的重复的根本是因为生产者在发送消息后,因为网络波动或者消息量过大或者其他原因不确定的因素导致的broker在接收到了消息后没有及时反馈给生产者已经接收成功的消息,
进而导致的生产者尝试重新发送消息,进而导致了同一条消息向消息队列中发送了两次导致的
此种情况在变成过程中必须要考虑,要么使用幂等性原则,即处理多次同一条消息得到的结果是一致的
要么要么自己根据消息的id进行判断,通常使用redis较多
吞吐量优先的场景:
在可靠性要求不高的,即允许出现消息误差的情况下
broker端的过滤,减少网络带宽
通过Tag进行过滤
通过类似SQL表达式进行过滤
通过java代码的filter进行过滤
提高生产者的发送速度
增加生产者的数量
加快发送的速度 比如oneWay方式
提高消费者的消费能力
增加消费者数量
增加批量消费的能力
增加线程数量
消息堆积严重时的的跳过消息处理方式
搭建MQ高可用集群
双主双从模式搭建
MQ的状态监控 rocketmq-console的使用和介绍