tcp连接上设置限流的问题

版本:image: emqx:5.4.1
OS:MacOS Sonoma 14.0

尝试在EMQX设置限流来防止单客户端意外发出过多消息,通过查阅官方文档 Rate Limit | EMQX Documentation
在配置文件 emqx.conf 中添加了如下配置

listeners.tcp.default {
  bind = "0.0.0.0:1883"
  max_conn_rate = "1000/s"
  messages_rate = "200/s"
  bytes_rate = "1MB/s"
  max_connections = 1024000
}

重启EMQX后,启动两个 python 的客户端以高于设定速率向特定 topic 发送消息,并利用EMQX Dashboard观察”Incoming Rate“指标,可见收包速率的确被限制在设定值附近

比如以下是两个客户端分别以500messages/s的速率的测试结果

现在想咨询的问题有如下两个:

  1. 被限流message的去向

原本猜测被限流的过量message会被EMQX丢弃,同时这也符合我们的目标预期。
为了验证,采取了如下实验:

在限流设置不变(200 message/s)的情况下,一个python客户端以 500 messages/s 的速率发送 qos=0 的消息,消息的内容为从0递增的数字,用MQTTX工具订阅同一主题检查消息的接收情况

从测试的结果来看,几乎所有消息能够被MQTTX收到。从现象分析,在以高于设定速率发送消息时,EMQX的输出中没有任何与限流相关的日志项,并且我在 17:51:33 关闭发送客户端后,

至少直到 17:51:41 ,EMQX的输出中仍能看到收到PUBLISH消息的日志

同时,EMQX能够收到所有消息,其中消息内容亦没有出现断号现象

由此判断消息是先存储在某种缓冲区中,再以设定的速率处理,想知道这种理解是否正确。
在我们的场景中,丢弃消息是更为妥当的做法,官方是否提供丢弃消息的选项。

  1. 第二个问题是当我把速率设置为 5 messages/s 时,EMQX的行为表现出明显异常,具体为在 Dashboard 显示的“Incoming Rate”统计极不平滑,在客户端以恒定速率发送消息时,很多时间段 Dashboard 显示 Incoming Message 数量为0

[新用户无法超过发出5张图片,此图省略]

在接收端收到的消息顺序还会出现与发送顺序完全相反

此种现象的原因是什么,是否有其他设置项可以改善这一现象?

  1. 之前有丢弃的选项,后来简化配制时去掉了
  2. 受实现限制,速率设置过低时( <= 10/s), 限制器无法平滑的工作

被限流消息的去向

关于这个问题我想再澄清一下,我想了解「当某个发布端被限流时,超出发布速度的消息」是保存在哪里?

因为我看到发布端被关闭后,仍然有消息持续的派发到订阅端。

在订阅方的会话里

谢谢回复。
那么可以理解为只要不要把速率设置得过小(例如可以设置为200/s)限流器就能良好的工作
只是超过的消息并不会被丢弃,依然在后续被消费,相当于起到一个削峰填谷的作用。
而我们的场景里,是希望当某些组件出故障时,在限流器处拦截过量消息,以免异常扩散到其他地方。在正常情况,我们会设置一个比较保险的速率值使得限流器不影响正常流量通过。在异常的时候,关注消息的内容已经没有意义了,我认为丢弃是比较合适的,请问官方是如何考虑限流器的作用的,是否有考虑增加丢弃的功能呢

感谢你的建议,目前是有有丢弃的功能,只是没有暴露出来,我们先内部评估下

@blankalupo
您好,rate limit只作用于收信客户端,对发送端是没有限制的吧
还有,对于qos1的话,确保一条消息到达的所需信令消息会占用限额吗