保留消息流控不生效

错误报告

环境

  • EMQX 版本:5.0.11
  • 操作系统版本:centos7

重现此问题的步骤

  1. 在 后台设置保留消息的流控,每秒加载一条,以及每秒发布一条,我理解这样应该用客户端订阅通配符下的主题

预期行为

客户端收到的保消息消是每秒2条数据。

实际行为

实际确一下子收到很多消息。

你重启一下 EMQX 看看?可能跟刚刚的问题一样,也是配置还未生效。

你好,重启后也不能生效。

这个需要和流量控制系统联合使用才能生效,目前这里和流量控制系统的交后还没有在 dashboard 上实现,暂时只能通过配置实现

目前我只针对retain的消息进行流量控制,目前暂时不能单独使用吗?如果跟流量控制系统一起使用,这样是否限制了也会与非retain消息一起限制呢?

没太看懂最后一句是什么意思. 5.0 里面所有的流量控制都是由流控系统实现的,不同的功能如果需要进行流量控制,只要接入这套系统就行,相当于为这个功能提供了一个单独的流量控制服务,互相是隔离的。dashboard 这里还没完善 retain 的接入配置展示。

请问你指的流量控制系统是指以下这个这个配置吗?我按这个配置后retain的消也没有生效。按以下配置项,我每秒应该收到20/s条记录,实际还是收到一堆数据的。

retain 是这个配置,修改后应该重启才能生效。然后你这里的速率是 100/s ,不是 20/s. 这里的 client 指的是 retain 的每个线程,不是用户的客户端

你好,我把配置改成如下也是流控没有生效,还是会一订阅就一堆数据推过来的。
retainer {

@doc Enable retainer feature

@path retainer.enable

@type boolean()

@default true

enable = true

@doc Message retention time. 0 means message will never be expired.

@path retainer.msg_expiry_interval

@type emqx_schema:duration_ms()

@default 0s

msg_expiry_interval = 0s

@doc Periodic interval for cleaning up expired messages.

Never clear if the value is 0.

@path retainer.msg_clear_interval

@type emqx_schema:duration_ms()

@default 0s

msg_clear_interval = 0s

@path retainer.flow_control

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
   }
 }

}
}

我明天自己本地测试下,然后看看具体是哪儿的问题,到时候再答复你,请稍等下

请问一下你本地有验证过吗?在线等待结果。

我本地验证是没有问题的
配置:
image
结果

emqx.conf 中的部分配置项在第一次启动后进行修改,有可能不会生效。
你可以试一试清空 data 目录,修改好 emqx.conf 后重启看看

是的,清空的data,重新启动就可以了,谢谢!另外我想了解一下,capacity现在设成10,如果我把rate设成20/1s 这样超过capacity的数量会导致什么情况的结果呢?

rate 是令牌的生成速率,capacity 是用来限制令牌的数量上限的,大部分情况下应该是 capacity = rate * 1s
你这样设置的话,实际上最大的速率就是 20/1s,因为 capacity 始终是满的

了解,谢谢!

又发现一个BUG,有时我修改完里面的速率参数都得清空data目录才能生效,这样会导致我之前data保存的一些配置项会丢失。