先这样答
我会把共享记忆的写请求收敛到一个写入通道。这个通道可以是队列,也可以是专门负责写入的 Agent。这样可以避免多个 Agent 同时修改同一个字段。
版本控制采用条目级版本号。Agent 读取记忆时,同时拿到当前版本号。Agent 提交写入时,带上自己读取到的版本号。写入通道先比较版本号,再决定是否写入。如果版本没有变化,就可以继续写。如果版本已经变化,说明期间有其他写入,系统就按既定的合并策略处理冲突。
合并策略可以选择时间新者优先,也可以按业务规则决定保留哪一方。具体选择取决于记忆条目的使用方式。对于读多写少的条目,可以增加缓存。写入成功后让对应缓存失效,避免后续读取继续使用旧内容。这样既控制了并发写冲突,也处理了版本变化和缓存一致性。
面试官会怎么追问
-
「为什么要把写请求收敛到一个通道?」 让多个 Agent 直接写同一个字段,会产生并发写冲突。统一进入队列或专门 Agent,可以集中处理写入顺序和版本比较。
-
「条目级版本号具体怎么参与一次写入?」 读取时拿到条目的版本号。写入时带上这个版本号,并和当前版本比较。版本一致就写入,版本不一致就按时间新者优先或业务规则合并。
-
「加缓存后,怎么避免读到旧记忆?」 对读多写少的条目使用缓存。写入时让对应缓存失效,后续读取就不会继续使用这份旧缓存。
回答的坑
-
只说加锁或排队,却没有说明读取版本、写入比对和冲突合并策略。
-
只处理了数据库里的写冲突,却忘了写入时让缓存失效。
同系列的题
—— 本题完 ——