4.3 基于服务的通信 本节摘要:Adaptive 的通信管理把“传一个信号”升级成“履行一份服务契约”。契约包含接口定义、质量属性、发现与绑定。读完应能对比 Classic 信号矩阵与服务实例,并说明网关为何不能只做字节拷贝。 先说结论 阅读完本节,你应当能够: 说出服务契约三要素。 区分方法调用、事件、字段三类交互。 解释发现失败与超时在安全上的含义。 列出信号到服务翻译时必须携带的元数据。 一、从数据中心到意图中心 Classic 以信号为单元,经 CAN 等总线传固定周期、固定长度的字节。车速是十六位整数,单位在文档里,变更要同步所有接收端。迭代以周计时,这套模型成为重负。Adaptive 的通信管理不再只维护信号映射表,而管理服务契约:接口定义描述方法与数据类型、单位和错误语义;
本节摘要:Adaptive 的通信管理把“传一个信号”升级成“履行一份服务契约”。契约包含接口定义、质量属性、发现与绑定。读完应能对比 Classic 信号矩阵与服务实例,并说明网关为何不能只做字节拷贝。
阅读完本节,你应当能够:
Classic 以信号为单元,经 CAN 等总线传固定周期、固定长度的字节。车速是十六位整数,单位在文档里,变更要同步所有接收端。迭代以周计时,这套模型成为重负。Adaptive 的通信管理不再只维护信号映射表,而管理服务契约:接口定义描述方法与数据类型、单位和错误语义;质量属性声明可靠性、活性、历史、优先级;发现与绑定允许提供者运行时注册,消费者按需连接,不必编译期写死地址。
这是意图通信。调用“获取障碍物列表”表达的是语义,不是某一帧的布局。布局由序列化处理,布局变了只要接口版本规则允许,消费者可以不改业务。版本规则必须先存在,否则意图通信会退化成更难调的私有协议。
方法:请求-响应,适合“算一条轨迹”。事件:发布-订阅,适合“障碍物更新了”。字段:可被读写或通知的状态,适合“当前驾驶模式”。选错类型会让超时策略和重试变得荒谬:把周期状态当方法狂调,带宽和线程会被打满。
质量属性不是装饰。可靠性决定要不要重传;活性决定对方死了多久算失踪;历史决定晚加入的消费者能否拿到最近一帧。规划依赖障碍物时,失踪必须进入降级,而不是沿用最后一次位置直到撞上。Classic 用 AliveTimeout 表达类似意思,但绑在信号上;这里绑在服务实例上,动态性更高,也更需要明确默认值。
SOME/IP 等协议在以太网上同时承载数据、发现和元信息。它让远程调用看起来像本地,但延迟和失败模式完全不像本地。应用必须处理超时。把远程当本地函数写,是桌面思维上车。

不是所有东西都该变成服务。十毫秒一次的轮速,若每圈都做发现和动态绑定,成本荒唐。它应在 Classic 域保持信号,经网关以明确频率进入 Adaptive 侧的一个字段或事件。反过来,按需计算的泊车规划不应被压成 CAN 上的固定字节而失去版本能力。
接口定义要有单位和范围,延续第 1.2 节的教训:类型对了语义仍可能错。错误码要稳定,消费者才能写降级。随意改错误含义比改字段名更毒,因为它通过编译。
| 交互 | 适合 | 不适合 |
|---|---|---|
| 方法 | 有明确完成语义的计算 | 十毫秒周期状态 |
| 事件 | 多消费者的状态流 | 需要严格一次应答的事务 |
| 字段 | 当前模式、可读写配置 | 大块二进制刷写 |
| Classic 信号 | 闭环执行量 | 带版本的算法服务 |
⚠️ 常见坑:发现成功一次就假设服务永在。对方升级重启的那两秒,若仍用旧轨迹,规划会在真空里开车。
💡 关键直觉:服务通信把失败从“偶发丢帧”变成“契约未履行”。未履行必须有剧本。
身份与访问会在调用前问“你是谁、你能否调这个方法”。通信管理与安全集群在这里会合,见下一节和第 6.2 节。没有身份的发现,等于对整网广播“谁都可以当规划器”。
当 Classic 的制动压力请求进入 Adaptive,翻译层至少应保留:物理单位与范围、时间戳或最大年龄、安全通道属性、无效值含义。缺任何一项,AI 模型都会把过期或无效当真实。第 7.1 节会把网关展开;本节先把清单钉在通信侧。
接口版本规则必须先于第一次发布。字段可加不可静默改含义;错误码稳定比字段名稳定更要紧,因为错误码能通过编译却走错降级。序列化布局变了,只要版本规则允许,消费者可以不改业务。没有版本规则,服务通信会退化成更难调的私有协议,比 CAN 矩阵更难审,因为动态。
高频闭环数据不要每圈做发现。轮速应在 Classic 保持信号,经网关以明确频率进入 Adaptive 的字段或事件。发现和绑定留给真正会增减的服务实例。把一切皆服务当成教条,会把十毫秒节拍打成线程和带宽的风暴。反过来,把带版本的规划算法压成固定字节,会失去 SDV 要的替换能力。例外要写进架构原则,而不是留给联调现场的脾气。
要。对方升级重启的数秒里,若仍用旧轨迹,规划会在真空里开车。活性丢失必须进入预设降级,禁止静默使用过期数据。这与 Classic 信号的超时作废是亲戚,只是动态性更高,默认值更危险。把发现当握手、把握手当终身,是把婚礼当婚姻。婚姻需要活性策略,婚礼只需要一次成功日志。安全相关服务的日志里应能看到丢失和恢复,而不是只有第一次绑定。
质量属性里的活性、可靠性和历史,决定晚加入的消费者看见什么、对方失踪多久算死亡、要不要重传。规划依赖障碍物时,死亡必须降级,而不是沿用最后位置直到几何上相撞。最后位置是过去的世界,规划却在当前的时间里做决定。时间错位是混合架构最典型的事故机制,也是服务通信相对信号超时的新形态:更灵活,也更需要显式默认值。默认值若是“继续用旧数据”,灵活就会变成固执。固执在用户体验上像功能还在,在安全上像传感器被粘住。粘住的传感器比没有传感器更危险,因为系统以为自己还看见。以为自己还看见,就不会进入安全状态。不进入安全状态,功能安全那一章写过的剧本就无法开演。所以活性策略是安全剧本的触发器,不是通信调优项。调优项可以后期改;触发器必须在接口评审里出现。
版本规则要在第一次发布前写成可执行检查:字段可加不可静默改含义,错误码稳定,单位不得偷偷换。偷偷换单位能通过编译,能通过第一次路试,能在第二家消费者接入时制造数量级错误。数量级错误在服务世界里比 CAN 矩阵更难查,因为动态绑定会让你以为连对了。连对了类型,没连对意义。意义是第 1.2 节就警告过的量纲问题。问题在 Adaptive 上换了衣服:IDL 很完整,完整里仍可能缺单位。缺单位的 IDL 是穿正装的口头约定。口头约定在发现成功的日志里看起来很现代。现代不是契约。契约要让第二家工具拒绝无单位的接口。拒绝发生在构建,而不是发生在事故。事故里的无单位表现为规划以为米每秒,执行以为千米每小时。表现很像算法差。算法差的会议开得越长,单位越没人查。查单位是通信管理这一节对方法论的回响。回响听不见,服务化只是把矩阵换成了更难审的动态矩阵。动态本身不是缺点。缺守恒才是。
高频例外要写成原则:十毫秒轮速保持信号,经网关进字段或事件;规划计算保持方法调用。原则能挡住“一切皆服务”和“一切皆信号”两种教条。两种教条都会在资源或版本上破产。破产后的补救若是临时桥,临时桥会永久化。永久化的临时桥就是新的胶水。胶水是 AUTOSAR 要消灭的东西。消灭不了时,至少让胶水有元数据、有测试、有主人。主人在架构组。架构组若把高频例外交给联调现场发挥,发挥会按个人审美选择。审美不能当质量属性。质量属性要写活性、可靠、历史。历史决定晚加入者看见什么。看见过期世界却以为当前,是规划侧最危险的错觉。错觉的对策是活性丢失必降级。降级必须演练。演练必须进测试矩阵。矩阵必须在本节评审出现。出现了,服务通信才从宣言变成可运行的法律。法律会得罪想把远程当本地函数写的人。得罪是职责。
把远程调用当本地函数写,是桌面思维上车的典型入口。入口之后会出现没处理的超时、没处理的活性丢失、没处理的版本不匹配。三个没处理会在发现成功的日志里看起来一切顺利。顺利是错觉。错觉的对策是:超时走主路径,丢失走降级,版本走构建拒绝。三条都写成测试。测试不过,服务接口不许冻结。冻结了的接口才允许被第二家消费者绑定。绑定之前先问单位还在不在。单位不在,绑定只是类型游戏。类型游戏过不了网关五字段。五字段是第 7 章的门禁,门禁的预备功课在这一节:先承认远程不是本地。
承认远程不是本地之后,超时、活性丢失、版本不匹配都应走主路径测试。测试不过,接口不许冻结。冻结了才允许第二家消费者绑定。
字段、事件、方法的资源账要分开算。字段保底需要存储与通知;事件风暴来自发送者不知消费者快慢;方法并发来自把远程当本地。三本账混在“服务有点慢”里,调优会先加线程。加线程会让发现表更忙,忙会让人以为需要更多服务实例。更多实例会让版本矩阵爆炸。爆炸后的会议主题往往是中间件品牌,而不是交互类型选错。选错发生在接口评审的前十分钟。十分钟里若不能回答“这是状态、通知还是请求”,后面三个月都会在线程和带宽上还债。还债利息是网关元数据被挤出议程。议程被挤掉之后,混合架构会在通信这一侧先失去翻译对象。
下一节功能集群:诊断、升级、持久化、身份如何给服务世界提供非功能托底。