资源预览内容
第1页 / 共23页
第2页 / 共23页
第3页 / 共23页
第4页 / 共23页
第5页 / 共23页
第6页 / 共23页
第7页 / 共23页
第8页 / 共23页
第9页 / 共23页
第10页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
构建高并发高可用的电商平台架构实践一、 设计理念1. 空间换时间1) 多级缓存,静态化客户端页面缓存(http header 中包含 Expires/Cache of Control,last modified(304,server 不返回 body,客户端可以继续用 cache,减少流量) ,ETag)反向代理缓存应用端的缓存(memcache)内存数据库Buffer、cache 机制(数据库,中间件等)2) 索引哈希、B 树、倒排、bitmap哈希索引适合综合数组的寻址和链表的插入特性,可以实现数据的快速存取。B 树索引适合于查询为主导的场景,避免多次的 IO,提高查询的效率。倒排索引实现单词到文档映射关系的最佳实现方式和最有效的索引结构,广泛用在搜索领域。Bitmap 是一种非常简洁快速的数据结构,他能同时使存储空间和速度最优化(而不必空间换时间) ,适合于海量数据的的计算场景。2. 并行与分布式计算1) 任务切分、分而治之(MR)在大规模的数据中,数据存在一定的局部性的特征,利用局部性的原理将海量数据计算的问题分而治之。MR 模型是无共享的架构,数据集分布至各个节点。处理时,每个节点就近读取本地存储的数据处理(map),将处理后的数据进行合并(combine)、排序(shuffle and sort)后再分发( 至reduce 节点),避免了大量数据的传输,提高了处理效率。2) 多进程、多线程并行执行(MPP)并行计算(Parallel Computing)是指同时使用多种计算资源解决计算问题的过程,是提高计算机系统计算速度和处理能力的一种有效手段。它的基本思想是用多个处理器/进程/线程来协同求解同一问题,即将被求解的问题分解成若干个部分,各部分均由一个独立的处理机来并行计算。和 MR 的区别在于,它是基于问题分解的,而不是基于数据分解。3. 多维度的可用1) 负载均衡、容灾、备份随着平台并发量的增大,需要扩容节点进行集群,利用负载均衡设备进行请求的分发;负载均衡设备通常在提供负载均衡的同时,也提供失效检测功能;同时为了提高可用性,需要有容灾备份,以防止节点宕机失效带来的不可用问题;备份有在线的和离线备份,可以根据失效性要求的不同,进行选择不同的备份策略。2) 读写分离读写分离是对数据库来讲的,随着系统并发量的增大,提高数据访问可用性的一个重要手段就是写数据和读数据进行分离;当然在读写分离的同时,需要关注数据的一致性问题;对于一致性的问题,在分布式的系统 CAP 定量中,更多的关注于可用性。3) 依赖关系平台中各个模块之间的关系尽量是低耦合的,可以通过相关的消息组件进行交互,能异步则异步,分清楚数据流转的主流程和副流程,主副是异步的,比如记录日志可以是异步操作的,增加整个系统的可用性。当然在异步处理中,为了确保数据得到接收或者处理,往往需要确认机制(confirm、ack)。但是有些场景中,虽然请求已经得到处理,但是因其他原因(比如网络不稳定) ,确认消息没有返回,那么这种情况下需要进行请求的重发,对请求的处理设计因重发因素需要考虑幂等性。4) 监控监控也是提高整个平台可用性的一个重要手段,多平台进行多个维度的监控;模块在运行时候是透明的,以达到运行期白盒化。4. 伸缩1) 拆分拆分包括对业务的拆分和对数据库的拆分。系统的资源总是有限的,一段比较长的业务执行如果是一竿子执行的方式,在大量并发的操作下,这种阻塞的方式,无法有效的及时释放资源给其他进程执行,这样系统的吞吐量不高。需要把业务进行逻辑的分段,采用异步非阻塞的方式,提高系统的吞吐量。随着数据量和并发量的增加,读写分离不能满足系统并发性能的要求,需要对数据进行切分,包括对数据进行分库和分表。这种分库分表的方式,需要增加对数据的路由逻辑支持。2) 无状态对于系统的伸缩性而言,模块最好是无状态的,通过增加节点就可以提高整个的吞吐量。5. 优化资源利用1) 系统容量有限系统的容量是有限的,承受的并发量也是有限的,在架构设计时,一定需要考虑流量的控制,防止因意外攻击或者瞬时并发量的冲击导致系统崩溃。在设计时增加流控的措施,可考虑对请求进行排队,超出预期的范围,可以进行告警或者丢弃。2) 原子操作与并发控制对于共享资源的访问,为了防止冲突,需要进行并发的控制,同时有些交易需要有事务性来保证交易的一致性,所以在交易系统的设计时,需考虑原子操作和并发控制。保证并发控制一些常用高性能手段有,乐观锁、Latch 、mutex 、写时复制、CAS 等;多版本的并发控制 MVCC 通常是保证一致性的重要手段,这个在数据库的设计中经常会用到。3) 基于逻辑的不同,采取不一样的策略平台中业务逻辑存在不同的类型,有计算复杂型的,有消耗 IO 型的,同时就同一种类型而言,不同的业务逻辑消耗的资源数量也是不一样的,这就需要针对不同的逻辑采取不同的策略。针对 IO 型的,可以采取基于事件驱动的异步非阻塞的方式,单线程方式可以减少线程的切换引起的开销,或者在多线程的情况下采取自旋 spin 的方式,减少对线程的切换( 比如oracle latch 设计) ;对于计算型的,充分利用多线程进行操作。同一类型的调用方式,不同的业务进行合适的资源分配,设置不同的计算节点数量或者线程数量,对业务进行分流,优先执行优先级别高的业务。4) 容错隔离系统的有些业务模块在出现错误时,为了减少并发下对正常请求的处理的影响,有时候需要考虑对这些异常状态的请求进行单独渠道的处理,甚至暂时自动禁止这些异常的业务模块。有些请求的失败可能是偶然的暂时的失败(比如网络不稳定 ),需要进行请求重试的考虑。5) 资源释放系统的资源是有限的,在使用资源时,一定要在最后释放资源,无论是请求走的是正常路径还是异常的路径,以便于资源的及时回收,供其他请求使用。在设计通信的架构时,往往需要考虑超时的控制。二、 静态架构蓝图整个架构是分层的分布式的架构,纵向包括 CDN,负载均衡/反向代理,web 应用,业务层,基础服务层,数据存储层。水平方向包括对整个平台的配置管理部署和监控。三、 剖析架构1. CDNCDN 系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet 网络拥挤的状况,提高用户访问网站的响应速度。对于大规模电子商务平台一般需要建 CDN 做网络加速,大型平台如淘宝、京东都采用自建CDN,中小型的企业可以采用第三方 CDN 厂商合作,如蓝汛、网宿、快网等。当然在选择 CDN 厂商时,需要考虑经营时间长短,是否有可扩充的带宽资源、灵活的流量和带宽选择、稳定的节点、性价比。2. 负载均衡、反向代理一个大型的平台包括很多个业务域,不同的业务域有不同的集群,可以用 DNS 做域名解析的分发或轮询,DNS 方式实现简单,但是因存在 cache 而缺乏灵活性;一般基于商用的硬件 F5、NetScaler 或者开源的软负载 lvs 在 4 层做分发,当然会采用做冗余 (比如lvs+keepalived)的考虑,采取主备方式。4 层分发到业务集群上后,会经过 web 服务器如 nginx 或者 HAProxy 在 7 层做负载均衡或者反向代理分发到集群中的应用节点。选择哪种负载,需要综合考虑各种因素(是否满足高并发高性能,Session 保持如何解决,负载均衡的算法如何,支持压缩,缓存的内存消耗) ;下面基于几种常用的负载均衡软件做个介绍。LVS,工作在 4 层,Linux 实现的高性能高并发、可伸缩性、可靠的的负载均衡器,支持多种转发方式(NAT、DR、IP Tunneling),其中 DR 模式支持通过广域网进行负载均衡。支持双机热备(Keepalived 或者 Heartbeat)。对网络环境的依赖性比较高。Nginx 工作在 7 层,事件驱动的、异步非阻塞的架构、支持多进程的高并发的负载均衡器/反向代理软件。可以针对域名、目录结构、正则规则针对 http 做一些分流。通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持 url 来检测。对于session sticky,可以基于 ip hash 的算法来实现,通过基于 cookie 的扩展 nginx-sticky-module支持 session sticky。HAProxy 支持 4 层和 7 层做负载均衡,支持 session 的会话保持, cookie 的引导;支持后端url 方式的检测;负载均衡的算法比较丰富,有 RR、权重等。对于图片,需要有单独的域名,独立或者分布式的图片服务器或者如 mogileFS,可以图片服务器之上加 varnish 做图片缓存。3. App 接入应用层运行在 jboss 或者 tomcat 容器中,代表独立的系统,比如前端购物、用户自主服务、后端系统等协议接口,HTTP、JSON可以采用 servlet3.0,异步化 servlet,提高整个系统的吞吐量http 请求经过 Nginx,通过负载均衡算法分到到 App 的某一节点,这一层层扩容起来比较简单。除了利用 cookie 保存少量用户部分信息外 (cookie 一般不能超过 4K 的大小),对于 App 接入层,保存有用户相关的 session 数据,但是有些反向代理或者负载均衡不支持对session sticky 支持不是很好或者对接入的可用性要求比较高(app 接入节点宕机,session 随之丢失),这就需要考虑 session 的集中式存储,使得 App 接入层无状态化,同时系统用户变多的时候,就可以通过增加更多的应用节点来达到水平扩展的目的。Session 的集中式存储,需要满足以下几点要求:a、高效的通讯协议b、session 的分布式缓存,支持节点的伸缩,数据的冗余备份以及数据的迁移c、 session 过期的管理4. 业务服务代表某一领域的业务提供的服务,对于电商而言,领域有用户、商品、订单、红包、支付业务等等,不同的领域提供不同的服务,这些不同的领域构成一个个模块,良好的模块划分和接口设计非常重要,一般是参考高内聚、接口收敛的原则,这样可以提高整个系统的可用性。当然可以根据应用规模的大小,模块可以部署在一起,对于大规模的应用,一般是独立部署的。高并发:业务层对外协议以 NIO 的 RPC 方式暴露,可以采用比较成熟的 NIO 通讯框架,如netty、mina可用性:为了提高模块服务的可用性,一个模块部署在多个节点做冗余,并自动进行负载转发和失效转移;最初可以利用 VIP+heartbeat 方式,目前系统有一个单独的组件 HA,利用 zookeeper 实现(比原来方案的优点)一致性、事务:对于分布式系统的一致性,尽量满足可用性,一致性可以通过校对来达到最终一致的状态。5. 基础服务中间件1) 通信组件通信组件用于业务系统内部服务之间的调用,在大并发的电商平台中,需要满足高并发高吞吐量的要求。整个通信组件包括客户端和服务端两部分。客户端和服务器端维护的是长连接,可以减少每次请求建立连接的开销,在客户端对于每个服务器定义一个连接池,初始化连接后,可以并发连接服务端进行 rpc 操作,连接池中的长连接需要心跳维护,设置请求超时时间。对于长连接的维护过程可以分两个阶段,一个是发送请求过程,另外一个是接收响应过程。在发送请求过程中,若发生 IOException,则把该连接标记失效。接收响应时,服务端返回SocketTimeoutException,如果设置了超时时间,那么就直接返回异常,清除当前连接中那些超时的请求。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号