rocketMq
一、是什么
消息队列(Message Queue)是一种进程间通信或同一进程的不同线程间的通信方式。通俗点来讲的话,消息队列就是一个存放消息的容器,是一种“先进先出”的数据结构
二、解决什么问题
1、异步处理(短信通知,发送邮件,终端状态推送,App推送等)
场景-有些业务不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
2、应用解耦
场景-用户下单后,订单系统需要通知库存系统和支付系统。传统的做法是,订单系统调用库存系统和支付系统的接口
3、流量削峰
场景-秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列
4、内容分发
场景-通过消息队列可以让数据在多个系统更加之间进行流通。数据的产生方不需要关心谁来使用数据,只需要将数据发送到消息队列,数据使用方直接在消息队列中直接获取数据即可
三、优缺点
优点:异步处理、解耦、削峰、数据分发
缺点包含以下几点:
系统可用性降低
系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。
如何保证MQ的高可用?
系统复杂度提高
MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。
如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?
一致性问题
A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败。
如何保证消息数据处理的一致性?
四、有哪些东西
RocketMQ主要有四大核心组成部分:NameServer、Broker、Producer以及Consumer四部分
1.名字服务NameServer
主要负责对于源数据的管理,包括了对于Topic和路由信息的管理
a.生产者或消费者能够通过名字服务查找各主题相应的Broker IP列表。
b.多个Namesrv实例组成集群,但相互独立,没有信息交换。
注意:Broker向NameServer发心跳时,会带上当前自己所负责的所有Topic信息,如果Topic个数太多(万级别),
会导致一次心跳中,Topic的数据就几十M,网络情况差的话,网络传输失败,心跳失败,导致NameServer误认为Broker心跳失败
2.代理服务器Broker Server
消息中转角色,负责存储消息、转发消息
a.Broker是具体提供业务的服务器,单个Broker节点与所有的NameServer节点保持长连接及心跳,
并会定时将Topic信息注册到NameServer
b.代理服务器在RocketMQ系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备
是
3.生产者Producer
消息生产者,负责产生消息,一般由业务系统负责产生消息
a.一个消息生产者会把业务应用系统里产生的消息发送到broker服务器。
b.RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。
c.同步和异步方式均需要Broker返回确认信息,单向发送不需要。
4.消费者Consumer
消息消费者,负责消费消息,一般是后台系统负责异步消费
a.Consumer也由用户部署,支持PUSH和PULL两种消费模式,支持集群消费和广播消息,提供实时的消息订阅机制
5.消息内容Message
消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题
a.RocketMQ中每个消息拥有唯一的Message ID,且可以携带具有业务标识的Key。
b.系统提供了通过Message ID和Key查询消息的功能。
6.消息主题Topic
表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题
a.是RocketMQ进行消息订阅的基本单位
7.标签Tag
为消息设置的标志,用于同一主题下区分不同类型的消息
a.标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统
b.消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性。
8.消息队列MessageQueue
主题被划分为一个或多个子主题,即消息队列
a.对于每个Topic都可以设置一定数量的消息队列用来进行数据的读取
五、怎么使用
启动控制台:
控制台git项目地址-https://github.com/apache/rocketmq-externals/tree/release-rocketmq-console-1.0.0/rocketmq-console
參考: https://blog.csdn.net/weixin_47555380/article/details/108401600