千万级调用量微服务架构实践

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 微服务架构在大型电商中的运用电商是促销拉动式的场景,也是价格战驱动的场景。618和双11都是典型的促销活动。其实都是在抢用户、扩市场占有率。

微服务架构在大型电商中的运用

img_ac805ea6d9fd7c6a70439dd42cc082a1.jpe


电商是促销拉动式的场景,也是价格战驱动的场景。618和双11都是典型的促销活动。其实都是在抢用户、扩市场占有率。在这样的场景之下,对秒杀、抢购是很热衷的玩法。


img_b462568d8e74a287952e8074e4949c10.png

促销式的拉动对系统的挑战是什么呢?

可以从上图里看到:对高可用性的要求是非常高的,需要99.99%的高可用性。快速迭代对对系统容性的要求很高,从几万单变成几十万单、百万单,架构上不能影响快速迭代,所以有空中加油或者是高速公路换轮胎的说法。


另外,为了应对瞬间的海量访问(尤其是秒杀场景),系统需要高可伸缩(快速扩容和缩容),这些都是对系统的要求。

img_847a5b834e072714a6ff390c63f83c0f.png

大型电商系统的架构

从下往上,数据层,埋点数据把用户行为数据,实时数据存储在NoSQL、关系型数据库、大数据平台 。

img_91e0a2012e00ccf9d9ec4fd7a6588b07.jpe



基础架构层

这层实际上是中间件和服务,包括MQ的消息、job的调试中心、sso联合登陆,还有发消息的,分布式的文件存储,用户上传的一些图片等等,除此之外还有应用监控的整个体系、自动发布的框架,支持到AB测试。

基础服务层

再上面一层就是基础服务层,这实际上是用基础架构层提供的组件和服务,加上一些业务逻辑,构建了一些公用的服务,包括OMS、PMS采购,运费模板、配送区域等,这些都是电商最常用的基础服务。

业务服务层

业务服务层我们可以看到的是,比如用户在前台能看到的界面,比如购物车、订单、首页,不管是不是微服务,至少是服务化的。这层就是所有网站应用的核心。除此之外就是第三方平台的api对接。


虚拟类目相当于“标签”,比如我们正常的类目叫做“生鲜”、“服装”,还有一些虚拟的类目叫做“618特卖”,里面会聚合很多的商品,可以理解为一个标签,作为展示用。


暴露在最顶层的我们可以看到,这些就是各个端,比如H5、PC、官网,这就是最终可见的端。


img_dc118723b110ebef52b9febf3c33e7bf.png

微服务架构的设计

应用的无状态化

很多网站一开始可能不是微服务化的,在早期的一些项目里,我们为了快速上线交付,会做一些单体的应用。随着订单量的发展,我们就开始做所谓的“微服务化”,第一步是把所谓的单体应用,变成应用的无状态化,以登录SSO来看,就是一种解决去状态化的方法。我们会拿到一个token,每次访问都会带着token,这就是所谓的去状态化。之后每一个应用都有横向可扩的能力。当访问量大的时候,就可以通过加服务器来增强水平扩展的能力。

这种应用无状态,其实配置文件还是有状态的。比如访问的数据库和节点,这些是通过配置文件来完成。我说到的案例基本都是基于spring boot来做微服务化,相关技术框架包括:dubbo、zk、hystrix、rocketmq、elasticsearch、redis等等。

单体应用的拆分

在做了应用的无状态之后,就是对单体应用的拆分。拆分有几个维度,一个是从系统的维度,最简单的拆法就是前后台拆开。比如购物车、商品、搜索、首页等属于前端,而后端给网站运营人员用。

还可以按功能的维度来拆分,对于用户服务,从service层到表结构,其实是可以独立部署的,这就是微服务的概念。技术架构反应的就是组织架构,在这种架构下开发团队分为用户服务开发组,价格开发组,商品开发组等。

还可以根据读写维度进行拆分。比如搜索和商城的索引肯定是独立的两个服务。用户注册下单支付是一个完整的业务流程。这些是由若干个微服务构成。


img_cd41f140189dcf9fa6ad69fed34ce2ec.png

服务架构搭建


img_3736371c4923e567c847fefb47c84a24.jpe

数据的异构

在大型电商系统里面的服务架构搭建的经验和技巧。首先是数据的异构,以订单表为例,一般订单都非常庞大,一般按照id来分表分库。这种分法对于查询用户所有订单时就要去各表捞数据,因此可以按用户维度来异构一张表。对于数据的存储,会分为热数据、冷数据和温数据,分别存在不同的地方。同时也会对数据进行聚合。在一些订单详情页,由于有很多ajax请求,由于请求数太多,也需要做一些请求合并。后台的服务也要做一个合并。

以商品详情页为例,使几个接口的数据缓存合并在redis中,从redis中取得聚合好的数据,称为数据闭环。这是优化网络请求的通常做法。

缓存

缓存在大型电商系统中是常用的优化技巧。浏览器级别的缓存通过响应头进行设置。还会用到app客户端的缓存,把H5/CSS/JS/图片打包,提前拉到客户端,在客户端做一个代理服务器,但是不会读取数据。可以提升用户体验。缓存的使用在网络上还有常用的cdn。进到接入层后,如果使用软负载,也可以使用内存级别的缓存。

消息队列的应用

消息队列的应用,是做服务解耦的好方法。也要考虑消息失败和重试的场景,需要来做一些额外补偿来防止数据丢失。还有一个机制是数据的校验和补偿。很多的场景能做到的是最终一致性,大型的电商系统和金融系统场景非常不一样,在设计分布式系统时,这是常用的方式。在电商中大多数情况只要实现最终一致性就可以了。

高可用的架构设计

高可用的架构设计,对于电商来说,其实高可用是最基本的要求。如果在促销时,引来千万级别的用户,宕机会损失很大。

服务的降级、分组和故障的隔离

基于微服务架构的电商系统,高可用的方案有以下几个部分,首先要支持服务的降级。要做降级的开关,写在配置中心里面。比如在大促时,先把订单放在缓存时,再进行落库等操作。同时还要有服务分组和故障的隔离。比如秒杀时,对秒杀的应用单独部署服务,当秒杀的应用挂了之后,不会影响其他服务,因为有服务的隔离。同时要有限流机制,很多的框架都有支持。

流量治理

在极限的场景下, 对流量的治理要从多层面进行。比如在促销当天,会开启对于爬虫和机器人的流量进行限流。一般会在大促前进行封板,如果出现问题,就进行回滚,比如数据版本的回滚,在设置数据结构的时候,要做支持带数据版本号的回滚。

业务设计

业务设计方面的思考。从图中可以看到订单支付的流程。在设计的时候要考虑防重设计,可以采用防重key或者防重表的方案,但是耗费和代价很高,会在某些场景使用,比如积分,扣费等和金钱相关的场景下用。


img_c09f547eb16693ab78ac39fe985dcab5.jpe

业务设计要考虑状态机。尤其是订单的流转状态里,要做状态机的应用,包括正向和逆向流程,及其产生的结果。

大型移动电商的架构

img_d7e992457f6a1d2ddd545386f40bda33.png

动态路由

最后来回顾一下大型移动电商的架构。下图是一个移动电商的完整架构。从app端,主要做的是静态文件的缓存和智能的动态路由。中国的网络环境很复杂,需要在app端做智能动态路由。可以上一些cdn,对动态的内容也做链路优化。会有一些对网络环境检测的机制,可以是cdn,或者是走域名,也可以暴露ip。

img_a76ae036dfabfed1a6a4fd301abaa7fb.jpe

埋点和网关

移动电商里对app来说还有一个很重要的是埋点,指的是全链路埋点。从app里用户的每一个操作,这个操作经过网络、服务层、中间件,整个链路要可以监控。对于快速的定位问题是非常有帮助的,尤其是移动电商性能的优化,第一步就是埋点。

在网络这一层,还有网关的接入。比如限流,动态负载。在网关里没有加太多逻辑,也有不同的做法。对于服务来说,最复杂的是服务的依赖和治理。服务之间调用的优化要基于业务场景,比如说购物车的服务,调用到价格、库存、促销等。当依赖的服务不可用的时候,比如价格不可用,设计依赖的时候,要在购物车服务中做一个缓存,来对缓存调用,最后再对最终一致性进行验证。

全链路监控的做法,需要做到预警,这就是一个基础。通过对数据的监控请求来后,根据场景来做预警方案。

欢迎工作一到五年的Java工程师朋友们加入Java架构开发:860113481

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
18天前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
17天前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
131 68
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
16天前
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
143 36
微服务架构解析:跨越传统架构的技术革命
|
4天前
|
弹性计算 Java 关系型数据库
Web应用上云经典架构实践教学
Web应用上云经典架构实践教学
Web应用上云经典架构实践教学
|
19天前
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
19天前
|
算法 NoSQL Java
微服务架构下的接口限流策略与实践#### 一、
本文旨在探讨微服务架构下,面对高并发请求时如何有效实施接口限流策略,以保障系统稳定性和服务质量。不同于传统的摘要概述,本文将从实际应用场景出发,深入剖析几种主流的限流算法(如令牌桶、漏桶及固定窗口计数器等),通过对比分析它们的优缺点,并结合具体案例,展示如何在Spring Cloud Gateway中集成自定义限流方案,实现动态限流规则调整,为读者提供一套可落地的实践指南。 #### 二、
42 3
|
18天前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
31 1
|
19天前
|
监控 安全 持续交付
构建高效微服务架构:策略与实践####
在数字化转型的浪潮中,微服务架构凭借其高度解耦、灵活扩展和易于维护的特点,成为现代企业应用开发的首选。本文深入探讨了构建高效微服务架构的关键策略与实战经验,从服务拆分的艺术到通信机制的选择,再到容器化部署与持续集成/持续部署(CI/CD)的实践,旨在为开发者提供一套全面的微服务设计与实现指南。通过具体案例分析,揭示如何避免常见陷阱,优化系统性能,确保系统的高可用性与可扩展性,助力企业在复杂多变的市场环境中保持竞争力。 ####
36 2
|
19天前
|
消息中间件 运维 API
后端开发中的微服务架构实践####
本文深入探讨了微服务架构在后端开发中的应用,从其定义、优势到实际案例分析,全面解析了如何有效实施微服务以提升系统的可维护性、扩展性和灵活性。不同于传统摘要的概述性质,本摘要旨在激发读者对微服务架构深度探索的兴趣,通过提出问题而非直接给出答案的方式,引导读者深入
38 1
|
17天前
|
Cloud Native API 持续交付
云原生架构下的微服务治理策略与实践####
本文旨在探讨云原生环境下微服务架构的治理策略,通过分析当前面临的挑战,提出一系列实用的解决方案。我们将深入讨论如何利用容器化、服务网格(Service Mesh)等先进技术手段,提升微服务系统的可管理性、可扩展性和容错能力。此外,还将分享一些来自一线项目的经验教训,帮助读者更好地理解和应用这些理论到实际工作中去。 ####
34 0