关于 ExHook 的使用疑问点

环境

  • EMQX 版本:4.4.3
  • 操作系统版本:centos
  • ExHook: for-emqx-v43 Java
  1. 在 exhook 插件开启时(java-grpc 提前启动了),此时连接正常,然后将 java-grpc kill 掉,再启动,发现没打印 onProviderLoaded 日志,但实际已经重连上了,是否正常?

    • 而且我配置应该没开 reconnect,也会自动重连吗
      ## Whether to automatically reconnect (initialize) the gRPC server                     
      ##                                                                                     
      ## When gRPC is not available, exhook tries to request the gRPC service at             
      ## that interval and reinitialize the list of mounted hooks.                           
      ##                                                                                     
      ## Default: false                                                                      
      ## Value: false | Duration                                                             
      #exhook.auto_reconnect = 60s
      
  2. 在集群模式下,exhook 插件配置是否需要自己手动每个节点都配置一次,还是说集群会同步吗?

  3. 如果在 exhook 处理中发生异常(比如 OnMessagePublish 处理发生异常, 没 reply),会影响后面的调用链吗? 会影响正常的 pub/sub 模式的消息推送接收吗?

  4. 如果我想对 OnMessagePublish 推送的 message 处理完后,不要再推送给订阅这个 message 主题的 sub client,需要怎么做, 在 OnMessagePublish 返回 IGNORE 吗?

  5. onMessagePublish hook 案例中: ValuedResponse setMessage(nmsg) 作用是什么? 返回 null 会怎么样 ,文档没找到相关的说明

  6. exhook-java grpc 是作为 server 端与 emqx 的 grpc 交互的吧,那么在 emqx grpc client 中有设置负载均衡策略吗? grpc 通信是使用粘性可重用的连接,感觉建立后无法对单次的通信进行负载均衡

  7. exhook 的事件推送有重试吗?

  8. exhook 的配置文件,exhook.pool_size 是指 emqx grpc client 与我的 grpc server 建立多少个连接吗?还是说只有一个连接,这个只是 grpc client 的线程池大小?

  9. exhook 的配置文件,配置多个 exhook 格式是怎么样的,是 exhook.server.default.url = http://xxx:9000,http://yyy:9001 这样吗?

2 个赞
  1. 现在还没有 liveness 探活,所以只要启动成功了(OnProviderLoaded 调用成功后)就行了,后续请求都是直接往 gRPC 服务发送,服务停止了就会直接失败,启动了就成功

  2. 4.x 插件的配置(指 emqx_exhook.conf)不会同步;但企业版的 ExHook 模块、5.0 的 ExHook 都是可以同步的

  3. 会同步+阻塞的,直到 gRPC 调用超时,才会继续往下

  4. 应该把 Message.headers 中的 allow_publish 置为 false 来拒绝发布。IGNORE STOP_AND_RETURN 等只是用于控制钩子执行的流程控制

  5. OnMessagePublish 钩子可以返回新的消息对象。这表示可以允许修改消息的主题、内容、和 headers 中属性,以满足某些场景下消息序列化、反序列、拒绝发布等需求。

  6. 无负载均衡。需要 gRPC Server 侧提供

  7. 失败无重试

  8. pool_size 指的是会创建 N 个 gRPC 链接(即不同的 HTTP2/TCP Connections)

  9. 暂不支持配置多地址,以达到客户端侧负载均衡的效果


感谢反馈。其实其中 1、6、7 都属于可以优化的部分。2、3 则属于设计确实是这样的

应该把 Message.headers 中的 allow_publish 置为 false 来拒绝发布。IGNORE STOP_AND_RETURN 等只是用于控制钩子执行的流程控制

Message.headers 中的 allow_publish 置为 false,Java 的 API 中好像没找到设置 header,4.3 支持的吗?

只在 4.4 支持的,可以试试最新的 4.4 版本