Apache RocketMQ是一个分布式消息和流处理平台,具备低延迟,高性能和高可靠性,亿万级容量和灵活的可扩展性。它由四部分组成:名称服务器,代理服务器,生产者和消费者。它们中的每个均可以水平扩展,而不会出现单点故障。如上图所示。git
名称服务器集群github
名称服务器提供轻量级服务发现和路由。每一个名称服务器记录完整的路由信息,提供相应的读写服务,支持快速的存储扩展。shell
代理集群apache
代理关注的是消息存储,它经过提供轻量级主题(TOPIC)和队列(QUEUE)机制来处理消息存储。他们支持推,拉模型,包含容错机制(2个副本或3个副本), 可以抵御强峰值,而且按序积压千亿条消息的的功能。此外,代理还提供容灾,丰富的度量统计数据和报警机制,这些都是传统消息系统所缺乏的。编程
生产者集群设计模式
生产者支持分布式部署,分布式生产者经过多种负载平衡模式向代理集群发送消息,发送进程支持快速故障和低延迟。bash
消费者集群服务器
消费者集群也支持推,拉模式的分布式部署。它还支持集群消费和消息广播。它提供了实时消息订阅机制,能够知足大多数消费者的需求,RocketMQ的网站为感兴趣的用户提供了一个很是简单的快速入门指南。架构
名称服务器是一个功能齐全的服务,主要包含两个功能:并发
如咱们所知,RocketMQ客户端(生产者/消费者)将从NameServer查询队列路由信息,可是客户端如何找到NameServer地址的呢?
有四种方式向客户端提供名称服务器地址列表,以下:
producer.setNamesrvAddr("ip:port")
.rocket.namesrv.addr
.NAMESRV_ADDR
.关于更深刻的介绍客户端如何找到NameServer地址的,请查看这里
代理服务器负责消息存储和传递,消息查询,高可用保证等。
以下图所示, 代理服务器有如下几个重要的子模块:
本节介绍生产就绪,部署解决方案。通常来讲,咱们正在部署一个没有单点故障的弹性RocketMQ集群。
在开始本节以前,请确保您已经阅读了快速上手部分,而且熟悉RocketMQ的核心概念和组件。
生产就绪部署
为了确保集群在一个实例宕机时仍然可以正常工做,建议使用两个或多个名称服务器实例,只要有一个名称服务器实例处于存活状态,整个集群就保持服务状态。
名称服务器遵循无共享设计模式,代理服务器将心跳数据发送到全部名称服务器,生产者和消费者能够在发送/消费消息时从任何可用的名称服务器查询元数据。
代理能够根据其角色分为两类:主代理和从代理。主代理提供RW(读写)访问,而从代理只接收读访问。
要在没有单点故障的状况下部署高可用RockeMQ集群,应该部署一系列代理集。一个代理集包含一个主代理和几个从代理,其中主代理brokerid设置为0,从代理brokerid设置为非0便可。一组代理集中都代理有相同的代理名称(brokerName)。在极端状况下,在一个代理集中至少须要设置两个代理。每一个主题驻留在两个或多个代理中。
部署RocketMQ集群时,建议使用如下配置:
Broker configuration
Property Name | Default value | Details |
---|---|---|
listenPort | 10911 | listen port for client |
namesrvAddr | null | name server address |
brokerIP1 | InetAddress for network interface | Should be configured if having multiple addresses |
brokerName | null | broker name |
brokerClusterName | DefaultCluster | this broker belongs to which cluster |
brokerId | 0 | broker id, 0 means master, positive integers mean slave |
storePathCommitLog | $HOME/store/commitlog/ | file path for commit log |
storePathConsumerQueue | $HOME/store/consumequeue/ | file path for consume queue |
mapedFileSizeCommitLog | 1024 * 1024 * 1024(1G) | mapped file size for commit log |
deleteWhen | 04 | When to delete the commitlog which is out of the reserve time |
fileReserverdTime | 72 | The number of hours to keep a commitlog before deleting it |
brokerRole | ASYNC_MASTER | SYNC_MASTER/ASYNC_MASTER/SLVAE |
flushDiskType | ASYNC_FLUSH | {SYNC_FLUSH/ASYNC_FLUSH}. Broker of SYNC_FLUSH mode flushes each message onto disk before acknowledging producer. Broker of ASYNC_FLUSH mode, on the other hand, takes advantage of group-committing, achieving better performance. |
RocketMQ提供了一个CLI(命令行界面)管理工具,用于查询,管理和诊断各类问题。
如何得到
管理工具是随RocketMQ一块儿提供,你要么下载一个预构建的二进制版本,要么本身从源代码构建,这样你就拥有它了。
若是您须要源代码, RocketMQ工具模块包含其源代码。
如何使用
管理工具很是容易使用,这里处于演示的目的,假设为Linux的环境。在mq安装目录下的/bin目录中,使用bash命令: mqadmin, 就能够看到如下的帮助菜单:
The most commonly used mqadmin commands are:
updateTopic Update or create topic
deleteTopic Delete topic from broker and NameServer
updateSubGroup Update or create subscription group
deleteSubGroup Delete subscription group from broker
updateBrokerConfig Update broker's config
updateTopicPerm Update topic perm
topicRoute Examine topic route info
topicStatus Examine topic Status info
topicClusterList get cluster info for topic
brokerStatus Fetch broker runtime status data
queryMsgById Query Message by Id
queryMsgByKey Query Message by Key
queryMsgByUniqueKey Query Message by Unique key
queryMsgByOffset Query Message by offset
queryMsgByUniqueKey Query Message by Unique key
printMsg Print Message Detail
sendMsgStatus Send msg to broker
brokerConsumeStats Fetch broker consume stats data
producerConnection Query producer's socket connection and client version
consumerConnection Query consumer's socket connection, client version and subscription
consumerProgress Query consumers's progress, speed
consumerStatus Query consumer's internal data structure
cloneGroupOffset Clone offset from other group
clusterList List all of clusters
topicList Fetch all topic list from name server
updateKvConfig Create or update KV config
deleteKvConfig Delete KV config
wipeWritePerm Wipe write perm of broker in all name server
resetOffsetByTime Reset consumer offset by timestamp(without client restart)
updateOrderConf Create or update or delete order conf
cleanExpiredCQ Clean expired ConsumeQueue on broker.
cleanUnusedTopic Clean unused topic on broker
startMonitoring Start Monitoring
statsAll Topic and Consumer tps stats
syncDocs Synchronize wiki and issue to github.com
allocateMQ Allocate MQ
checkMsgSendRT Check message send response time
clusterRT List All clusters Message Send RT
复制代码
为了确保不会丢失任何成功发布的消息,RocketMQ提供了一种复制模式,经过两种复制方式: 同步和异步,以得到更强的持久性和高可用性。
主从复制: 同步/异步代理
与许多复制系统同样,同步代理要等到提交日志被复制到从服务器后才能确认。相反,异步代理在主服务器上处理消息后当即返回。
如何配置
在conf文件夹下的rocketmq发行版附带了三个预构建的配置供您参考。
2m-2s-sync
2m-2s-async
2m-noslave
复制代码
注意: 全部的配置使用异步刷新的方式.
部署
以2M-2S-SYNC的部署为例,首先,启动两个名称服务器,如快速启动部分所示: 假设他们的IP为192.168.0.2和192.168.0.3
开启代理(假设二进制rocketmq位于/home/rocketmq/dist)
>cd /home/rocketmq/dist/bin
>bash mqbroker -c ../conf/2m-2s-sync/broker-a.properties -n 192.168.0.2:9876,192.168.0.3:9876
>bash mqbroker -c ../conf/2m-2s-sync/broker-a-s.properties -n 192.168.0.2:9876,192.168.0.3:9876
>bash mqbroker -c ../conf/2m-2s-sync/broker-b.properties -n 192.168.0.2:9876,192.168.0.3:9876
>bash mqbroker -c ../conf/2m-2s-sync/broker-b-s.properties -n 192.168.0.2:9876,192.168.0.3:9876
How to verify
Execute the following command to verify according to the CLI section:
> bash mqadmin clusterlist
复制代码
了解了MQ的一些基本模型和概念以后,咱们能够深刻探讨消息传递系统设计的一些问题:
生产者将业务应用程序系统生成的消息发送给代理服务器,RocketMQ提供了多种发送模式: 同步,异步和单向传输。
生产组
相同角色的生产者被分组在一块儿。若是一台生产者实例在处理事务时宕机了,代理能够联系同一辈子产者组的不一样生产者实例来提交或者回滚事务。
考虑到所提供的生产者在发送消息时足够强大,每一个生产组只容许一实例,以免没必要要的生产者实例初始化。
消费者从代理服务器中拉取消并将消息输入应用程序。从用户应用的角度来看,提供了两种类型的消费者:
推送消费者
另外一方面,punsh-consumer封装了消息拉取,消耗进度和维护内部的其余工做,为最终用户留下一个回调接口来实现,该接口将在消息到达时执行。
拉取消费者
拉消费者积极从代理服务器中拉取消息,一旦一批消息被拉取出来,用户应用程序就会启动消费过程。
消费组
与前面提到的生产者组相似,具备彻底相同角色的消费者被分组在一块儿,并命名为消费者组。
消费组是一个很好的概念,使得在消息消费方面,实现负载均衡和容错的目标很是容易。
注意:消费者组的消费实例必须具备彻底相同的主题订阅.
主题是生产者投递消息,消费者拉取消息的一个类别。主题的生产者,消费者的关系很是松散。具体来讲,一个主题能够有0个,1个或者多个向其发送消息的生产者;相反,生产者能够发送不一样主题的消息。从消费者角度来看,一个主题能够由0个,1个或多个消费者群体订阅。一样,只要消费组的实例保持订阅一致,用户组就能够订阅一个或多个主题。
消息是要传递的信息。消息必须有一个主题,能够将其解释为要邮寄信件的地址。消息还能够具备可选的标记和额外的键值对。例如,您能够为消息设置业务ke,并在代理服务器上查找消息,以诊断开发过程当中的问题。
消息队列
主题被划分为一个或多个子主题:"消息队列"。
标签
换句话说,标签子主题为使用者提供了额外的灵活性。对于标签,来自同一业务模块的具备不一样目的的消息,可能具备相同的主题和不一样标记。标签将有助于保持代码的整洁和一致,并且标签还能够帮助RocketMQ提供的查询系统。
代理
代理是RocketMQ系统的主要组成部分,它接收来自生产者的消息,存储它们,并准备处理来自消费者的拉取请求。它还存储与消息相关的元数据,包括消费组,消费进度偏移量和主题/队列信息。
名称服务器用做路由信息提供者。生产者/消费者客户端查找主题以查找相应的代理列表。
当使用DefaultMQPushConsumer时,您能够决定是有序的或者是并发的消费消息。
按顺序消费消息意味着,消息的消费顺序与生产者为每一个消息队列发送的顺序相同,若是您正在处理全局顺序是必需的场景,请确保您使用的主题只有一个消息队列。
注意:若是指定了按顺序消费,则消息消费的最大并发性是消费组订阅的消息队列数。
当并发消费消息时,消费的最大并发性仅仅受每一个消费者客户端指定的线程池的限制。
注意:在此模式下,再也不保证消息的顺序