emqx_broker:subscribe函数使用rpc执行的问题

环境信息

  • EMQX 版本:4.4.4
  • 操作系统及版本:rocky linux 8
  • 其他

问题描述

emqx 4.4.4使用epmd启动,在本地执行 emqx_broker:subscribe(Topic),在ets表emqx_broker:subscribe可以看到记录


开启另一个shell通过empd连上emqx后执行rpc,可以看到执行成功,但是ets表没有该条记录,而且打印日志能看到其实所有的执行是正常的

如果想让系统给远端node的进程发topic message,请问应该如何操作

配置文件及日志

常规配置,没有做定制

可以看下 emqx_broker_helper 的代码,它会 monitor 订阅进程,当订阅进程挂了就会替他取消订阅关系。
你可以检查下 rpc:call/4 是否是启动的一个临时进程去订阅的

我打印了,RPC call本身确实启动的是一个临时进程,但是除了这个方式,有其他方法可以实现我的目的吗?

按我理解是需要给 “远端节点的客户端/连接添加一个订阅”? 如果理解没错的话你可以直接调用 HTTP-API

它的实现其实就是 ClientPid ! {subscribe, TopicFilter},具体的参数类型可以看 emqx_channel.erl:handle_info/2 这个方法的处理

不是客户端,实际情况是我另一个erlang node,用的empd连接了emqx4.4.4,需要订阅一些主题消息,但是想通过原生erlang的 send 函数来发,我目前看源码应该是给emqx_subscription的ets表里的pid发消息,但是对于我这个情况有没有可以直接调用的原生函数,可以直接将另一个远程node的pid注册进去

直接起一个进程,在里面执行 emqx_broker:subscribe/x 来订阅你想要的主题。不用 rpc 的

我另起的erlang node不是emqx,只是一个普通的application,本身是没有emqx_broker:subscribe函数的,这个是无法执行的

那改下 emqx_broker.erl 的 subscribe 函数就好了,把 SubPid 做成参数