【MQ】消息队列
特点介绍
消息队列是一种“先进先出”的数据结构
其中应用场景包药包含三个方面
一、应用解耦
系统的耦合性高,容错率就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。
使用消息队列解耦合,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中去,用户的下单操作正常完成。当物流系统回复后,补充处理存在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟故障。
二、流量消峰
应用系统如果遇到系统请求流量的瞬间猛增,有可能会将系统压垮。有了消息队列可以将大量请求缓存起来,分散到很长一段时间处理,这样可以大大提高系统的稳定性和用户体验。
一般情况,为了保证系统的稳定性,如果系统负载超过阈值,就会阻止用户请求,这会影响用户体验,而如果使用消息队列将请求缓存起来,等待系统处理完毕后通知用户下单完毕,这样总比不能下单体验要好。
处于经济考量目的:
业务系统正常时段 QPS如果是1000,流量最高峰是10000,为了应对流量高峰配置高性能的服务器显然不划算,这时可以使用消息队列应对峰值流量消峰。
三、数据分发
通过消息队列可以让数据在多个系统之间进行流通,数据的产生不需要关心谁来使用数据,只需要将数据发送到消息队列,数据使用方直接在消息队列中直接获取数据即可
MQ的优缺点
优点:解耦、消峰、数据分发
缺点:
- 系统可用性降低
系统引入的外部依赖过多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。
- 系统复杂性提高
MQ的加入增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用
- 一致性问题
A系统处理完业务,通过MQ分给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败
RocketMQ角色介绍
- Producer:消息发送者(发信者)
- Consumer:消息接收者(收信者)
- Broker:暂存和传输消息(邮局)
- NameServer:管理Broker(邮局的管理结构)
- Topic:区分消息的种类
一个发送者可以发送消息给一个或者多个Topic;
一个消息的接收者可以订阅一个或者多个Topic消息
- Message Queue:相当于是Topic的区分,用于并行发送好而接收消息
集群特点
- NameServer是一个无状态节点,节点之间无任何信息同步
- Broker分为Master和Slave,一个Master可以对应多个Slave,但一个Slave只能对应一个Master。Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokeID来定义,BrokerID为0表示Master,非0表示Slave。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer
- Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。
- Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic服务的Mater、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以向Master订阅信息,也可以从Slave订阅消息,订阅规则由Broker配置来决定