增强
改进 EMQX 集群的自愈能力。
此前,EMQX 只能自愈比较简单的脑裂情况,其他情况无法自愈:
- 当其中某一个节点能与所有的节点保持联系时,以该节点为基准节点,重启其他节点以恢复集群。
- 当脑裂为两个子集群时,重启其中节点数量较少的子集群,以恢复集群。
改进后,即使脑裂成为多个复杂的、不对称的集群,EMQX 也能自愈。
优化 EMQX 处理通配符订阅、取消订阅的性能。
此改进将前缀树表从需要在节点之间复制的
mnesia
表改为了ETS
表,从而省去了在节点之间同步前缀树信息所花费的时间。 改进后,EMQX 的订阅处理是异步的:- 首先 EMQX 在本地更新前缀树和路由记录,并回复 SUBACK。
- 路由信息被异步地更新到其他节点,然后其他节点会更新自己的前缀树。
此优化将会显著提升 EMQX 处理订阅、取消订阅的性能,特别是当节点数量较多、节点之间网络延迟较大时。
注意,若集群中存在老版本的 EMQX 节点,在老版本节点上新增的通配符订阅可以正常地在新版本节点上建立前缀树,但反之不行。这意味着在滚动升级过程中,在刚刚升级完成的新版本节点上订阅通配符主题,可能无法收到来自老版本节点的消息。在所有节点升级完毕之后,该问题被自动解决。在某个节点升级完成之后,前缀树将会通过路由表重建,所以路由信息并不会在滚动升级中丢失。
优化规则引擎的匹配性能。
此优化通过缓存主题前缀树,以及移除过多的拆分主题的操作,改进了规则引擎的匹配性能。此优化对于规则较多的情形会更为显著。
Kafka 动作新增 “缓冲最大等待时间” 选项。
该选项控制每个分区的生产者收集消息,然后以成批次的方式写入缓冲区的最大等待时间。 默认值
0ms
表示不等待。对于非内存缓冲模式,建议至少配置5ms
以减少 IOPS。将告警的处理改为异步模式。
此前告警是同步处理的,大量的
conn_congestion
告警会影响 MQTT 连接进程处理消息。 现在告警改为异步模式,同时增加了过载保护,在告警系统过载时,告警将进入持续一分钟的 “静默期”,此期间任何告警都会被丢弃。支持监控进程消息队列长度并告警。
新增两个配置项
vm_mon.process_long_msgq
和vm_mon.process_alarm_top_n
,用于控制进程消息队列长度的监控和告警。vm_mon.process_long_msgq
:当 EMQX 中有进程的邮箱超过此长度时触发告警,默认值为80
。vm_mon.process_alarm_top_n
:当触发告警时,在告警信息中附带前N
个消息队列长度最长且不为零的进程,默认值为5
。
优化 CONNECT 报文解析失败的日志。
改进后,若 MQTT 连接因为 CONNECT 的可变报文头解析失败被断开,
esockd
将不再打印这样的错误日志,并且连接的断开原因将被标记为:malformed_connect_variable_header
:[error] supervisor: 'esockd_connection_sup - <0.5949.0>', errorContext: connection_shutdown, reason: {badmatch,<<>>}, offender: [{pid,<0.13949.4720>}, ...]
将日志改为 “始终异步” 模式。
此前
log.sync_mode_qlen
配置的默认值为 100,即当日志队列长度超过 100 时,日志将切换为同步模式。现将其改为 3000,与log.drop_mode_qlen
的默认值保持一致,这将让日志处理器始终工作在异步模式,并在队列长度超过 3000 时开始丢弃日志。优化慢订阅的性能。
此优化通过避免调用
ets:info(emqx_slow_subs_topk, size)
,略微减少了慢订阅功能的性能开销。减少通过热配置更新监听器所花费的时间。
此前,通过热配置更新监听器的配置时,EMQX 会依次更新并重启各个节点上的监听器,在连接数较多时,这可能会花费较长时间。 现在,通过使用
erpc:multicall/4
,EMQX 会并行更新各个节点上的监听器,从而减少所花费的时间。避免
ecpool_sup
被启动过慢的ecpool_worker
阻塞。
修复
修复用户名配额页面会丢失持久会话的用户名的问题。
修复前,持久会话的 MQTT 客户端,在重新上线之后,其用户名会从用户名配额页面消失。
修复日志限流导致性能下降的问题。
修复前,由于日志限流功能中存在的问题,当开启日志追踪后,EMQX 的资源消耗会显著增加。