错误报告
环境
- EMQX 版本:5.0.11
- 操作系统版本:centos7
重现此问题的步骤
- 在 后台设置保留消息的流控,每秒加载一条,以及每秒发布一条,我理解这样应该用客户端订阅通配符下的主题
预期行为
客户端收到的保消息消是每秒2条数据。
实际行为
实际确一下子收到很多消息。
客户端收到的保消息消是每秒2条数据。
实际确一下子收到很多消息。
你重启一下 EMQX 看看?可能跟刚刚的问题一样,也是配置还未生效。
你好,重启后也不能生效。
这个需要和流量控制系统联合使用才能生效,目前这里和流量控制系统的交后还没有在 dashboard 上实现,暂时只能通过配置实现
目前我只针对retain的消息进行流量控制,目前暂时不能单独使用吗?如果跟流量控制系统一起使用,这样是否限制了也会与非retain消息一起限制呢?
没太看懂最后一句是什么意思. 5.0 里面所有的流量控制都是由流控系统实现的,不同的功能如果需要进行流量控制,只要接入这套系统就行,相当于为这个功能提供了一个单独的流量控制服务,互相是隔离的。dashboard 这里还没完善 retain 的接入配置展示。
retain 是这个配置,修改后应该重启才能生效。然后你这里的速率是 100/s ,不是 20/s. 这里的 client 指的是 retain 的每个线程,不是用户的客户端
你好,我把配置改成如下也是流控没有生效,还是会一订阅就一堆数据推过来的。
retainer {
enable = true
msg_expiry_interval = 0s
msg_clear_interval = 0s
flow_control {
## @doc Size of the batch when reading messages from storage. 0 means no limit.
## @path retainer.flow_control.batch_read_number
## @type non_neg_integer()
## @default 0
batch_read_number = 1
## @doc The number of retained messages can be delivered per batch.
## @path retainer.flow_control.batch_deliver_number
## @type 0..1000
## @default 0
batch_deliver_number = 1
## @path retainer.flow_control.batch_deliver_limiter
batch_deliver_limiter {
## @doc Rate for this bucket.
## @path retainer.flow_control.batch_deliver_limiter.rate
## @type emqx_limiter_schema:rate()
## @default infinity
rate = "10/s"
## @doc The capacity of this token bucket.
## @path retainer.flow_control.batch_deliver_limiter.capacity
## @type emqx_limiter_schema:capacity()
## @default infinity
capacity = 10
## @doc The initial number of tokens for this bucket.
## @path retainer.flow_control.batch_deliver_limiter.initial
## @type emqx_limiter_schema:initial()
## @default 0
initial = 0
## @path retainer.flow_control.batch_deliver_limiter.client
## @link listeners.tcp.$name.limiter.client.bytes_in
client {
## @doc Rate for this bucket.
## @path retainer.flow_control.batch_deliver_limiter.client.rate
## @type emqx_limiter_schema:rate()
## @default infinity
rate = "20/s"
## @doc The initial number of tokens for this bucket.
## @path retainer.flow_control.batch_deliver_limiter.client.initial
## @type emqx_limiter_schema:initial()
## @default 0
initial = 0
## @doc If the remaining tokens are lower than this value,
## the check/consume will succeed, but it will be forced to wait for a short period of time.
## @path retainer.flow_control.batch_deliver_limiter.client.low_watermark
## @type emqx_limiter_schema:initial()
## @default 0
low_watermark = 0
## @doc The capacity of per user.
## @path retainer.flow_control.batch_deliver_limiter.client.capacity
## @type emqx_limiter_schema:capacity()
## @default infinity
capacity = 20
## @doc Is it possible to split the number of requested tokens?
## @path retainer.flow_control.batch_deliver_limiter.client.divisible
## @type boolean()
## @default false
divisible = false
## @doc The maximum retry time when acquire failed.
## @path retainer.flow_control.batch_deliver_limiter.client.max_retry_time
## @type emqx_schema:duration()
## @default 10s
max_retry_time = 10s
## @doc The strategy when all the retries failed.
## @path retainer.flow_control.batch_deliver_limiter.client.failure_strategy
## @type emqx_limiter_schema:failure_strategy()
## @default force
failure_strategy = force
}
}
}
}
我明天自己本地测试下,然后看看具体是哪儿的问题,到时候再答复你,请稍等下
请问一下你本地有验证过吗?在线等待结果。
emqx.conf 中的部分配置项在第一次启动后进行修改,有可能不会生效。
你可以试一试清空 data 目录,修改好 emqx.conf 后重启看看
是的,清空的data,重新启动就可以了,谢谢!另外我想了解一下,capacity现在设成10,如果我把rate设成20/1s 这样超过capacity的数量会导致什么情况的结果呢?
rate 是令牌的生成速率,capacity 是用来限制令牌的数量上限的,大部分情况下应该是 capacity = rate * 1s
你这样设置的话,实际上最大的速率就是 20/1s,因为 capacity 始终是满的
了解,谢谢!
又发现一个BUG,有时我修改完里面的速率参数都得清空data目录才能生效,这样会导致我之前data保存的一些配置项会丢失。