payload消息处理问题

环境信息

  • EMQX 版本:4.4.8
  • 操作系统及版本:CentOS7.6 32核64G

问题描述

正常接入emqx的payload数据格式不满足我们的数据需求,所以要做字段映射操作:
源数据:
{“e_uid”:“aaa”,“p_uid”:“001”}

需要对e_uid和p_uid做映射操作:
    e_uid : 
        "aaa" >> "e001"
        "bbb" >> "e002"
        ...
    p_uid:
        "001" >> "rms_h_a"
        "002" >> "rms_h_v"
        ...

现在的方案是在规则引擎中配置sql,使用CASE WHEN THEN结构进行映射:
CASE(payload.e_uid
WHEN ‘aaa’ THEN ‘e001’
WHEN ‘bbb’ THEN ‘e002’

)

CASE(payload.p_uid
WHEN ‘001’ THEN ‘rms_h_a’

)
要映射的字段很多,总共有几千条

但是这种方案测试的时候似乎特别消耗性能:
现在测试大概每秒1000条的数据量
32核64G的服务器:
关规则cpu平均负载12%
开规则cpu平均负载47%

请问要实现该需求有没有更好的方案呢?

消息处理速度已经跟不上数据流入速度了,平均流入每秒1000条,统计里平均5分钟执行速度614条/秒

每次执行几千条映射操作是很耗性能的,如果规则执行太慢,还是建议你写插件来做。
一种是写emqx 的常规插件(Erlang),另一种是 ExHook 插件(通过 gRPC 调用你的服务)。

我照着github上的python扩展示例运行exhook_server.py,但是报错:
module ‘exhook_pb2_grpc’ has no attribute ‘HookProviderServicer’
查看生成的exhook_pb2_grpc.py里也没有找到这个类

这个是生成的exhook_pb2_grpc.py文件

Hi, 请确保使用了 v4.4 中的 proto 文件
main-v4.4_exhook-proto

(感谢反馈,文档中链接有误,已经提交 PR 更改)

1 个赞