MQ入门知识点集合

  1. MQ实现
    1. ActiveMQ
    2. RabbitMQ
    3. RocketMQ
    4. Kafka
    5. Redis
  2. MQ理论框架
    1. 共识算法:Raft
    2. RocketMQ支持事务消息机制
    3. 分布式事务的四种解决方案
    4. CAP定理
    5. BASE理论
    6. 分布式系统事务一致性
  3. 消息类型
    1. 普通消息
    2. 事务消息
    3. 定时和延时消息
    4. 顺序消息
  4. 消息特性
    1. 消息重试
    2. 消息幂等
  5. 路由中心NameServer
    1. NameServer架构设计

      1. NameServer集群

      2. Producer集群

      3. Consumer集群

      4. Broker

        1. Master...n

        2. Slave...n

      5. Consumer集群

    2. NameServer启动流程

      1. NameServer启动类:org.apache.rocketmq.namesrv.NamesrvStartup

      2. Step 1 :解析配置文件,填充NameServerConfig(业务参数)、NettyServerConfig(网络参数)属性值

        1. 参数来源

          1. -c configFile 通过 -c 命令指定配置文件的路径

          2. 使用 “--属性名 属性值”,例如 --listenPort 9876

      3. Step 2:根据启动属性创建NamesrvController实例,并初始化该实例,NameServerController实例为NameServer核心控制器

        1. 加载KV配置,创建NettyServer网络处理对象,然后开启两个定时任务

          1. 定时任务1:NameServer每隔10s扫描一次Broker,移除处于不激活状态的Broker

          2. 定时任务2:NameServer每隔10分钟打印一次KV配置

      4. Step 3:注册JVM钩子函数并启动服务器,以便监听Broker、消息产生者的网络请求

    3. NameServer路由注册、故障剔除

      1. 路由元信息

        1. NameServer路由实现类:org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager

        2. topicQueueTable:Topic消息队列路由信息,消息发送时根据路由表进行负载均衡。

          1. private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;

            1. QueueData

              1. private String brokerName;

              2. private int readQueueNums;

              3. private int writeQueueNums;

              4. private int perm;

              5. private int topicSynFlag;

        3. brokerAddrTable:Broker基础信息,包含brokerName、所属集群名称、主备Broker地址。

          1. private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;

            1. BrokerData

              1. private String cluster;

              2. private String brokerName;

              3. private HashMap<Long/* brokerId */, String/* broker address */> brokerAddrs

        4. clusterAddrTable:Broker集群信息,存储集群中所有Broker名称。

          1. private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;

        5. brokerLiveTable:Broker 状态信息。NameServer每次收到心跳包时会替换该信息。

          1. BrokerLiveInfo

            1. private Long lastUpdateTimestamp;

            2. private DataVersion dataVersion;

            3. private Channel channel;

        6. filterServerTable:Broker上的FilterServer 列表,用于类模式消息过滤。

      2. 路由注册

        1. RocketMQ 路由注册是通过Broker与NameServer的心跳功能实现的。Broker启动时向集群中所有的NameSer发送心跳语句,每隔30s向集群中所有NameServer发送心跳包,NameServer收到Broker心跳包时会更新borkerLiveTable缓存中BrokerLiveInfo的lastUpdateTimestamp,然后Name Server 每隔10s扫描brokerLiveTable,如果连续120s没有收到心跳包,NameServer将移除该Broker的路由信息同时关闭Socket连接。

        2. Broker发送心跳包

          1. 源码分析Netty系列

        3. NameServer处理心跳包

          1. org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor网络处理器解析请求类型,如果请求类型为RequestCode.REGISTER_BROKER,则请求最终转发到RouteInfoManager#registerBroker。

          2. Step1:路由注册需要加写锁,防止并发修改RouteInfoManager中的路由表。首先判断Broker所属集群是否存在,如果不存在,则创建,然后将broker名加入到集群Broker集合中

            1. java并发锁ReentrantReadWriteLock读写锁源码分析

              1. 共享锁

              2. 排他锁

              3. CLH算法

                1. 算法:CLH锁的原理及实现

          3. Step 2:维护BrokerData信息,首先从brokerAddrTable根据BrokerName尝试获取Broker信息,如果不存在,则新建BrokerData并放入到brokerAddrTable,registerFirst设置为true;如果存在,直接替换原先的,registerFirst设置为false,表示非第一次注册。

          4. Step 3:如果Broker为Master,并且Broker Topic配置信息发生变化或者是初次注册,则需要创建或更新Topic路由元数据,填充topicQueueTable,其实就是为默认主题自动注册路由信息,其中包含MixAll.DEFAULT_TOPIC的路由信息。当消息产生者发送主题时,如果该主题未创建并且BrokerConfig的autoCreateTopicEnable为true时,将返回MixAll.DEFAULT_TOPIC的路由信息。

          5. Step 4:更新BrokerLiveInfo。存活Broker信息表,BrokeLiveInfo是执行路由删除的重要依据。

          6. Step 5:注册Broker的过滤器Server的地址列表,一个Broker上会关联多个FilterServer消息过滤服务器。如果此Broker为从节点,则需要查找该Broker的Master的节点信息,并更新对应的masterAddr属性。

      3. 路由删除

        1. 触发路由删除的触发点

          1. NameServer定时扫描brokerLiveTable检测上次心跳包与当前系统时间的时间差,如果时间大于120s,则需要移除该Broker信息。

          2. Broker在正常被关闭的情况下,会执行unregisterBroker指令。

      4. 路由发现

        1. RocketMQ路由发现是非实时额,当Topic路由出现变化后,NameServer不主动推送给客户端,而是由客户端定时拉去主题最新的路由。

  6. 消息发送

    1. 发送方式

      1. 同步(sync):发送者向MQ执行发送消息API时,同步等待,直到消息服务器返回发送结果。

      2. 异步(async):发送者向MQ执行发送消息API时,指定消息发送成功后的回调函数,然后调用消息发送API后,立即返回,消息发送者线程不阻塞,直到运行结束,消息发送成功或失败的回调任务在一个新的线程中执行。

      3. 单向(oneway):消息发送者向MQ执行发送消息API时,直接返回,不等待消息服务器的结果,也不注册回调函数,简单地说,就是只管发,不在乎消息是否成功存储在消息服务器上。

    2. 消息队列如何进行负载?

    3. 消息发送如何实现高可用?

    4. 批量消息发送如何实现一致性?

  7. RocketMQ消息

    1. org.apache.rocketmq.common.message.Message

      1. private String topic; // 主题

      2. private int flag; // 消息Flag(RocketMQ不做处理)

      3. private Map properties; // 扩展属性

      4. private byte[]; // 消息体

      5. public Message(String topic, byte[])

      6. public Message(String topic, String tags, String keys /* Message索引键,多个用空格隔开,RocketMQ可以根据这些key快速检索到消息。 */ , int flag, byte[], boolean waitStoreMsgOK /* 消息发送时是否等消息存储完成后再返回。 */)

      7. public Message(String topic, String tags, byte[])

      8. public Message(String topic, String tags, String keys, byte[])

      9. public void setKeys(String keys)

      10. public void putUserProperty(final String name, final String value)

      11. public int getDelayTimeLevel()

      12. public void setDelayTimeLevel(int level/* 消息延迟级别,用于定时消息或消息重试。*/)

  8. 生产者启动流程

    1. DefaultMQProducer消息发送者

      1. void createTopic(String key, String newTopic, int queueNum, int topicSysF!ag)

        1. 创建主题。

        2. key:目前未实际作用,可以与newTopic相同。

        3. newTopic:主题名称。

        4. queueNum:队列数量。

        5. topicSysFlag:主题系统标签,默认为0。

      2. long searchOffset(final MessageQueue mq, final long timestamp)

        1. 根据时间戳从队列中查找其偏移量。

      3. long maxOffset(final MessageQueue mq)

        1. 查找该消息队列中最大的物理偏移量

      4. long minOffset(final MessageQueue mq)

        1. 查找该消息队列中最小的物理偏移量

      5. MessageExt viewMessage(final String offsetMsgld)

        1. 根据消息偏移量查找消息

      6. QueryResult String topic, final String key, final int maxNum, final long begin, final long end)

        1. 根据条件查询消息。

        2. topic:消息主题。

        3. key:消息索引字段

        4. maxNum:本次最多取出消息条数

        5. begin:开始时间。

        6. end:结束时间。

    2. 消息生产者启动流程

    3. 消息发送基本流程

      1. 验证消息

      2. 查找路由

      3. 消息发送(包含异常处理机制)

  9. 事务消息

    1. 事务消息实现思想

      1. 两阶段提交

      2. 定时事务状态回查

    2. 事务消息发送流程

    3. 事务消息提交或回滚

    4. 事务消息回查事务状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值