为什么用MQ:
MQ:messagequene,消息队列是一种先进先出的数据结构:
- 应用之间的解耦:比如A 系统,通知B系统,传统来说:A--B之间通过RPC进行交互,现在可以通过A 把消息发送给MQ,B 订阅MQ即可,这样可以解耦AB应用,为啥解耦呢,这样系统的容错性就越低。
- 流量消峰:
- 数据分发:
MQ的有点和缺点:
优点:解耦,消峰,数据分发:
缺点:系统可用性降低,系统复杂度提高,一致性问题。
ActiveMQ,rocketMq,RabbitMQ, kafka
rocket kafka 性能都比较高,10万级。
Rocket MQ 是阿里于2016年MQ中间件,使用Java语言开发的,ROckeMQ承接了双11等高等并发场景的消息的流转能够处理万亿级别的消息。
rocketMQ的角色介绍
producer:消息的发送者,无状态的,节点之间无信息同步,举例:发信者
consumer:消息的消费者,举例:收信任
Broker:暂存传输消息,举例:邮局,
nameserver:管理borker,举例:邮局管理者
topic:区分消息的种类,一个发送者可以给一个或者多个topic,一个消息的接收者可以订阅一个或者多个topic消息。举例:信件的类别
Message Queue :topic 的分区,用于并行发送消息和接收消息。
MQ测试过程中的测试点:
- 对于producer生产者,数据是否真的推送到队列中,数据是否推送到正确的topic下边。
- 如果数据推送的过多,前面超过的数据如何处理,超过队列;
- 同时要注意一下每个topic下边的queue如何分布数据
- 对于consumer,测试消费者的消费信息源是否正确,能否从正确的topic中,拿到正确的消息,
- 测试消费者的消息策略是什么,数据被消费后是否清除,
- 当消息队列过长,消费速度过慢时候,MQ溢出的时候如何处理,是否会越权消费别的topic的消息。
- pull的消息类型:需要测试拉去的时候间隔
- push的消息类型:需要测试消费者有没有及时得到消息,并消费。
为什么使用MQ:
实现服务之间的解耦,异步,削峰:
- 比如生成一个订单--订单要同步短信服务,积分服务,这样的我们只需要把订单同步到消息队列里面,然后广播出去即可。使用异步操作。如果使用使用同步的话,我们要拿到短信服务或者积分服务返回才能真正的下单成功,如果是MQ,异步的方式,即使第三方短信挂了,用户也可以正常下单的。
异步:可以提高效率,避免第三方带来的风险。
2.同样是订单同步,如果不加入消息队列,会导致,后边如果继续同步给营销服务等会耦合在一起,使用MQ的话,就不用在改动了,只需要通知给营销服务,这就解耦了,可以提高系统的扩展性和可用性。
3.削峰:在我们的业务处理中,每天的时间段处理问题的峰值是不一样的,比如服务如果处理不了,消息队列可以短暂的存储起来,可以达到短暂的消峰。
rabbitMQ怎么保证消息不丢失:
- 确保消息到MQ,使用发送方确认模式,
- 确保消息路由到正确的队列,如果发生了路由失败,开启路由失败通知,
- 确保消息在队列中正确的存储:交换机,队列,消息都要持久化,万一宕机可以存储
- 确保消息从正确的队列投递到消费者:手动确认---->交给消费者来确认。
什么是MQ消息重复:
比如消息队列,负载过高,超时,然后会重复发送。
当消息存储了之后,消费者处理中出现问题,导致这个消息没有删除,会在发送一次。
什么是幂等性:
对于消息接收端的情况,幂等的含义采用多次的调用,得到同样的结果。
所以对于重复消息处理就是,使用消息接收端的处理使用幂等性,这样降低消息中间件的整体复杂性,但是也给消息接收带了了限制。
1.MVCC:多版本并发控制,乐观锁,在生产者发送消息实现数据更新时候,增加版本号,这样消费者去更新的时候需要比较数据的版本号,这种对我们的开发不太友好,看起来处理起来完美,但是要求比较高。
2.去重表:
增加唯一性索引,