“ 任何人写的代码,终究要在生产环境上运行。”
01
—
时刻以生产环境为本
我们写的代码,终究是要在生产环境上跑的。生产环境和我们平时面对的开发环境、测试环境可不一样。生产环境上的系统必须维持业务的连续性。
要做到这一点,我们必须要避免单点故障。也就是说,系统服务不能因为某台服务器、某个中间件等出现故障而中断。
系统也必须要有容灾设计,当主机房出现全面故障时,系统服务也能切换到其他机房,继续提供服务。平时也要定期进行切换演练。
系统还必须要有各种的监控和预警,在出现故障时让我们掌握先机,及时处理,避免或减少用户或业务的影响或损失。
为了应对随时变化的访问量,系统必须有一定的弹性。在访问高峰时顶得住,在访问低谷时能节省资源,从而节省成本。
另外,性能、安全等的非功能性需求都要一一满足。
要做到以上要求,我们在做软件设计时,就要以终为始,必须考虑到以上要求和系统在生产环境上运行时的各种情况。这些问题有些需要在软件设计、代码上处理,有些需要通过架构设计来处理,甚至需要代码和架构协同处理。
懂点系统架构,就能帮助我们在软件搭建初期把这些因素考虑在内。软件虽然是可变的,但变更越晚,成本越高,风险也越高。所以最好把这个过程提前。
应对前面提到的要求,我们在做系统设计、架构设计起码需要做到:
避免单点故障
有两种方案:
故障转移(Failover)——把系统部署到两台服务器,其中一台服务器是主服务器,所有用户请求默认发到这台服务器;另一台服务器是备用服务器。一旦主服务器出现故障,所有用户请求切换到备用服务器,继续提供服务,为修复主服务器故障争取时间。
双活或多活(onsite resilience)——把系统部署到两台服务器,并把用户的请求均衡地分配给这两台服务器分别处理,那么不光系统的处理能力提升了,而且即使其中一台服务器出现故障,另一台服务器依然可以支撑服务,处理用户请求,这种设计叫“双活”。如果是通过多台服务器来实现这种设计,就叫“多活”。“双活”或“多活”的实现,往往需