💡
原文中文,约2400字,阅读约需6分钟。
📝
内容提要
在阅读《数据密集型应用系统设计》时,回忆起在蚂蚁工作时遇到的两个故障:第一个因RPC反序列化错误导致支付失败,因新枚举未识别;第二个因数据库bug导致支付请求失败,因代码强依赖数据库时间。通过改进代码和理解数据库机制,成功解决了这些问题。
🎯
关键要点
- 在阅读《数据密集型应用系统设计》时,回忆起在蚂蚁工作时遇到的两个故障。
- 故障1:因RPC反序列化错误导致支付失败,因新枚举未识别。
- 故障1的原因是应用B新增枚举,导致应用A反序列化失败。
- 解决方案包括:1)遇到未知枚举值时fallback到UNKNOWN;2)避免使用枚举,通过字符串交互。
- 故障2:因数据库bug导致支付请求失败,因代码强依赖数据库时间。
- 故障2的根因是get_or_create_user服务在准备时请求数据库获取当前时间。
- 通过修改代码为懒加载模式解决了故障。
- 书中介绍了分布式数据库的三类:Single leader、Multi leader和Leaderless。
- OceanBase采用基于Paxos协议的多副本同步机制,确保数据一致性。
❓
延伸问答
在《数据密集型应用系统设计》中提到的故障是什么?
提到的故障包括因RPC反序列化错误导致支付失败和因数据库bug导致支付请求失败。
如何解决RPC反序列化错误的问题?
可以通过在遇到未知枚举值时fallback到UNKNOWN,或避免使用枚举,通过字符串交互来解决。
第二个故障的根本原因是什么?
第二个故障的根本原因是get_or_create_user服务在准备时请求数据库获取当前时间,导致强依赖数据库。
OceanBase数据库的同步机制是什么?
OceanBase采用基于Paxos协议的多副本同步机制,确保数据一致性。
在设计数据密集型应用时需要注意哪些兼容性问题?
需要谨慎考虑向前和向后兼容,尤其是在数据结构变更时。
为什么不直接在数据库中使用now()来表示当前时间?
不使用now()是为了遵循“确定性&一致性”的最佳实践,确保时间的正确性和副本间的同步一致性。
➡️