EMQ消息队列配置问题

  • EMQX 版本: 4.0.0

  • 问题

  1. emqx.conf 配置文件中这两个参数有什么区别
    zone.internal.max_mqueue_len
    zone.external.max_mqueue_len

  2. 消费端 断开连接,日志报错: maximum heap size reached。 上面设置的队列大小,对这个错有影响么?

  3. 每个客户端 ,服务器是不是会分配一个独立的 队列空间。这个队列空间的大小怎么设置?设置的是消息的数量,还是长度。这个队列大小的设置,跟服务器的那些配置相关。

zone 的使用你可以参考一下我们官方配置说明文档中的 Zone & Listener 部分。

与 maximum heap size 相关的是 force_shutdown_policy 这个配置项,用于指定客户端进程的进程邮箱中堆积超过多少条消息或者消息总大小超过多少后,将强制关闭该客户端进程。这和前面的消息队列是两回事情。

Erlang 进程之间投递消息都是先投递到相应进程的邮箱中,然后该进程异步消费。如果邮箱的消息一直增多,这意味着进程目前难以及时消费。

max_queue_len 设置的消息队列,是用于在飞行窗口满或者连接断开的时候暂存 QoS 1 和 QoS 2 消息的。

某种程度上来讲,所有的 QoS 1 和 QoS 2 消息,都是先进入进程邮箱,被进程消费后再决定是直接下发给客户端,还是暂存至消息队列。

1 个赞

追问:
那请问,丢消息的场景,和这个force_shutdown_policy项 有关系么?按道理说,队列一满,消费进程就断了,只要消费进程没有断,就不可能存在丢消息的场景。

消息队列满了以后,如果还有新的消息到达,就会按照先进先出的原则从消息队列中删除旧消息了。

所以这种情况下,是会出现消息丢失的。

1、也就是说,邮箱满了,消费端会断线,队列满了,消息会丢失
2、你这里说的 队列,配置的参数是哪一个啊?

消息队列最大长度的配置项就是前面提到的 max_queue_len 呀。

我做了一个测试:
生产端,1ms 发送一条消息,消费端100ms消费一条消息。
为什么每次都是消费端先断线,而不是先队列先丢消息。
按理说,消费端消费不过来的时候,队列可以选择丢弃消息,用不着让消费端掉线。

就是这里的原理 是怎么样的。

我根据你上面给我描述的,我的理解是:
消息先在emq服务端进入邮箱,emq服务端进程消费后,消息选择添加至队列,或直接发送给客户端消费。那是不是可以理解,邮箱应该是不会堵塞的。因为邮箱会将消息发给队列和客户端,堵塞的话应该也是队列堵塞。这样的么

4.0.0 比较老了,印象中会因为发送缓冲区满导致进程阻塞,所以消息会一直在邮箱中堆积。