RocketMQ

作者: 千淘萬漉 | 来源:发表于2019-10-21 08:18 被阅读0次

    1️⃣架构原理

    本着不重复造轮子的原则,这里有一篇很好的文章RocketMQ-架构原理,对RocketMQ的基本概念,部署架构以及MQ中各个角色进行了很好的解释。挑出了几个重要问题和概念再单独梳理如下:

    • Message,Rocket中数据传递的实体对象,使用MessageId唯一识别,用户在发送时可以设置messageKey,便于之后查询和跟踪。Message 还有一个可选的 Tag 设置,以便消费端可以基于 Tag 进行过滤消息。
    • Queue,Topic和Queue是一对多的关系,主要用于负载均衡。发送消息时,用户只指定Topic,Producer会根据Topic的路由信息选择具体发到哪个Queue上。Consumer订阅消息时,会根据负载均衡策略决定订阅哪些Queue的消息。
    • NameServer服务,无状态,集群部署,与所有的Broker维持长连接心跳(30S),只负责管理Topic-Queue的路由配置、Broker的实时配置信息,不负责选举。
    • Broker服务,一个Topic分布在多个Broker上,一个Broker可以配置多个Topic,它们是多对多的关系。
      如果某个Topic消息量很大,应该给它多配置几个Queue,并且尽量多分布在不同Broker上,减轻单Broker的压力。
    • Consumer (消费者),单个消费者和该消费者关联的所有broker保持长连接。个消费者集群多台机器共同消费一个Topic的多个队列,一个队列只会被一个消费者消费。如果某个消费者挂掉,分组内其它消费者会接替挂掉的消费者继续消费。
    • Producer(生产者),单个生产者和该生产者关联的所有broker保持长连接, 而与nameserver没有心跳。

    2️⃣环境部署

    Docker环境下部署可以参考:RocketMQ-Docker部署RocketMQ集群。RocketMQ的部署方式可以分为四种:

    1.单个 Master

    这种方式风险较大,一旦Broker 重启或者宕机时,会导致整个服务不可用,线上环境一般不使用这种。

    2.多 Master 模式

    一个集群无 Slave,全是 Master,例如 2 个 Master 或者 3 个 Master
    优点:配置简单,单个Master 宕机或重启维护对应用无影响,在磁盘配置为 RAID10 时,即使机器宕机不可恢复情况下,由与 RAID10 磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢)。性能最高。

    • 优点:消息可靠性较高,性能是所有模式中最高。
    • 缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到受到影响。

    3.多 Master 多 Slave 模式,异步复制

    每个 Master 配置一个 Slave,有多对Master-Slave,HA 采用异步复制方式,主备有短暂消息延迟,毫秒级。

    • 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为 Master 宕机后,消费者仍然可以从 Slave 消费,此过程对应用透明。不需要人工干预。性能同多 Master 模式几乎一样。
    • 缺点:Master 宕机,磁盘损坏情况,会丢失少量消息。

    4.多 Master 多 Slave 模式,同步双写

    每个 Master 配置一个 Slave,有多对Master-Slave,HA 采用同步双写方式,主备都写成功,向应用返回成功。

    • 优点:数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高
    • 缺点:性能比异步复制模式略低,大约低 10%左右,发送单个消息的 RT 会略高。目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能。

    Broker关键配置及说明:

    #所属集群名字
    brokerClusterName=rocketmq-cluster
    
    #broker名字,注意此处不同的配置文件填写的不一样 brokerName=broker-a|broker-b
    #0 表示 Master,>0 表示 Slave
    brokerId=0
    
    #nameServer地址,分号分割
    namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
    
    #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
    defaultTopicQueueNums=4
    
    #Broker 对外服务的监听端口
    listenPort=10911
    
    #存储路径
    storePathRootDir=/usr/local/rocketmq/store
    
    #commitLog 存储路径
    storePathCommitLog=/usr/local/rocketmq/store/commitlog
    
    #消费队列存储路径存储路径
    storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
    
    #消息索引存储路径
    storePathIndex=/usr/local/rocketmq/store/index
    
    #Broker 的角色
    #- ASYNC_MASTER 异步复制Master
    #- SYNC_MASTER 同步双写Master
    #- SLAVE
    brokerRole=ASYNC_MASTER
    
    #刷盘方式
    #- ASYNC_FLUSH 异步刷盘
    #- SYNC_FLUSH 同步刷盘
    flushDiskType=ASYNC_FLUSH
    

    其中注意:

    • 同步刷盘和异步刷盘指的是——内存和磁盘的关系。
    • 同步复制和异步复制指的是——Master节点和slave节点的关系。

    source: RocketMQ(4)---RocketMQ核心配置讲解

    3️⃣SpringBoot集成RocketMQ

    4️⃣高级特性

    5️⃣原理解惑

    主要参考:
    1、雨点的名字. MQ消息队列

    相关文章

      网友评论

          本文标题:RocketMQ

          本文链接:https://www.haomeiwen.com/subject/mkuayctx.html