随着计算机技术的不断发展、社会互联网需求在纵向和横向上的不断扩大,传统的软件技术架构越来越不能适用快速变化的时代需求。从最初的单机应用、到双机热备、到集群、到分布式、到云计算等...,技术的更迭之快让人眼花缭乱。
今天,就和大家简单地聊聊程序员开发过程中如何考虑分布式系统。
那什么是分布式架构?分布式架构是指由大量分布在不同区域、主机上的各种服务共同构建应用业务的服务系统。那么,单机应用是如何演变到分布式架构的呢?
互联网诞生之时,由于传输信息以文本为主,加上网上用户群体少、业务场景简单(以简单业务介绍、博客等为主),传统的单一服务应用就可满足需求。例如,一台普通性能的服务器搭载一套邮件系统项目即可实现外网可访问的邮件服务系统。
随着传输信息种类(文本、图片、视频、音频)的丰富、用户群体增大、业务场景(聊天、视频、购物等)的丰富以及计算机硬件单机性能增加无法对应日益增长的需求,分布式服务应运而生,从双机热备、单一机房集群、区域集群、到囊括成千上万设备的分布式架构。
作为程序员,一般都是从简单的单机应用开始编程。在经历了类似JSP/Servlet,MVC等经典开发框架后,该如何开始良好的分布式系统开发呢?
第一,分布式系统需要水平和垂直可扩展性。分布式系统服务需按照业务需求总量增加和减少服务实例,这就需要将分布式服务做成独立的、可插拔式的服务插件。针对可扩展性,分布式系统服务需要业务无状态性、数据共享性和运行独立性等特点。
第二,分布式系统需要完善的健壮性。分布式不同于单机应用(服务调用结果明确,失败或成功),分布式服务调用会出现未知状态(调用结果成功与否未知),需要考虑各种异常场景以及异常组合造成业务极其复杂。在开发过程中,要从用户角度出发,让用户的每次请求都有明确的处理结果返回(不管是系统自动处理还是人工干预),形成业务闭环。
第三,分布式系统需要完善的日志记录。分布式系统应用场景极其复杂,内部运行状况动态变化。一旦系统出现异常,需要查找调用轨迹极有可能覆盖众多服务。如果没有完善的日志记录系统,会让问题排查起来相当困难,准确率低、效率更低。完善的日志记录应该包括:标准化日志记录规则、完善的业务调用链日志查询、可定制化轨迹日志查询、以及用户友好的日志查询操作界面。
第四,分布式系统需要完善的安全机制。分布式系统提供了各个业务应用需要的数据服务提供实例。完善的安全机制能有效保障业务数据的安全。研发时考虑搭建良好的用户角色权限机制,敏感数据的加解密机制,网络通信方式的保密性以及黑客攻击(例如XSS、SQL注入攻击,DOS等)防范机制。从技术漏洞、数据载体、通信方式、业务漏洞、体系风险等各个方面统筹谋划,做好安全处理。
第五,分布式系统需要完善的运行防范机制。分布式系统的出现就是为了解决日益增长的流量处理需求和单一物理机器处理能力不足产生的矛盾。访问流量的抖动、单一服务能力的变化都是影响系统运行稳定的重大因素。在开发过程中,我们需要假定各种异常场景并做相关场景处理,例如服务流控、容错降级等多种机制。
第六,分布式系统需要完善的测试机制。分布式系统内部调用关系极其复杂,造成测试困难,工作量大等。在开发中,需要在关键点(例如服务调用点、服务访问处理、异常场景处理)等关键节点上做好可配置(通过参数配合等)的数据MOCK机制,让测试人员可通过参数调节即可完成分布式场景各种业务异常场景测试。注意的是,最好将这些测试点开发成单独的服务(由业务框架调用),测试人员如果有研发能力,可以提供他们自己测试场景的扩展机制。
第七,分布式系统需要完善的发布上线机制。一般而言,分布式系统的业务流量都已初具规模,相关的业务迭代快速而频繁。Bug修复、新功能迭代等代码发布都会对现有生产环境稳定运行造成威胁。不仅需要在上线前做严格的测试,而且需要具有良好的上线机制,例如A/B发布机制等。
第八,分布式系统需要完善的监控机制。分布式系统面对的外部环境和内部环境都十分复杂,内部服务部件众多,任何硬件错误、软件异常、实例僵死等小概率事件在数量巨大的服务组件的基础上可能时刻发生。为保证系统的健康良好,运行稳定。需准确快速定位异常现象,问题根源,这就需要完善的监控机制。
第九,分布式系统需要良好的运行性能。分布式服务调用相比单机应用调用而言,它的延迟是比较大的,至少相差一个数量级别。并且一个应用往往需要调用数个或数十个服务实例,这对于分布式系统的调用方式、服务调用延迟等提出了更高的性能要求。作为开发人员,你需要结合业务特点,从网络通信机制,IO机制,线程并发,内存消耗,运行时耗等技术基础和性能指标等方面综合考虑。最终达到一个相对良好的运行性能。
当然,这里只是简单介绍下分布式系统开发过程需要注意的方面。并不是涉及到具体的业务处理方法,技术选型,架构选择等,例如良好的运行性能可能需要尽量避免分布式事务,尽可能用业务异步处理替代业务同步处理等。
那么,猿,你在开发分布式服务系统过程中,注意到这些了吗?
你一般如何考虑呢?