RocketMQ架构
概观
Apache RocketMQ是一种具有低延迟,高性能和可靠性,万亿级容量和灵活可扩展性的分布式消息传递平台。它由四个部分组成:名称服务器,经纪人,生产者和消费者。它们中的每一个可以水平延伸而没有单个故障点。如上图截图所示。
NameServer集群
名称服务器提供轻量级服务发现和路由。每个名称服务器记录完整的路由信息,提供相应的读写服务,并支持快速存储扩展。
经纪人群
经纪人通过提供轻量级的TOPIC和QUEUE机制来处理消息存储。它们支持Push和Pull模式,包含容错机制(2份或3份),并提供强大的峰值填充和容量,以原始时间顺序累积数百亿条消息。此外,Brokers还提供灾难恢复,丰富的度量统计数据和警报机制,所有这些都是传统邮件系统中缺乏的。
生产者集群
生产商支持分布式部署。分布式生产者通过多种负载平衡模式向Broker群集发送消息。发送过程支持快速故障并具有低延迟。
消费群
消费者也支持Push和Pull模式中的分布式部署。它还支持群集消息和消息广播。它提供实时消息订阅机制,可以满足大多数消费者的需求。RocketMQ的网站为感兴趣的用户提供了一个简单的快速入门指南。
名称服务器
NameServer是一个功能齐全的服务器,主要包括两个功能:
- 经纪人管理,NameServer接受来自Broker集群的注册,并提供心跳机制来检查代理是否存活。
- 路由管理,每个NameServer将保存有关代理群集的完整路由信息和客户端查询的队列信息。
我们知道,RocketMQ客户端(Producer / Consumer)会从NameServer查询队列路由信息,但客户端如何查找NameServer地址?
将NameServer地址列表提供给客户端有四种方法:
- 程序化的方式,像
producer.setNamesrvAddr("ip:port")
。 - Java选项,使用
rocketmq.namesrv.addr
。 - 环境变量,使用
NAMESRV_ADDR
。 - HTTP端点。
有关如何查找NameServer地址的详细信息,请参考这里。
经纪服务器
代理服务器负责消息存储和发送,消息查询,HA保证等。
如下图所示,Broker服务器具有重要的子模块:
- 代理进入的Remoting Module处理来自客户端的请求。
- 客户经理管理客户(生产者/消费者),维护消费者的主题订阅。
- 存储服务,提供简单的API来存储或查询物理磁盘中的消息。
- HA服务提供主代理和从属代理之间的数据同步功能。
- 索引服务,通过指定的密钥构建消息的索引,并提供快速的消息查询。
RocketMQ JVM / Linux配置
这是配置RocketMQ代理JVM / OS参数的简介。它指出在部署RocketMQ群集之前应该考虑的某些特定配置。
推荐使用最新版本的JDK 1.8,使用服务器编译器和8g堆。设置相同的Xms和Xmx值,以防止JVM调整堆大小以获得更好的性能。简单的JVM配置如下所示:JVM选项
-server -Xms8g -Xmx8g -Xmn4g
如果您不关心RocketMQ代理的启动时间,请预先触摸Java堆,以确保在JVM初始化期间将分配每个页面是更好的选择。那些不关心引导时间的人可以启用它:
-XX:+AlwaysPreTouch
禁用偏置锁定可能会减少JVM暂停:
-XX:-UseBiasedLocking
对于垃圾收集,建议使用G1收集器,采用JDK 1.8:
-XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30
这些GC选项看起来有点激进,但在我们的生产环境中已经证明了它们的良好性能。
不要设置太小的值-XX:MaxGCPauseMillis
,否则JVM将使用一个小的年轻一代来实现这一目标,这将导致非常频繁的次要GC。
并推荐使用滚动GC日志文件:
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m
如果写入GC文件会增加代理的延迟,请将重定向GC日志文件考虑在内存文件系统中:
-Xloggc:/dev/shm/mq_gc_%p.log
Linux内核参数
有一个os.sh
脚本,列出了文件夹中的大量内核参数bin
,可以用于轻微更改的生产用途。以下参数需要注意,详细信息请参考/ proc / sys / vm / * [1]的文档。
vm.extra_free_kbytes,告诉虚拟机在背景回收(kswapd)启动的阈值和通过分配进程直接回收的阈值之间保持额外的可用内存。RocketMQ使用此参数来避免内存分配中的高延迟。
vm.min_free_kbytes,如果将其设置为低于1024KB,您的系统将被微妙地破坏,并且在高负载下容易出现死锁。
vm.max_map_count限制进程可能拥有的内存映射区域的最大数量。RocketMQ将使用mmap来加载CommitLog和ConsumeQueue,因此建议为此参数设置一个较大的值。
vm.swappiness,定义内核如何有效地交换内存页面。更高的价值观会增加积极性,较低的价值会降低互换的数量。10为此值避免交换延迟建议。
文件描述符限制,RocketMQ需要为文件(CommitLog和ConsumeQueue)和网络连接打开文件描述符。我们建议为文件描述符设置655350。
磁盘调度程序推荐使用最终期限I / O调度程序,RocketMQ尝试为请求提供有保证的延迟[2]。
参考
- https://www.kernel.org/doc/Documentation/sysctl/vm.txt
- https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/ch06s04s02.html