车联网平台第三方数据推送集成:Kafka + Go 实现记录(2020)
背景 2020 年前后,我在大连 R 公司负责车联网平台协议解析层的开发和维护。R 平台是一套部署在公有云上的 IoT 平台,接入大量在线车载设备,实时处理车辆上报的行车数据。 那时平台有一项新的合作需求:一家做共享汽车业务的公司(以下简称 M 公司)采购了 R 公司的车载设备,安装在共享汽车上,希望通过接口从 R 平台获取这些车辆的实时行车数据,再通过自己的 App 提供给用户查询车辆状态和行驶记录。 我负责这次集成的开发工作,包括改造行车数据服务的分流逻辑,以及独立开发一个面向 M 公司的数据推送服务。这也不是我第一次做类似的事,R 平台之前也有过给其他第三方提供数据接口的项目,但 M 公司是其中规模比较大的一家。 技术方案 行车数据服务本身改动不大。原来的逻辑是收到设备上报的数据后直接写入平台内部各个下游。这次只是加了一段分流逻辑:根据车辆底盘号(VIN)查询 Redis 中的客户映射关系,如果这辆车属于 M 公司,就把这条数据额外发送到一个专用的 Kafka topic。 Kafka topic 的另一侧是我新写的 Go Kafka consumer,消费消息后做数据格式转换,处理鉴权,再通过 HTTP POST 批量推送给 M 公司的接口。推送时有一个打包策略:收到 N 条数据就打包发出,或者超过一定时间没有新数据也把当前这批发出,每次 HTTP 请求可能包含多条记录。 VIN 到客户的映射关系存储在 Redis,由业务侧维护,数据服务只做读取。 工程细节 可观测性 对接第三方的接口,出问题时的排查成本比内部服务高很多——双方都需要对齐日志,搞清楚是哪一侧的问题。 我在这个服务里做了几件事: 每一批次数据带一个唯一的 trace ID,日志里记录发送时间、trace ID、完整 payload、M 公司 API 的响应时间和状态码。在调试阶段和试运行阶段,日志级别调到 debug,把 payload 全量打印出来,方便排查数据是否正确、格式是否符合对方预期。 除了日志,我还在服务里埋了监控指标,记录推送并发量和调用对方 API 的响应时间,接入 R 平台已有的 Grafana 看板,可以直观看到推送量和延迟的变化趋势。 ...