MQ基础内容及问题排查方法

首先介绍两个概念

什么是消息中间件?

通过提供某种规范实现在不同系统之间传递语义准确的消息。

专注于数据的发送和接收,利用高效可靠的异步消息传递机制的集成分布式系统。

什么是MQ?

MQ全称为Message Queue, 消息队列(MQ)是应用程序“对”应用程序的通信方法,也是消息中间件的一种。

MQ:生产者往消息队列中写消息,消费者可以读取队列中的消息。

消息队列的应用场景

a. 异步处理:比如订单状态处理完毕的回调通知;

b. 系统间应用解耦:前一个系统将要处理的内容放入消息队列,就不再关心后续的其他操作了,后面的系统获取消进行消费;

c. 流量削锋:避免因流量过大,导致流量暴增,海量消息堆积,应用挂掉;

d. 日志处理:通过队列进行日志处理;

e. 消息通讯:消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。


基本概念

名词解释
Namesrv注册中心,为 producer 和 consumer 提供路由信息。
Broker缓存代理,消息中转角色,负责存储消息,转发消息。
Producer消息的生产者
Consumer消息的消费者
Producer Group生产者组,多个发送同一类消息的生产者称之为一个生产者组。
Consumer Group消费者组,可以并行消费Topic中的partition的消息。
Topic一种消息的逻辑分类,消息源的不同分类,比如说有订单类的消息,也有库存类的消息等
PartitionTopic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。partion中每条消息都会被分配一个 有序的Id(offset)。
Tag标签,可以被认为是对 Topic 进一步细化,一般在相同业务模块中通过引入标签来标记不同用途的消息。
Message消息,是通信的基本单位,每个producer可以向一个topic(主题)发布一些消息,一个 Message 必须指定 topic,相当于寄信的地址。Message 还有一个可选的 tag 设置,以便消费端可以基于 tag 进行过滤消息。
Message ID消息的唯一标识

消息模型

点对点模型(P2P):

        在P2P模型中,有下列概念:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。

        l 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)

        l 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列。

        l 接收者在成功接收消息之后需向队列应答成功

        如果希望发送的每个消息都应该被成功处理的话,那么你需要P2P模型。

发布-订阅模型(Pub/Sub):

        在Pub/Sub模型中,有下列概念: 主题(Topic)、发布者(Publisher)、订阅者(Subscriber)。客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

        l 每个消息可以有多个消费者

        l 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅之后,才能消费发布者的消息,而且,为了消费消息,订阅者必须保持运行的状态。

        订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

        如果希望发送的消息可以不被做任何处理、或者被一个消费者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型。

交互原理

Namesrv做什么?

        Namesrv是主要做路由服务(状态服务器),无状态可集群横向扩展。broker同时向多个Namesrv机器上报broker机器的实时状态信息、topic消息队列路由信息、broker基础信息、集群信息,从而达到数据热备份的作用。Producer发送消息的时候,先请求nanesrv获取topic路由信息,然后根据topic路由信息路由到broker(topic是存储在broker)。Consumer消费消息的时候同样先请求nanesrv获取topic路由信息,然后根据topic路由信息路由到broker。

Broker做什么?

       消息中转角色,负责存储消息,转发消息。broker部署相对复杂,分为master和slave,一个master可以对应多个slave,但一个slave只能对应一个master(支持异步复制和半同步复制)。master可以集群部署,通过同样的ClusterName来区分,同一个集群中的BrokerName不能一样。每个broker与namesrv集群中的所有节点建立长连接,定时发送心跳信息(30秒),注册topic等信息到所有namesrv。

Producer

        Producer 与Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从Name Server 取Topic 路由信息,并向提供Topic 服务的Master 建立长连接,且定时向Master 发送心跳,Slave会同步Master的信息。Producer 完全无状态,可集群部署。

Consumer

        Consumer与Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从Name Server 取Topic 路由信息,并向提供Topic 服务的Master、Slave 建立长连接,且定时向Master、Slave 发送心跳。Consumer既可以从Master 订阅消息,也可以从Slave 订阅消息,订阅规则由Broker 配置决定。

Broker集群

       一个Master下面可以挂载多个Slave,同一Master下的多个Slave通过指定不同的BrokerId来区分。

问题排查方法

Q1:MQ 是否能保证消息不重复?

1、绝大多数情况下,消息是不重复的。作为一款分布式消息中间件,在网络抖动、应用处理超时等异常情况下,无法保证消息不重复,但是能保证消息不丢失;

2、需要业务方自己实现去重逻辑,不推荐使用msgid来做去重,因为msgid在绝大部分情况下,是不会重复,不排除极端情况可能会出现重复,或者多个集群之间出现重复msgid;

3、可以使用订单编号等唯一的作为唯一标识来去重。

Q2:消息发送了,但是没有收到怎么查询?

MQ 提供了多种消息查询方式:

1、使用 Topic 按时间范围进行查询,可以查询到一段时间内某 Topic 收到的所有消息;

2、使用 Topic 和 Message ID 对消息进行精准查询;

3、使用 Topic 和 Message Key 较为精准地查询具有相同 Message Key 的一类消息。

Q3:MQ 消费失败如何重新消费消息?

1、消费业务逻辑代码如果返回 ConsumeConcurrentlyStatus.RECONSUME_LATER,或者 NULL,或者抛出异常,消息都会走重试流程,默认重试 16 次(重试次数可以自定义),如果重试 16 次后,仍然失败,则消息丢弃;

2、消息重试间隔可以通过context控制,如果不控制,会越来越长。

Q4:容器环境消息消费失败怎么排查?

1.、检查订阅关系是否正确;

2、检查消费组状态是否正常;

3、检查生产者机器和消费者机器的antmq.test.jiedaibao.com地址解析是否为容器组mq地址;

4、检查消费者服务器是否配置了外网地址,导致消息发送到基准环境;

5、确认生产者已生产消息;

Q5:MQ消费先于同步返回

一般采用加锁机制处理。

 

命名规范

Topic命名规范:

  1、所有Topic必须使用T_开头,Topic中包含业务系统,可以唯一区分业务。

  2、必须填写tag,同一Topic用不同的tag区分,全部大写。消费者通过Topic+tag消费消息。

  3、使用运维平台查询Topic是否存在,存在需要考虑是否要更换Topic。

  例:topic:T_LOAN_PRODUCT 

                 tag  : T_CANCEL_BORROW  或  T_SUBMIT_RESALE  [topic+tag匹配消费消息]

消费组命名规范:

  1、消费组必须以S_开头,包含业务系统,全部大写。同一Topic可以被多个消费组消费。

  2、使用运维平台查询消费组是否存在,存在需要考虑是否要更换消费组。

  例:c-group-id: S_PFD_T_ATM

生产组命名规范:

  1、生产者必须使用P_开头,包含业务系统,全部大写,不同的系统禁止使用同一个组名。

  例:p-group-id: P_PAYFUND

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值