通过管理接口去创建规则和数据桥接报错

环境

  • EMQX 版本:5.0.22
  • 操作系统版本:Centos7.9 tar.gz 直接部署,3个节点集群

重现此问题的步骤

  1. 通过接口创建规则、数据桥接,有时候成功,有时候出错,代码是同一份
  2. 两个接口的调用是并行的,不相互依赖
  3. 错误信息如下: 不会同时失败,两个接口只会某一个失败。
    创建规则报错:
 emq规则操作失败,响应结果:{"code":"BAD_REQUEST","message":"Bad Arguments: #{cluster_tnx_id => 233,msg => stale_view_of_cluster_state,node_tnx_id => 232}"}

创建数据桥接报错:

 emq操作webhook失败,响应结果:{"code":"INTERNAL_ERROR","message":"error, {case_clause,{error,#{cluster_tnx_id => 216,msg => stale_view_of_cluster_state,node_tnx_id => 215}}}, [{emqx_bridge_api,create_or_update_bridge,4,[{file,\"emqx_bridge_api.erl\"},{line,599}]},{minirest_handler,apply_callback,3,[{file,\"minirest_handler.erl\"},{line,111}]},{minirest_handler,handle,2,[{file,\"minirest_handler.erl\"},{line,44}]},{minirest_handler,init,2,[{file,\"minirest_handler.erl\"},{line,27}]},{cowboy_handler,execute,2,[{file,\"cowboy_handler.erl\"},{line,41}]},{cowboy_stream_h,execute,3,[{file,\"cowboy_stream_h.erl\"},{line,318}]},{cowboy_stream_h,request_process,3,[{file,\"cowboy_stream_h.erl\"},{line,302}]},{proc_lib,init_p_do_apply,3,[{file,\"proc_lib.erl\"},{line,226}]}]"}

咨询下这个错误是什么问题造成的,有时候出现,有时候正常,参数都是一样的传入的。
另外咨询下,相比于之前4的版本,之前的在创建的时候只要调用一次接口就可以完成规则的创建,绑定资源,现在版本要调用两次才能完成规则创建,之前也咨询过这个问题,是否有优化打算?新版本5.0.10 规则使用问题疑问 - #10,来自 yusf

对于调用接口创建规则和桥接的问题,现在应该也是首先创建桥接,然后创建任意多个规则复用这个桥接。跟之前没有什么区别。
但如果说要求数据桥接里面的内容(消息模板)不同,就必须创建多个桥接了,或者说在规则的 SQL 部分,使用 CASE 语句做一些分支处理。这部分的设计我没看到有什么计划要改动。

关于你上面那个 error,我让其他同事来回答你。

好的谢谢,不过之前版本的时候是有资源这个概念,资源只要创建一次,然后消息模板是跟着规则那边的,也就是说在创建规则的时候,赋予自己的消息模板就行,现在是要单独创建一个数据桥接,有多少规则就要创建多少桥接,规则的消息模板是每个都不一样的。
现在创建规则的时候,如果是按顺序先调用创建数据桥接,在调用创建规则,接口响应很慢,所以才考虑并行创建,因为数据桥接的id的可以指定的,在创建规则的时候,提前传这个id,是否这样导致调用失败?

创建时偶尔报错的直接原因:
在集群中修改配置(创建资源/规则)EMQX需要保持3个节点的一致性(创建的顺序和内容在3个节点都是一样的)。所以无论你如何并行调用,内部都会顺序执行的。我们后续会优化一下如何更好提示和尽量少的避免这种冲突(EMQX内部顺序解决)。

目前可以把所有的HTTP请求只路由到一个节点来避免这个问题。
或者让所有的HTTP API 更新请求顺序执行。

目前遇到的错误是内部顺序造成的吗?现在暂时无法通过配置解决是吗?尝试按照顺序请求接口,但是响应比较慢,所以才选择并行,那现在如果是并行请求的话,只路由到1个节点进行创建,意思是请求地址单独指定?不走负载均衡?进行接入?

@Shawn @zhongwencool 你好,在咨询下,集群环境下,经常出现这种报警


如果是这个节点有问题的话,不是应该所有桥接也会出现吗?节点都在局域网内的。非常不稳定感觉

,不知道你们集群是否有出现过这样的问题。有没有比较好的办法解决?

看起来好像是这个资源在有一些节点连上了,但有一些节点是断开的。你去每一个节点上都看看日志,看看是哪个节点的连接出了问题。

请求地址单独指定?不走负载均衡?进行接入?
对的。
什么情况下一个创建资源的接口要比较大的并发?

这个并发倒是不用很大,就是目前前端那边创建的规则的时候对外就只要创建规则,然后请求的时候实际是创建了数据桥接和规则,按顺序的时候,前端大概要等2-3s有结果

有01 有02 节点,好像那边日志给出超时,但是过一会就恢复,但是局域网不会这么不稳定吧,而且桥接出现连接不上某个节点的时候,其他桥接是正常连接的,说明网络应该是通的,不知道为啥会造成这样的情况,有什么能排查的吗“?

webhook 的健康检查很简单,就是查看一下端口通不通,猜测是 HTTP 服务偶尔出问题。你看看日志里 webhook 的问题都是什么原因,econnrefused 意思是网络不通。

如果某一个节点是网络有问题,那应该全部的都连接不上,全部连接这个节点的都有问题吧,但是现在问题是只是某一个数据桥接才出现。错误都是这样的: