无模式写入行协议写入数据时,写入字段与超表已定义的字段顺序不一样或者不同时,会出现报错的情况

【TDengine 使用环境】生产环境

【TDengine 版本】3.3.8.4

【操作系统以及版本】centos7

【部署方式】非容器部署

【集群节点数】1

【集群副本数】

【描述业务影响】通过websocket连接,无模式写入行协议时,写入的字段顺序与超表已存在的字段不匹配时会出现写入失败的情况,taoslog显示smlBuildCol ERROR

【问题复现路径/shan】

【遇到的问题:问题现象及影响】数据写入失败

【资源配置】16C 48G

【报错完整截图】

其中一条插入报文:device_data_13,device_id=10162977,domainId=13 Voltage40=3269.0f64,Voltage41=3266.0f64,Voltage44=3266.0f64,Voltage45=3266.0f64,Voltage42=3266.0f64,Voltage43=3267.0f64,Voltage37=3266.0f64,Voltage38=3266.0f64,Voltage35=3266.0f64,Voltage36=3267.0f64,Voltage39=3267.0f64,Voltage30=3267.0f64,Temperature20=30.4f64,Temperature21=30.9f64,Temperature22=31.0f64,Voltage33=3266.0f64,Temperature23=30.6f64,Voltage34=3266.0f64,Temperature24=30.8f64,Voltage31=3267.0f64,Temperature25=31.0f64,Voltage32=3266.0f64,PoleTemp2=32.2f64,Temperature26=31.5f64,PoleTemp3=31.5f64,PoleTemp1=31.8f64,PackNO=2,Voltage26=3266.0f64,Voltage27=3269.0f64,Voltage24=3266.0f64,Voltage25=3266.0f64,Voltage28=3266.0f64,Voltage29=3267.0f64,Temperature10=30.9f64,Temperature11=30.9f64,Voltage22=3266.0f64,Temperature12=30.9f64,Voltage23=3267.0f64,Temperature13=31.5f64,Voltage20=3266.0f64,Temperature14=31.5f64,Voltage21=3266.0f64,Temperature15=30.9f64,Temperature16=30.8f64,Temperature17=31.1f64,Temperature18=30.9f64,Temperature19=30.7f64,Temperature9=30.7f64,Temperature8=30.7f64,Temperature7=30.4f64,Temperature6=31.0f64,Temperature5=31.0f64,Temperature4=30.8f64,Voltage15=3266.0f64,Voltage16=3266.0f64,Voltage13=3267.0f64,Voltage14=3269.0f64,Voltage19=3267.0f64,Voltage17=3266.0f64,Voltage18=3267.0f64,Voltage2=3266.0f64,Voltage51=3267.0f64,Voltage3=3266.0f64,Voltage52=3266.0f64,Voltage4=3266.0f64,Voltage5=3266.0f64,Voltage50=3266.0f64,Voltage11=3266.0f64,Voltage12=3266.0f64,Voltage1=3268.0f64,Voltage10=3266.0f64,Temperature3=30.9f64,Temperature2=31.0f64,Temperature1=31.3f64,Voltage6=3267.0f64,Voltage7=3266.0f64,Voltage8=3267.0f64,Voltage9=3266.0f64,Voltage48=3266.0f64,Voltage49=3267.0f64,Voltage46=3267.0f64,Voltage47=3267.0f64,update_ts=1769583608074u,transactionId=“test12345678” 1769583608000

另外,在进行批量压测写入的情况下,taosadpter的cpu会很高,目前部署了1个taosd 节点,3个taosadapter

上面那个报错不是问题。这个错误的意思是,会检测顺序是否一致,不一致的话打印那个错误,然后按照不一致的逻辑重新解析写入。

理论上你那条数据是可以写入的。如果那条数据写入失败, 你看看时间戳是否重复了? 过滤掉那个smlBuildCol 错误后,看看还有没有别的错误。

taosadapter 占用资源高的问题是正常的,因为你在压测,解析的任务都在客户端,所以taosadapter 资源占用高。如果大量的乱序数据,也会造成解析消耗CPU高。顺序和表结构一直的数据解析最快,cpu占用也会最少。

好的了解。我看了下日志虽然报错了,但是数据还是可以成功写入的。按照目前的业务场景的话,乱序写入的数据或者只写入部分数据的情况会比较多,发现性能跟顺序写入差得有点多,应用侧等待响应相对来说会比较久,请问下这种情况下有什么比较好的方式去处理吗,高效写入模式目前是不支持行协议的吧?

乱序多的话,写入肯定很慢,因为解析需要花额外时间找到对应的列映射上去,逻辑上也是说的通的。行协议一般都是程序固定生成的顺序,尽量让和表的顺序一样,最高效

好的感谢。