外面看起来简单:地图上移动的点。背后的工程远非如此。这份参考构建方案记录了完整的交付周期,以及那些决定平台能否在生产环境中活下来的非功能性细节。一辆车每秒都在说话,四千辆车同时张开嘴,你要接住每一句话,还不能让任何一个词掉在地上。
实时车队追踪平台从车载设备采集位置数据,以流的方式做处理,再输送到仪表盘和移动端。这份方案走的是完整通路——从需求发现、需求分析,到架构设计、测试、上线——每一步都摊开来看。它面向一位阿联酋运营商,但不是具体的客户项目,也不使用任何客户数据。值钱的部分在于方法和决策逻辑,这套逻辑可以迁移到绝大多数实时、高吞吐的系统里。
发现环节是第一个被忽视的硬仗。在画任何一张架构图之前,先要搞清楚平台到底为谁服务、谁在依赖它。调度员需要看到每一辆车此时此刻的位置,一秒都不能晚。运营经理需要的是昨天的路线和异常事件,晚几分钟问题不大。司机只需要一个在停车场负二层信号微弱时还能打开的应用。财务团队需要的,是准确的行驶里程和怠速时长,拿来对账开票。每一种使用模式,对应的是完全不同的读取方式和延迟容忍度。
发现环节还会挖出那些悄悄决定一切的约束条件:到底有多少辆车,它们多久上报一次位置,历史数据要保留多长时间,数据要喂给哪些现有系统,监管方有什么要求。这些数字必须在设计之前就写下来,因为一条像“四万辆车,每两秒上报一次”的需求,可以直接让架构方案彻底翻盘。发现阶段的产出是业务需求文档,然后再转化为软件需求规格。功能需求反倒是最好处理的那部分——实时地图、行程历史、地理围栏、告警。真正决定项目成败的,是那些最少被写下来的非功能性需求:数据新鲜度、压力下的行为、设备断网时怎么办、数据保留策略、可恢复性。我们给每一项都设了明确的指标,因为能测量的目标才是能被测试的目标。文章后面的表格里,列出了我们围绕车队平台设计时所锚定的那些非功能性指标。
架构的样子,是把三件事干净地切开:数据接入、数据处理、数据服务。终端设备通过MQTT协议上报位置信息。MQTT是一种轻量级的发布订阅协议,专为机器与机器之间在受限网络中通信而设计。设备在与网关建立连接时,通过双向TLS进行身份认证,这样一台伪造的设备就无法往系统里注入假位置。接入层是无状态的并且支持自动弹性伸缩,所以每天早高峰时段所有车辆同时启动上线的那一波冲击,系统能稳稳接住而不被打垮。接入之后,数据流入处理层,那里要完成的事情远比把点画在地图上复杂——流式计算、状态管理、事件触发、历史持久化,每一项背后都是取舍。服务层再根据不同的消费场景,把处理好的数据以不同的方式交出去:实时推送走WebSocket,历史查询走RESTful API,报表导出走异步任务。三层解耦之后,任何一层出问题都不会把整个系统拖下水。
很多人以为车队追踪就是GPS加地图。但真正让一个平台活下来的,是那些在需求文档里经常被跳过的细节:设备在地下车库丢了信号之后,补传数据时会不会把历史轨迹搞乱;早高峰四万辆车同时上线,接入层会不会被连接风暴打死;财务团队要的里程数据和运营团队要的路线回放,能不能从同一份源头数据里算出来而不用维护两套计算逻辑。这份参考构建方案的价值,不在于给出了一个完美的答案,而在于把做这些决策时必须权衡的因素摊在了桌面上。每一个读到它的工程师都可以拿着同样的思考框架,去套自己手头的系统——不管是追踪车辆、追踪物流包裹,还是追踪任何需要在空间和时间两个维度上被精确描述的东西。
热门跟贴