关于 exhook 是否能实现平滑更新的讨论

实战疑问以及讨论

环境

  • EMQX 版本:4.4.3
  • 操作系统版本:centos
  • ExHook: for-emqx-v43 Java

背景

部门服务偶尔出现问题跟上面三个链接的情况差不多一致(Timed out waiting for a response from the server (32000))

我这边的服务情况:消息量不大,QOS1, sub 端进行重连(可能是网络原因),然后消息窗口有积累一些消息,存在队列满的情况,同时sub端重连后(同一个 session)重新发起 topic 订阅,出现超时异常,然后断开又继续重连,一直循环下去,没法订阅主题的同时也没法消费飞行窗口的消息。
上面的疑问是client 心跳和主题订阅的响应不是放在飞行窗口的吧,没排查出为什么会产生超时的情况。

采取的解决方案

针对上诉所描述的问题,部门暂时没法解决,决定采用 exhook 的方式对消息进行 mq 转发,放弃 pub/sub 的方式。

exhook server 的更新困难点

由于设备一直往 broker 发送消息,部门的痛点是如何在 exhook server 更新的时候,防止消息丢失(尽最大努力防止丢失)。按照官方的说法 exhook 是没推送重试的,如果按照正常的关掉|更新,势必会产生消息丢失

目前能想到的一些方案

第一种

需要更新的 exhook server 版本部署上去,旧版本的 exhook server 不kill,同时把 nginx 转发的域名地址映射改为新版本的 exhook server。

等待 旧版本的 grpc client 重连的时候,连接到新版本的 exhook server

但是这样存在很大的不确定性,client 什么时候才能全部连接到新版本上面去,人工好像没法干预。重启插件应该也会产生消息丢失吧。

第二种

启动 sub/pub 模式,订阅和 exhook server 一样的事件主题转发到 mq,一旦 kill 掉exhook server 后,消息就会被 sub/pub 承接过去,等到 exhook server 更新上线后,重新接管消息。再把 sub/pub 模式下线
ps:需要在exhook messagepublished 对消息进行拦截不发布

希望能得到大家的讨论和解决方案的分享

感谢反馈!

我这边的服务情况:消息量不大,QOS1, sub 端进行重连(可能是网络原因),然后消息窗口有积累一些消息,存在队列满的情况,同时sub端重连后(同一个 session)重新发起 topic 订阅,出现超时异常,然后断开又继续重连,一直循环下去,没法订阅主题的同时也没法消费飞行窗口的消息。

正常情况下是不应该出现这样的问题的,建议你可以新开一个帖子排查这里的具体的问题,暂时不要引入 exhook 带来更多架构设计。

关于 exhook 平滑升级的话,1-2种方案都不太完美。你们这边使用 exhook 的场景需求方便详细说明下吗?

好的,稍后重新开一个帖子排查下问题。

关于 exhook 平滑升级的话,1-2种方案都不太完美。你们这边使用 exhook 的场景需求方便详细说明下吗?

使用 exhook 的原因有几个:

  1. 使用正常的 pub/sub 模式的时候偶尔出现上述的问题,导致服务不够稳定,目前也没排查出,需要避免这种情况的频繁出现
  2. 随着业务的扩展,后续高峰期消息量汇会增加,需要考虑削峰,防止高峰期间消费能力跟不上导致消息丢失,目前想在 exhook 里面将消息转存 MQ

情形2的话,可以直接上企业版,比较省心省力一点,我们支持桥接数据到 Kafka、Plusar、RabbitMQ 等主流 MQ 的。

否则推荐,使用多个客户端共享订阅来收消息并转存到 MQ,exhook 不一定有 MQTT 直接订阅效率高的

请问关于这个结论,有数据支撑吗?他们性能相差多少呢?