rocketMQ分享

一、MQ介绍
1、什么是MQ?为什么要用MQ?
MQ:MessageQueue,消息队列。 队列,是一种FIFO 先进先出的数据结构。消息由生产者发送到MQ进行排队,然后按原来的顺序交由消息的消费者进行处理。

2、MQ的作用:
跟单系统中使用mq帮助我们解决了什么问题?
使用场景:
同步保存订单信息、发送钉钉消息

解耦
保存数据的业务逻辑操作和钉钉发送的逻辑(如限流等),实际上和业务本身耦合度太高
mq对服务之间进行了解耦,减少了服务之间的影响,提高了扩展性。

异步
保存订单信息和发送钉钉消息的异步处理,业务上,也并不阻塞后续流程处理。
mq提高了系统的响应速度和吞吐量。

其他作用:
削峰
mq本身起到了缓冲的作用,当短时间内,请求激增时,类似周末晚上请求突然很多时,mq的存在,可以减少对下游业务代码的冲击,稳定应对突发的流量冲击。

3、MQ的优缺点
​ 上面的其实就是优点,但是一个中间件的引入,解决了一些问题的同时,也必定会带来新的问题:

系统可用性降低
系统引入的外部依赖增多,系统的稳定性就会变差。一旦MQ宕机,对业务会产生影响。这就需要考虑如何保证MQ的高可用。

系统复杂度提高
引入MQ后系统的复杂度会大大提高。以前服务之间可以进行同步的服务调用,引入MQ后,会变为异步调用,数据的链路就会变得更复杂。并且还会带来其他一些问题。比如:如何保证消费不会丢失?不会被重复调用?怎么保证消息的顺序性等问题。


RocketMQ组件
​ RocketMQ由以下这几个组件组成
在这里插入图片描述

NameServer : 提供轻量级的Broker路由服务,管理Broker。
Broker:实际处理消息存储、转发等服务的核心组件。
Producer:消息生产者集群。通常是业务系统中的一个功能模块。
Consumer:消息消费者集群。通常也是业务系统中的一个功能模块。
Topic:区分消息的种类;一个发送者可以发送消息给一个或者多个Topic;一个消息的接收者可以订阅一个或者多个Topic消息
Message Queue:相当于是Topic的分区;用于并行发送和接收消息,一个queueId就代表了一个MessageQueue。

4、生产中mq中的几个问题:
(1)如何确保消息不会丢失?
消息生产到消费的几个阶段:
生产阶段: 在这个阶段,从消息在 Producer 创建出来,经过网络传 输发送到 Broker 端。
存储阶段: 在这个阶段,消息在 Broker 端存储,如果是集群,消息会在这个阶段被复制到其他的副本上。
消费阶段: 在这个阶段,Consumer 从 Broker 上拉取消息,经过网络传输发送到 Consumer 上。

以上阶段均有可能发生消息的丢失,避免消息的丢失,我们可以针对每个阶段进行分析:

生产阶段:确保生产者在发送到broker上时,能够收到broker的确认响应,出现发送异常时,做好异常日志的记录,并执行重试操作。
存储阶段:如果对消息的可靠性要求非常高,可以通过配置 Broker 参数来避免因为宕机丢消息。对于单个节点的 Broker,需要配置 Broker 参数,在收到消息后,将消息写入磁盘后再给 Producer 返回确认响应,这样即使发生宕机,由于消息已经被写入磁盘,就不会丢失消息,恢复后还可以继续消费。例如,在 RocketMQ 中,需要将刷盘方式 flushDiskType 配置为 SYNC_FLUSH 同步刷盘。如果是 Broker 是由多个节点组成的集群,需要将 Broker 集群配置成:至少将消息发送到 2 个以上的节点,再给客户端回复发送确认响应。这样当某个 Broker 宕机时,其他的 Broker 可以替代宕机的 Broker,也不会发生消息丢失。
消费阶段:消费端消费时,不要在收到消息后就立即发送消费确认,而是应该在执行完所有消费业务逻辑之后,再发送消费确认。

(2)如何处理消费过程中的重复消息?
消费端使用幂等性解决重复消息问题的几种方式:
1). 利用数据库的唯一约束实现幂等(跟单中使用数据库唯一约束实现幂等)
2). 为更新的数据设置前置条件
3). 记录并检查操作(在发送消息时,给每条消息指定一个全局唯一的 ID,消费时,先根据这个 ID 检查这条消息是否有被消费过,如果没有消费过,才更新数据,然后将消费状态置为已消费)
(3)消息积压了该如何处理?
能导致积压突然增加,最粗粒度的原因,只有两种:要么是发送变快了,要么是消费变慢了
如果是单位时间发送的消息增多,比如说是赶上大促或者抢购,短时间内不太可能优化消费端的代码来提升消费性能,唯一的方法是通过扩容消费端的实例数来提升总体的消费能力。
如果短时间内没有足够的服务器资源进行扩容,没办法的办法是,将系统降级,通过关闭一些不重要的业务,减少发送方发送的数据量,最低限度让系统还能正常运转,服务一些重要业务。
当出现消费变慢时,分析一下是什么原因导致消费变慢。优先检查一下日志是否有大量的消费错误,如果没有错误的话,可以通过打印堆栈信息,看一下你的消费线程是不是卡在什么地方不动了,比如触发了死锁或者卡在等待某些资源上了。

4、RocketMQ 中的分布式事务实现
rocketMQ 支持事务消息,实现原理如下图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值