摘要:
2020年3月,本人就职的某互联网公司承担了“XXAPP电子商务系统”的开发,该项目是集团为用户提供电子商务业务的重点项目,主要实现消费者的网上购物和在线支付以及各种商务活动、交易活动。本人作为商城部门的核心成员有幸加入其中,担任架构师一职,主要负责该系统的架构设计和分布式部署。该系统用户面向广大移动端PC端互联网用户,主要用于提供用户网上订购、在线支付、营销活动、商品维护、订单报表等复杂的相互耦合的业务逻辑,且对性能要求高的服务能力。本文以该项目为例,最终确定本系统采用分布式计算、分布式数据存储与管理、分布式通信等分布式高可用架构,为开发团队从结构上解决了复杂业务场景和性能的难题,系统上线后得到了广大用户和集团对于系统的认可。
正文:
2020年3月,我参与了公司电子商务系统的开发,担任系统架构师职务,进行系统的架构工作。该系统的外部实体主要是分为4类组织,用户,商户,系统管理人员,金融支付机构。电商系统有几个特点,模型多且复杂度高,数据流链路长,业务变化快,应对突发流量性能要求高等特点。包括商品库存、订单支付、营销活动、售后配送、用户权益、商户管理等几大业务模型。随着业务不断迭代之后,每个模型的边界和管理会越来越复杂和逻辑冗余。
考虑到系统的复杂性和数据的多元化问题,项目整体采用分布式体系结构设计,包括:分布式计算,用于解决应用的分布式计算问题,基于分布式计算模式,包括批处理任务计算、离线计算、在线计算、融合计算等,根据应用类型构建高效智能的分布式计算框架;分布式数据存储与管理,解决数据的分布式和多元化问题;分布式数据库、分布式文件系统、分布式缓存,支持不同类型数据的存储和管理。分布式通信,解决进程之间的分布式通信问题;通过消息队列,远程调用,订阅发布等方式,实现简单高效的通信;分布式资源池化,解决资源的分布式和异构性问题,CPU、内存、GPU、网络等物理资源虚拟化,形成逻辑资源池以便统一管理。
1、分布式计算
在电子商务系统中实现订单报表与支付流水等信息时,经常是在海量数据中进行统计与计算。架构组把一个大计算任务拆分成多个小计算任务分布到若干台机器上去计算,然后再进行结果汇总。目的在于分析计算海量的数据,实时计算各地区的消费习惯等。由于数据的爆发式增长、单机性能却跟不上,才有分布式计算这种妥协方案。 系统中批处理任务计算一旦拆分,问题会变得非常复杂,像一致性、数据完整、通信、容灾、任务调度等问题也在其他分布式架构中解决。
2、分布式数据存储与管理
分布式数据存储与管理解决数据的分布式和多元化问题,主要有分布式数据库、分布式文件系统、分布式缓存,支持不同类型数据的存储和管理。分布式文件系统的数据存储解决方案,归根结底是将大问题划分为小问题。电商系统维护分布数据在两地三中心站点上的数据库。数据库既有水平拆分,也有垂直拆分存储商品信息、活动信息和订单信息等数据。生产中心、同城容灾中心、异地容灾中心,三个中心由一个分布式数据库对数据进行存储和管理,从而解决数据的分布式多元化问题。
3、分布式通信
分布式通信使用RPC远程服务通讯以及消息队列中间件,解决进程之间的分布式通信问题,实现简单高效的通信。远程调用是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议,RPC跨越了传输层和应用层实现分布式通信和信息同步。消息队列中间件Kafka在生产者和消费者传递消息,将消息组装成topic消息数据的逻辑上的集合,分布式消息存储机制 分散的存储在多台kafka的机器上 将很多数据打包一次发送提升单位时间内发送的数据数量,同时提高数据一致性、数据完整,从微观来说,这种需求也可理解为不同的分布式系统之间传递消息。
4、分布式资源池化
服务提供商先要保证拥有个容量充足的资源池以满足在并发的业务高峰时刻仍能满足用户的服务要求,这就是服务的资源池化,云计算的技术方案好能做到资源池化和虚拟化的无缝连接,资源池化可以形成逻辑资源池以便统一管理。
5、分布式协同
在系统中分布式协同技术使用Dubbo与ZooKeeper解决分布式状态及数据的一致性、分布式互斥、分布式选举、分布式共识问题;Zookeeper提供集中管理配置的方法保证了可靠和一致性。 分布式事务基于RocketMQ来实现事务,支持事务消息的方式也是类似于采用的二阶段提交,两个阶段分别为提交请求和提交。协调者根据参与者的响应来决定是否需要真正地执行事务,进而解决分布式协同问题。
6、分布式调度
分布式调度使用ElasticJob解决资源调度问题,为轻量级无中心化解决方案,使用JAR包提供分布式任务的调度和治理。实现单体调度、双层调度、共享调度等,在分布式环境中,任务能够按指定的调度策略执行,并且能够避免同一任务多实例重复执行。
7、分布式追踪与高可用
系统为解决分布式可靠性问题,例如分布式日志搜集、分布式问题建模、负载均衡、流量控制、故障隔离、故障恢复等。在项目中设计层面Dubbo已支持负载均衡,部署层面系统增加前置机,所有请求都通过前置机的nginx的反向代理处理来转发。利用nginx可以动态配置负载均衡。在发生故障时也可以做做隔离与故障恢复等工作。
8、分布式部署
由于系统经常性有营销活动带来的高并发访问,单台服务器已经无法承受访问压力,为了系统具有更好的性能,架构组把系统进行拆分并部署到多台服务器上的系统,解决分布式部署高可用性,自动容错等问题。经讨论根据业务水平拆分,水平增加加入Nginx 业务服务器;增加分布式的文件系统;按业务进行缓存分离,实现业务-缓存分离集群;对MySQL数据库的做主从集群、读写分离;加入消息系统,可以进行分布式通信处理;对资源池进行部分上云动态扩容和实地机房;对重要的节点进行两地三中心集群部署,以保障可用性,大幅避免分布式部署给开发带来的问题。
结论:
经历XXAPP电商系统架构完整设计过程,分布式高可用架构的设计与落地,为开发团队从结构上解决了复杂业务场景和性能的难题,系统上线后得到了广大用户和集团对于系统的认可。使得系统的可维护性、性能、可修改性、安全性更强,使我认识到架构不只是技术,而是要用技术解决架构中的核心关注点,遵循一定架构过程和原则才能设计一个好的系统架构。