Apache RocketMQ是一款具备低延迟,高性能和可靠性,数十亿容量和灵活可扩展性的分布式消息传递和流媒体平台。它由NameServer、Broker、Producer以及Consumer四部分构成,以下图所示:shell
全部的集群都具备水平扩展能力,无单点障碍。apache
NameServer Cluster(名称服务器集群)bash
名称服务器提供轻量级服务发现和路由。每一个NameServer记录完整的路由信息,提供相应的读写服务,并支持快速存储扩展。服务器
Broker Cluster(代理服务集群)微信
Broker经过提供轻量级主题和队列机制来处理消息存储。它们支持Push和Pull模型,包含容错机制(2个副本或3个副本),并提供强大的峰值填充和以原始时间顺序累积数千亿条消息的能力。此外,Broker提供灾难恢复,丰富的指标统计数据和警报机制,而传统的消息传递系统都缺少这些机制。并发
Producer Cluster(生产者集群)负载均衡
生产者支持分布式部署。分布式生产者经过多种负载均衡模式向Broker集群发送消息。发送过程支持快速失败并具备低延迟。异步
Consumer Cluster(消费者集群)分布式
消费者也支持Push和Pull模型中的分布式部署,它还支持群集消费和消息广播。提供了实时的消息订阅机制,能够知足大多数消费者的需求。ide
NameServer是一个功能齐全的服务器,主要包含两个功能:
所以,在启动代理和客户端以前,须要提供名称服务器地址列表告诉他们如何访问名称服务器。在Apache RocketMQ中,这能够经过四种方式详情完成。
代理服务器负责消息存储和传输,消息查询,HA保证等。代理服务器有几个重要的子模块,以下图所示:
生产者将业务应用系统生成的消息发送给Broker。 RocketMQ提供了多种发送模式:同步,异步和单向。
相同角色的生产者被组织到一块儿。在事务提交后,生产组中的不一样实例均可以链接broker执行提交或回滚事务,以防原生产者在提交后就挂掉。
警告:考虑到生产者有很强的消息发送能力,每一个生产者组只容许有一个实例用来避免没必要要的初始化。
消费者从Broker获取消息并将其提供给应用程序。从用户应用的角度来看,提供了两种类型的消费者:
具备彻底相同角色的消费者被组合在一块儿并命名为消费者组,消费群体是一个很好的概念,它在消息消费方面实现负载平衡和容错目标是很是容易的。
警告:消费者组的消费者实例必须具备彻底相同的主题订阅。
主题是生产者提供消息和消费者提取消息的类别。主题与生产者和消费者的关系很是松散,具体而言,一个主题可能有零个,一个或多个向其发送消息的生产者;相反,生产者能够发送不一样主题的信息;从消费者的角度来看,一个主题可能由零个,一个或多个消费者群体订阅。一样,一个消费群体能够订阅一个或多个主题,只要这个群体的实例保持其订阅的一致性便可。
消息是要传递的信息。一条消息必须有一个主题,能够将其解释为要发送给您的信件的地址。一条消息也可能有一个可选标签和额外的键值对。例如,您能够为消息设置业务密钥,并在Broker上查找消息以在开发期间诊断问题。
主题被划分为一个或多个子主题这就是消息队列。
标签能够理解为更细一级的主题,为使用者提供更灵活的查找。使用标记,来自同一业务模块的具备不一样目的的消息可能具备相同的主题和不一样的标记。标签将有助于保持代码的清洁和一致性,而且标签还能够方便RocketMQ提供的查询系统。
Broker是RocketMQ系统的主要组成部分。它接收生产者发送的消息,存储消息并准备处理来自消费者的请求。它还存储消息相关的元数据,包括消费者组,消耗进度偏移和主题/队列信息。
名称服务器做为路由信息提供者。生产者/消费者客户端查找主题以找到相应的Broker列表。
当使用DefaultMQPushConsumer时,你可能须要决定消费是顺序的仍是并发的。
Orderly(顺序)
有序的消息意味着消息的使用顺序与生产者为每一个消息队列发送的顺序相同。若是你的使用场景要求必是须顺序的,你要确保只用一个队列存放消息。
警告:若是消费顺序被指定,最大的消费并发数就是这个消费者组的消息队列的订阅数。
Concurrently(并发)
并发使用消息时,消费消息的最大并发性仅受限于为每一个消费者客户端指定的线程池。
Download & Build from Release
> unzip rocketmq-all-4.2.0-source-release.zip
> cd rocketmq-all-4.2.0/
> mvn -Prelease-all -DskipTests clean install -U
> cd distribution/target/apache-rocketmq
复制代码
Start Name Server
> nohup sh bin/mqnamesrv &
> tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
复制代码
Start Broker
> nohup sh bin/mqbroker -n localhost:9876 &
> tail -f ~/logs/rocketmqlogs/broker.log
The broker[%s, 172.30.30.233:10911] boot success...
复制代码
Send & Receive Messages
> export NAMESRV_ADDR=localhost:9876
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId= ...
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
ConsumeMessageThread_%d Receive New Messages: [MessageExt...
复制代码
Shutdown Servers
> sh bin/mqshutdown broker
The mqbroker(36695) is running...
Send shutdown request to mqbroker(36695) OK
> sh bin/mqshutdown namesrv
The mqnamesrv(36664) is running...
Send shutdown request to mqnamesrv(36664) OK
复制代码
若是读完以为有收获的话,欢迎点赞、关注、加公众号【牛觅技术】,查阅更多精彩历史!!!: