爱陪小樱桃

导航

 

为什么用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测试过程中的测试点:

  1. 对于producer生产者,数据是否真的推送到队列中,数据是否推送到正确的topic下边。
  2. 如果数据推送的过多,前面超过的数据如何处理,超过队列;
  3. 同时要注意一下每个topic下边的queue如何分布数据
  4. 对于consumer,测试消费者的消费信息源是否正确,能否从正确的topic中,拿到正确的消息,
  5. 测试消费者的消息策略是什么,数据被消费后是否清除,
  6. 当消息队列过长,消费速度过慢时候,MQ溢出的时候如何处理,是否会越权消费别的topic的消息。
  7. pull的消息类型:需要测试拉去的时候间隔
  8. push的消息类型:需要测试消费者有没有及时得到消息,并消费。

为什么使用MQ:

实现服务之间的解耦,异步,削峰:

  1. 比如生成一个订单--订单要同步短信服务,积分服务,这样的我们只需要把订单同步到消息队列里面,然后广播出去即可。使用异步操作。如果使用使用同步的话,我们要拿到短信服务或者积分服务返回才能真正的下单成功,如果是MQ,异步的方式,即使第三方短信挂了,用户也可以正常下单的。
    异步:可以提高效率,避免第三方带来的风险。
    2.同样是订单同步,如果不加入消息队列,会导致,后边如果继续同步给营销服务等会耦合在一起,使用MQ的话,就不用在改动了,只需要通知给营销服务,这就解耦了,可以提高系统的扩展性和可用性。
    3.削峰:在我们的业务处理中,每天的时间段处理问题的峰值是不一样的,比如服务如果处理不了,消息队列可以短暂的存储起来,可以达到短暂的消峰。

rabbitMQ怎么保证消息不丢失:

  1. 确保消息到MQ,使用发送方确认模式,
  2. 确保消息路由到正确的队列,如果发生了路由失败,开启路由失败通知,
  3. 确保消息在队列中正确的存储:交换机,队列,消息都要持久化,万一宕机可以存储
  4. 确保消息从正确的队列投递到消费者:手动确认---->交给消费者来确认。

什么是MQ消息重复:

比如消息队列,负载过高,超时,然后会重复发送。

当消息存储了之后,消费者处理中出现问题,导致这个消息没有删除,会在发送一次。

什么是幂等性:

对于消息接收端的情况,幂等的含义采用多次的调用,得到同样的结果。
所以对于重复消息处理就是,使用消息接收端的处理使用幂等性,这样降低消息中间件的整体复杂性,但是也给消息接收带了了限制。
1.MVCC:多版本并发控制,乐观锁,在生产者发送消息实现数据更新时候,增加版本号,这样消费者去更新的时候需要比较数据的版本号,这种对我们的开发不太友好,看起来处理起来完美,但是要求比较高。
2.去重表:
增加唯一性索引,

posted on 2024-07-27 13:45  cherry小樱桃  阅读(9)  评论(0编辑  收藏  举报