最近半年一直做分布式系统开发,刚刚开发完成一个小型分布式系统,现总结一下分布式系统设计的经验。
1. 能不做分布式就不用分布式
分布式系统带来很多数据同步、数据不一致、数据延迟等问题。网络链接是不可靠的,分布式系统过于依赖RPC,对同一机房内部问题还不大,如果出现跨机房问题数据的不一致问题就比较突出。我们现在一般采用链接中断重连,重要消息必须应答,消息没有确认重新发送等手段一定程度上减少不一致出现的概率。但重根本上解决问题还是产品设计过程中尽量减少跨机房业务。
2. 选择合适的消息中间件
消息中间件有很多,甚至不用也可以实现消息的传递。每个消息中间件有各自的优缺点与适用范围,使用不当可能会有很多坑。我现在的项目就用到了MQ与netty,他们的优缺点可以看我另一篇文章。
3. 尽量做成无状态的应用
应用设计之初就应考虑是否可能采用复杂均衡,如果很有可能就设计成无状态的,这样可以具有很好的横向扩展能力。一开始我们的服务器是有状态的,负载均衡做不了,只能拆分,把有状态的提取出来做成服务,才上了负载均衡,代价较大。
4. 合理使用缓存
缓存可以是提高性能最快捷的方法。我们的搜索服务全部在缓存中完成,这样数据库压力很小,但数据库更新要同时更新缓存,增加了开发难度。所以缓存是个好东西但不可滥用,如果数据不那么多就可以直接用SQL进行搜索,简单而可靠。
5. 测试驱动开发
不要对自己的逻辑过于自信,没有经过测试的代码都是不可靠的。很多开发人员写完之后就直接上传代码,后来才发现bug。我觉得代码写的烂还不是大问题,只要认真测试至少可以保证业务及时上线。不做测试的人坚决不能要!
6. 初级工程师的代码一定要评审
刚开始我们团队代码没有评审环节,对初级工程师代码控制不够。后来采用gerrit使代码提交者强行参与评审才使得问题得到控制