日订单500万的高可用购物系统,究竟隐藏着怎样的“绝密”?购物系统瞬时高并发能力的优化升级,保障消费者丝般顺畅的购物体验。下面介绍一下苏宁购物系统应对大促的策略和方法。使用技巧:购物系统高可用架构设计的“艺术”是架构设计的方法论。购物系统的架构经过多次更新迭代,其目的是打造一个高可用、高性能、易扩展、可扩展的应用系统。为了细化整个流程,我们主要做了三个方面的工作:系统架构优化设计数据库性能优化高可用性优化应用系统架构优化设计根据康威定律,组织形式等同于系统设计。为了适应快速的开发迭代节奏,购物系统的所有功能都集中在一个集群中。随着业务的发展,功能越来越复杂,单一集群成为制约系统性能的最大瓶颈。图1:苏宁购物系统架构设计因此,系统优化首先要做的就是重构购物系统架构。一方面,对系统进行横向切分和分层,包括:网络层:通过CDN加速响应。CDN缓存一方面提高了静态内容的访问速度,减轻了服务器的压力;另一方面,CDN内网专线加快了回源速度。荷载层:包括四层荷载和七层荷载。功能包括流量调度、流量控制、安全防护、黄牛防护等。另外,负载层也会做一些轻量级服务的Lua聚合,提高响应性能。应用层:该层主要实现业务功能逻辑。服务层:为应用层提供原子服务,如会员、优惠券领取、寻源、时效、订单生成、支付等。数据层:提供数据存储和访问服务,如数据库、缓存等;提供数据提取和分析服务,如Hbase、Hive。另一方面,根据团购的业务特点,进行垂直切分,将原来耦合的功能逻辑拆分为三层:PGS-WEB、PGS-TASK-WEB、PGS-ADMIN_WEB。每个模块部署在一个独立的集群中,集群与服务层通过分布式远程调用提供的原子服务协同工作。其中:PGS-WEB:前台业务处理模块。包括展示、交易、营销三个单元模块。每个模块可以划分为更细粒度的子模块。例如,营销模块可以细分为四个轻量级的玩法模块:新邀请群、议价群、扩容红包、应援群。可以根据业务需要,对不同的模块进行插拔、扩展。PGS-TASK-WEB:中台定时任务处理模块,主要用于处理定时任务,支付逻辑也在这一层。PGS-ADMIN_WEB:后台管理模块,主要用于运营商的维护活动、商品、玩法等。数据库性能优化在高并发场景下,提交订单、生成拼团记录、查询订单等操作都会给数据库带来很大的压力,而这些需要高一致性的操作不能直接使用分布式缓存来替代数据库.要给数据库降温,提高数据库的并发处理能力,数据库必须具备水平扩展的能力。因此,我们基于Mycat数据库中间件,实现了购物系统数据库的分库分表策略。图2:高并发场景下MySQL数据库负载能力趋势Mycat是MySQL的分库分表的中间件,类似于Web服务器的Nginx,是应用程序和数据库之间的代理层。由于Mycat是一个开源的中间件,这里不再详细阐述技术实现,主要讨论如何在购物系统中应用。如下图,业务逻辑的数据操作通过Mycat划分到三个数据库DataNode1~3,而这个分库过程的应用本身是无感知的。图3:苏宁购物系统基于Mycat的分库架构。每个数据库写一次读两次。组和组明细的操作分片规则基于组ID(GROUP_ID),订单的操作分片规则基于订单ID(ORDER_ID)。另外还有一个单独的BackupDB用于大数据的提取和数据备份,使用Canal来保证BackupDB中的数据是全量的。当Mycat出现问题时,我们可以在应用层切换数据源,降级为单库来保证业务。应用高可用优化对于应用层面的优化,主要包括两个方面:分布式缓存和异步化。使用Redis分布式锁解决并发场景的一致性问题。比如为了防止订单重复处理,我们使用Jedis事务Transaction+SETNX命令实现Redis分布式锁:Transactiontransaction=jedis.multi();//返回一个事务控制对象transaction.setnx(tmpLockKey,"lock");//SetifNotExisttransaction.expire(tmpLockKey,locktime);List