疑问:关于消息持久化的疑问

问题描述

正常来说MQ内置数据持久化是为了确保消息不丢失,重启可以恢复数据,emqx的设计是允许消息丢失吗?(我可以这样理解?)

持久化的能力不是为了消息不丢失,是为了数据不丢失,概念上不要混淆。MQTT消息publish出来没有接受者就会丢失,持久化的能力是指,对所有的消息进行记录,把数据持久化下来。EMQ X是broker不是消息队列,持久化属于拓展的能力。

1 个赞

emqx 中的消息队列都是保存在内存中,重启之后,会话就消失了,那些遗留的消息也就丢了。有没有什么方法可以使没有被消费的消息保存下来,重启之后再加载到内存中?

有解决方案,参考文档,但是broker的设计不是这样的,保证服务质量是第一要求,宕机的可能非常小。

1 个赞

文档中写道:

EMQX 企业版产品中,可以通过规则引擎或插件的方式,持久化消息到 Redis、MongoDB、Cassandra、MySQL、PostgreSQL 等数据库,以及 RabbitMQ、Kafka 等消息队列

那么,如果消息持久化的速度跟不上消息产生的速度,这个时候EMQX节点宕机了,那么 是不是意味着,有部分消息会丢失?

企业用户在投入前都需要做性能评估,确保整个系统是可控的;
4.x 版本中关键的 规则引擎 Kafka 桥接我们设计了磁盘缓存功能,确保消息过多、资源吞吐能力跟不上、资源短暂异常的时候可以缓存到本地磁盘上,5.0 的企业版中这一能力会添加到所有外部资源上。

PS:细分来说持久化应该包含:MQTT 会话持久化与 MQTT 消息持久化,前者的开源版会在 5.1 支持:基于 RocksDB 实现高可靠、低时延的 MQTT 数据持久化 | EMQ

我在开源版的文档中 看到了 storage_type 这个配置项

storage_type: ram | disc

  • default: ram

这个配置的作用是 选择消息是存放在磁盘还是内存中。
这个配置项 跟上面提到的【磁盘缓存】是类似的功能吗?

按道理来说,既然支持放在磁盘中,那么即使宕机,重启之后消息也不会丢失
不知道开源版支不支持 storage_type:disk 这个配置?

你好,这个配置项只限于指定保留消息的存储方式。目前开源版尚不支持持久化会话消息到磁盘。