结论先说:如果咨询路径要在多台设备之间流转,减少重复计算的关键不是让每台设备都算一遍,而是把“谁负责判断、谁负责复用”定清楚。可行做法是让一台设备或一个共享存储承担去重与状态判定,其余设备只读取结果;如果设备经常离线、网络不稳定,或咨询动作必须本地即时响应,这个结论会失效,此时更适合把计算拆成“本地初判+中心复核”两段,代价是状态同步会变慢。
设备之间完成咨询,常见路径是:设备A记录一次接触,设备B再记录一次,设备C又触发一次提醒。若每台设备都独立判断“这次咨询是否已处理”,同一咨询就会被反复计算。问题不在设备数量,而在于判定权分散:每台设备都以为自己在做唯一判断,实际做的是重复判断。
判断依据可以看三个信号:同一咨询标识是否在多台设备上各自生成状态;状态更新时间是否互相覆盖;同一动作是否被多次写入待处理队列。只要出现其中两个,重复计算基本已经发生,而不是偶发延迟。
第一种做法是中心判定:由一台设备或一个共享存储维护咨询状态,其他设备提交事件、读取结论,不自行判断是否重复。它适合设备在线率较高、咨询动作允许短暂等待的场景。代价是中心节点一旦不可达,整个路径会卡住,所以需要明确降级策略,比如先本地记录、恢复后再合并。
第二种做法是本地判定:每台设备先按本地规则判断,再把结果上报。它适合离线时间长、响应要求高的场景。代价是重复计算不会消失,只会被推迟到合并阶段,因此必须给每条咨询一个稳定标识,否则合并时无法确认两次记录是否指向同一件事。
选择条件可以这样看:如果咨询路径允许几百毫秒到数秒的等待,优先中心判定;如果设备经常断网且咨询动作必须立即完成,优先本地判定,但要接受后续合并成本。
假设设备A和设备B都能接收咨询入口,A先记录“已接触”,B稍后也记录“已接触”,两边各自触发一次提醒。若没有共享标识,系统会把它当成两次咨询,重复计算提醒和后续跟进。此时可行的动作是:为每次咨询生成一个跨设备一致的标识,A和B都只上报该标识和事件类型,由中心节点判断“已存在则只更新状态,不新增计算”。结果是提醒次数从两次变为一次,下一步只需检查该标识是否在离线恢复后仍能对齐。
反例是:如果咨询动作本身要求设备在无网络时立即给出结果,中心判定就无法满足,因为等待中心确认会阻塞响应。这时应改为本地先给出临时结果,并明确标记为“待复核”,避免把临时结果当成最终状态继续向下计算。
可执行的动作是先统一咨询标识,再指定唯一判定方。具体顺序是:
做完这四步后,如果同一咨询的提醒次数下降、状态不再互相覆盖,说明判定权已经收拢;如果提醒次数没变,先检查是否仍有设备在本地生成新标识,而不是先怀疑网络。
当咨询路径必须跨多个独立系统、且各系统不能共享标识时,中心判定和本地判定都只能减少一部分重复,无法完全消除。此时更现实的目标是让重复可识别、可合并,而不是追求零重复。另一个失效条件是设备时间不同步:如果各设备时钟差异较大,即使标识一致,事件顺序也会错乱,判定方可能把后发生的事件当成先发生,导致重复计算被误判为正常更新。
下一步动作是先确认标识是否跨设备一致、判定方是否唯一;这两项都成立,再处理离线合并和时钟同步。否则先修标识和判定权,其他优化都只是在重复计算之上叠加更多重复。