zoukankan      html  css  js  c++  java
  • RocketMQ生产部署架构如何设计

     

    前言

    看了我们之前的文章,相信小伙伴们对RocketMQ已经有了一个初步的了解,那么今天我们就来聊一聊具体如何来设计一套高可用的生产部署架构。

    在聊如何设计这套架构的同时,我们再补充一些之前没提到的知识。好了,那我们现在开始吧。

     

    NameServer的部署

    关于NameServer,我们之前的文章已经详细讲解过了集群化的内容,这里直接把它部署到三台机器上,作为一个高可用集群,如果忘记了,小伙伴们参考一下这篇文章聊一聊RocketMQ的注册中心NameServer,本篇文章就不再细聊了。

     

    Broker的部署

    Broker的部署我们之前也有讲到过,主要使用的是4.5版本后的Dledger自动化切换主从的集群,详细内容可参考Broker的主从架构是怎么实现的?

    之前在讲NameServer的文章中,我们聊了聊Broker是如何与NameServer进行通信的,但当时有些细节没有说到。

    Broker与NameServer之间的通信协议是什么呢?http、rpc还是tcp呢?

    其实它们之间采用的是TCP长连接通信,也就是说Broker会跟每个NameServer建立TCP长连接,然后定时通过TCP长连接发送心跳请求过去。

    后边的情况就不再细说了,聊一聊RocketMQ的注册中心NameServer这篇文章中已经讲过了。

    访问MQ的系统(生产者和消费者)的部署

    一定会有大量的系统访问RocketMQ,因为RocketMQ就是为此而生的,有些系统自己本身既是生产者又是消费者,所以这些系统的部署也要考虑进去。

    对这些系统部署的考虑,其实不应该是搞MQ的部门来考虑的,如果系统本身是自己公司的,可以提出一些建议,让生产者和消费者都集群化部署,保证高可用。但如果是第三方系统,那就无法插手了,我们能做到的只有考虑第三方系统崩溃,无法与MQ正常通信的情况下,如何让MQ正常运转。

    Topic是什么

    Topic是mq的核心数据模型,如果直接翻译是主题的意思,但是听到主题的解释,是不是一脸懵逼,是不是瞬间想到的是手机主题,电脑主题。

    所以它不能直译,它表达的就是一个数据集合的含义,集合的是同一类的数据,不同类型的数据存到不同的Topic中。

    所以系统无论是要写入消息还是读取数据,最开始都是要先定义Topic的,然后再从定义的Topic中获取同类型的数据。

    那么Topic是如何在Broker中存储的呢?

    其实之前的文章你懂RocketMQ 的架构原理吗?中已经聊过RocketMQ是如何存储大量消息数据的。

    存储的方式其实就是分布式存储。我们在定义Topic的时候指定它里面的数据分布到多台的Broker上进行存储,这里要注意的一点是,实际上分布的对象是MasterBroker,SlaveBroker会向MasterBroker拉取数据,作为一个副本存在。而Broker在向NameServer发送心跳的时候,会把Topic存储在哪些Broker中的信息告诉NameServer。

    生产者如何发送消息给Broker

    前边我们聊过,发送消息前首先是定义Topic,然后发送消息的时候是要指定你要发送到哪个Topic中去的。

    既然我们知道了要发送到哪个Topic中,下一步就是要定位Topic的位置,如何定位呢?就是与NameServer建立Tcp长连接,定时拉取注册信息,可以获取到这个Topic目前被分配到哪些Broker中。然后就可以根据负载均衡算法,选定一台Broker(具体的负载均衡算法后边文章再介绍)。

    选定了Broker后,就可以再与Broker建立Tcp长连接,通过Tcp长连接发送消息给Broker中的Topic。

    而Broker在接收到消息后,就会把消息存储到磁盘中,再往后就是SlaveBroker与MasterBroker数据同步,形成副本,保证高可用了。

    整个过程就是这样的。

    消费者如何从Broker上消费消息

    说完了生产者发送消息的过程,我们再来聊聊消费者消费消息的过程。

    其实消费者消费消息的过程和生产者是类似的,同样第一步也是定义Topic,然后从NameServer获取信息,定位到Topic所在的多个Broker,之后负载均衡定位到要访问的Broker,与Broker建立连接获取消息。

    这里唯一不同的就是,再获取消息的时候是可能在MasterBroker上获取的,也可能在SlaveBroker上获取,要依据当时的情况而定。想要了解具体什么时候访问Master,什么时候访问Slave,可以参考Broker的主从架构是怎么实现的?这篇文章。

    整体架构总结

    最后我们再来看一看这套架构,是可以实现完全的高可用的。

    NameServer集群化部署,Broker集群化部署,还可以通过Dledger自动化切换主从,生产者消费者也是集群部署,随便挂了一台不受影响。

    而且这套架构也不怕高并发,高并发下的消息可以分布到多个Broker下处理,减少系统压力。

    然后我们的集群可以存储海量的消息,因为存储方式是分布式存储的。

    最后,这套架构是具有可扩展性的,如果业务需求并发量增大,也是可以扩展Broker的数量以支持更高的并发和更大的存储的。

    这样我们的RocketMQ的生产部署架构就算完成了。

    好了,今天就说到这里,欢迎小伙伴们继续阅读本专辑,一起走入消息中间件的世界。

    往期文章推荐:

    中间件专辑:

    什么是消息中间件?主要作用是什么?

    常见的消息中间件有哪些?你们是怎么进行技术选型的?

    你懂RocketMQ 的架构原理吗?

    聊一聊RocketMQ的注册中心NameServer

    Broker的主从架构是怎么实现的?

    算法专辑:

    和同事谈谈Flood Fill 算法

    详解股票买卖算法的最优解(一)

    详解股票买卖算法的最优解(二)

  • 相关阅读:
    ASP.NET编程的十大技巧
    C#学习心得(转)
    POJ 1177 Picture (线段树)
    POJ 3067 Japan (树状数组)
    POJ 2828 Buy Tickets (线段树)
    POJ 1195 Mobile phones (二维树状数组)
    HDU 4235 Flowers (线段树)
    POJ 2886 Who Gets the Most Candies? (线段树)
    POJ 2418 Cows (树状数组)
    HDU 4339 Query (线段树)
  • 原文地址:https://www.cnblogs.com/lm970585581/p/13645406.html
Copyright © 2011-2022 走看看