有没有办法从内存中驱逐 vernemq 缓存的 auth_on_register、auth_on_publish、auth_on_subscribe 挂钩数据

Is there a way to evict vernemq cached auth_on_register, auth_on_publish, auth_on_subscribe hook data from in memory

根据 vernemq 文档,挂钩数据存储在内存缓存中,不会主动处理。

我们有大约 36 万个客户端分布在 8 个节点的集群中。 客户端 ID、用户名和密码不会更改,并且对于 320k 客户端是固定的,而其余 40k 客户端则不断变化。这 40k 个客户端还最多订阅和发布 3 个主题。客户端倾向于一天一次从集群断开连接并连接回任何节点,因此挂钩数据被缓存在所有节点上并增加内存。内存每天都在增加,内存使用曲线一直没有变平。

问题:我担心在某些时候我们会遇到 OOM 错误并且节点可能会宕机。

我尝试使用 echo 命令(1 2 和 3)清除内存,但只有 buff 缓存内存被清除,挂钩数据没有。 有没有办法从内存中清除或驱逐钩子数据?

由于vernemq是用erlang写的,hook数据存放在Built-in term storage(ETS-Erlang term storage)中。这些提供了在 Erlang 运行时系统中存储大量数据的能力,并具有对数据的恒定访问时间。在此处查找更多详细信息 https://erlang.org/doc/man/ets.html

注意:只有所有者进程可以删除table或table中的所有对象,这里所有者进程是vernemq broker本身。

为了回答我的问题,下面是对 vernemq 源代码所做的以下代码更改,以便逐出/删除所有缓存对象(必须从源代码构建 vernemq)。

  1. 有一个命令 ./vmq-admin webhooks cache show --reset 从 vmq_webhooks_stats ets table 重置(删除所有对象)(重置缓存命中、条目、未命中) .
  2. 此命令在 vmq_webhooks_cli.erl 中定义,位于 cache_stats_cmd() 函数下。
  3. 只需将 vmq_webhooks_cache:reset_stats() 替换为 vmq_webhooks_cache:purge_all()

构建源并使用更新后的更改启动代理。 在调用 ./vmq-admin webhooks cache show --reset 命令时,挂钩数据和统计信息都将被删除。

此更改帮助我解决了 OOM 问题,该问题最终在一段时间后面临。