AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

1 号店 11.11:从应用架构落地点谈高可用高并发高性能

  • 2015-11-10
  • 本文字数:4384 字

    阅读完需:约 14 分钟

1. 背景

1.1 三高是电商核心交易系统的基础

电商核心交易系统有很多特点,如分布式、高可扩展等,在众多特性中,高可用、高并发、高性能是基础。大到技术峰会、论坛、研讨会,小到一场面试,高可用、高并发、高性能始终是焦点,是技术大牛、技术追随者永远津津乐道的话题,成为他们毕生的追求。

另,ArchSummit 全球架构师峰会北京站将于 2015 年 12 月 18 日~19 日在北京国际会议中心召开,大会设置了《揭秘双十一背后的技术较量》专题来深入解读双十一背后的技术故事,欢迎关注。

1.2 三高首先依赖的是架构

日常和同行、同事的交流过程中,大家经常讨论的问题就是,你们是如何做到高可用的?访问峰值达到了什么级别,系统怎么撑住的?高并发下怎么保证数据一致性?性能如何提升?采用了什么新技术?

尽管大家的答案各有不同,从硬件到软件、从程序到 SQL、从静态到动态、从 C 到 JAVA,但大家最终总能达成一致,高可用、高并发、高性能依靠的不是某个硬件、某种技术、某种 DB,而是好的架构。

1.3 能落地的架构才是好架构

好架构很多,网上随便一搜,微软、Google、阿里、京东等众多大牛的架构图很多,都是好架构。

当然今天我们不是来谈什么是好架构,因为我们从不缺架构图。架构图是形,怎么落地是神;就如军用材料,技术大家都懂,工艺才是关键。

所以,能落地的架构才是好架构,当然我们更缺的是好架构的落地点。

2. 1 号店如何做三高

1 号店技术部从 1 个人做起到今天千人级别的规模,系统支持每天亿级的访问量、单 Service 支持每天亿级的请求、订单支持每分钟几万单级别、Service 服务可用性达到 99.9999%,架构上也经历了历次演进,今天我们就从应用架构历次演进的落地点谈起。

1 号店应用架构的演进大致经历了以下历程:强依赖 -> Service 化 -> 业务解耦 -> 读写分离 -> 异步 -> 水平 / 垂直拆分 -> 服务逻辑分组等。

当然这个过程从不是串行的,永远是并行的,并且这个过程永远是在 1 号店这辆系统大巴行进过程中进行的,因为我们不能停车也不能刹车,而且还必须不断提速。

重要通知:接下来 InfoQ 将会选择性地将部分优秀内容首发在微信公众号中,欢迎关注 InfoQ 微信公众号第一时间阅读精品内容。

2.1 应用架构的最大演进 -SOA 治理

早期的 1 号店系统,遵循简单的 MVC 架构,Controller 层处理了所有的业务逻辑包括与 DB 的交互,在系统初期这种 Simple 的架构方便快捷,成本低业务响应快。但当业务开始变得复杂、人员规模爆发式增长,这种强耦合强依赖带来的弊端就成了巨大的瓶颈,代码耦合度高互相冲突、出错概率和事故概率明显提升,业务需求不能快速响应,SOA 治理迫在眉睫,解耦和去依赖成为第一需求,于是 Service 化成为第一前提。

2.2 SOA 治理 - Service 日志是保障

1. 做 Service 首先是规划,Service 规划的第一步首先考虑什么?大家可以先自行考虑下

  • 很多人想的是采用什么 RPC 框架、采用什么技术,怎么让性能更高;也有人首先想的是业务怎么拆分,怎么才能更合理。
  • 我们首先想到的是如何做监控和问题定位。
  • 高可用不是一步做到的,我们的 Service 可用性不是一步达到 99.9999% 的,在这过程中一定会有很多的问题出现,怎么提前发现这些问题、出现问题后如何快速定位,这才是最重要的。这只能依赖日志,这是监控和问题定位的基础。

2. 下单接口业务性强,其对可用、并发、性能的要求作为技术人你懂的。我们就从这个接口开始下手,但我们没有先去分析业务,首先想的是如何定义日志系统,让以后的监控和问题定位更简单更快捷。事实证明这个决定是对的,直到现在 1 号店的大部分订单相关的监控、预警、问题排查定位等完全依赖这个日志。

3. 日志系统的设计基于以下:一是进数据库、持久化有序化,二是分类化、层次化、错误 code 唯一。

  • 进数据库、持久化有序化这个大家都理解,我曾经接手过的一个应用系统,一天下来 Tomcat 的 log 文件大小超过 1G,会让你崩溃的。
  • 分类化、层次化、特别是错误 code 唯一这个是关键,它是大海航行中的那盏灯塔,让你可以瞬间定位问题位置,它给监控预警带来的好处同样伟大,可以从各个维度去做监控预警。

4. 1 号店现在有了很好的 SOA 中间件 – Hedwig,可支持百亿级的访问请求,它有 SOA 级别的日志,也很完善。但应用级别的日志我们还是建议各应用系统自己做,它的业务性、个性化是公共架构永远代替不了的。

2.3 应用架构演进之落地

一定有人要问 1 号店采用的什么 RPC 框架,好吧,是 Hessian,这不是什么秘密。

为什么要用 Hessian?我偷偷告诉你,PHP 是最伟大的的开发语言。

2.3.1 业务垂直拆分

万事具备,草船已借箭,要从业务角度规划 Service 了。

我们从产品、用户、订单三个维度上对 Service 进行了规划,构成 1 号店应用架构上的三架马车,确立了 SOA 治理的框架基础。

在此基础上,又陆续衍生出促销、积分、支付等众多 Service 业务,在三架马车中同样会细分至如文描、价格、库存、下单、订单查询等垂直服务。

Service 化是前提,Service 化完成后,后面可以大刀阔斧地干了,因为业务独立了、DB 读写权限收回了,哈,好像整个天下都是我的了。但,得天下易治天下难,真正的大戏在后面。

2.3.2 读写分离

读写分离的重要性不需多讲,除了最简单的读写分离,写可以从应用层面继续细分,读也可以从应用和 DB 层面再细分,如订单的读写分离:

2.3.3 水平拆分

早在 2013 年,1 号店就实现了库存的水平拆分,2014 年又一举完成订单水平拆库 & 去 Oracle 迁 Mysql 项目。

订单水平拆库 & 去 Oracle 迁 Mysql 两个重量级的大项目合并为一个项目并完美无缝上线,在经济上时间上节省的是成本,在技术上体现的 1 号店的整体技术实力和水平。

2.3.4 服务逻辑分组

前面说到了读写分离,大家也注意到了,这是物理隔离。

物理分离好处明显,但其硬件成本、维护成本高的弊端也显而易见。这时候,我们的大杀器 -Hedwig 又上场了,有兴趣多来了解下我们 SOA 中间件 -Hedwig,这可是获总裁奖的项目。

Hedwig 提供了服务自动注册发现、软负载均衡、节点踢出与复活、服务动态逻辑分组、请求自动重试等众多 SOA 框架所需的强大功能,支持并行请求、灰度发布,其背后提供的调用链路及层次关系、日志分析、监控预警等更是为 SOA 治理提供了强大的后勤保障。

2.3.5 业务解耦 / 异步

上面提到的读写分离、水平拆分、逻辑分组等主要是从技术层面保障,也是技术人员最喜欢的话题。业务流程的梳理、优化、改造往往不被重视,但作为应用架构,我们最不能忽视的是业务。

  1. 我们的一个核心 Service 服务,性能从 2 年前的近 200ms 到现在的几十 ms,从代码上、sql 上的优化提升顶多占到 10%,更多地优化都在业务流程的梳理改造上。
  2. 我们曾经花费两周多的时间将一个系统的整体性能优化提升了近 10 倍,最后总结下来,纯技术的优化(代码或 sql 质量导致的性能差)几乎没有。 优化主要在两方面,一是架构上,如使用缓存、单 SKU 的循环查询改成批量查询等,这个能优化的也并不太多,因为我们的架构整体还是比较合理的;最大的优化还是在业务梳理上,很多地方我们使用了重接口,接口里很多逻辑计算和 DB 查询,这些逻辑并不是所有的业务场景都需要的,但开发人员为了简单没有将业务场景细分,导致大量不合理的调用,既浪费了服务器资源又严重影响用户体验;同样,很多地方为了一个不重要的展示或逻辑也产生大量不合理的调用,反而影响了核心业务,这些都是最需要优化的,也是优化效果最明显的。
  3. 异步本身不是什么高深的技术,关键是哪些业务可以走异步,这更体现架构师的业务理解能力和综合能力。 如下单成功后给用户的消息通知、发票详细信息的生成等都可以异步,我们在这方面做了很多工作,包括和各业务方的大量沟通制定方案等,在不牺牲用户体验又保证业务流程完整的情况下,尽量走异步解耦,这对可用、性能都是极大的提升。

3. 追求极致

开放、共享、追求极致是 1 号店技术人的理念。我们在追求极致上做了很多,简单举几个例子:

3.1 一个下单接口定义了 135 个错误编码

前面提到过日志和错误编码的定义,大家一定想象不到,我们仅一个下单接口就定义了 135 个错误编码。接口上线后至今出现的错误编码在 50-60 个,也就是说有 50-60 处不合理或错误的地方,这个不合理或错误既有业务的又有程序的也有我们对编码定义的不合理。

出现一个我们就解决一个,系统自然越来越健壮和稳定,目前日常每天下单出现 3-5 个错误编码,主要为业务性如特价商品已售完无库存等。

那没有出现过的几十个编码是不是就意味着我们工作白做了?

功夫下对了永远不会浪费,在下单接口上线近 2 年后,一个之前从未出现过的错误编码跳出来了,是一个很难出现的业务场景,但通过这个编码,我们马上定位了问题,都不用去看代码。

我们永远不能保证系统没有 bug,bug 可以藏的很深埋的很久,但我们不怕,因为我们的伏兵也一直在,你一跳我们立马抓,毫不犹豫。

3.2 Service 服务可用性 99.9999%

6 个 9 的 Service 服务可用性,可能有人不信,看看我们真实的监控邮件,这是每天亿级的调用量。

功夫永远在戏外,结果仅仅是一个结果,一步步踏实走过来的旅程才是我们收获最大的。

3.3 销售库存准确率 99.9999%,超卖率为 0

做过电商核心系统的人都明白库存控制的难度,库存不准甚至超卖的问题至今还有很多电商公司没有完全解决。

这个问题也曾经困扰我们,为此还专门写了一个库存刷子的程序来刷数据,现在这个程序已基本宣告废弃了,因为我们的库存准确率达到了 6 个 9,超卖率为 0。

怎么做到的?业务、业务、业务,重要的事说三遍。

我们团队花了 3 个多月的时间,对所有库存应用场景逐一排查,最终梳理出 16 个有问题的库存场景,并逐一协调解决,让库存形成严格的闭环线路,保证了库存的准确性。在这过程中,对库存闭环方案和对业务的理解成为关键,纯靠技术,我们能做的并不多。

4. 应用场景

4.1 业务监控 >

业务监控首提订单监控,对订单我们从实际订单数据和 Service 接口调用量两个维度去做监控,保证了监控系统的稳定和准确(监控系统也会出错的),其中下单接口调用量使用的就是 Service 日志数据。

4.2 服务监控

依赖查询

(点击放大图像)

服务监控

(点击放大图像)

5. 后言

电商核心交易系统的高可用、高并发、高性能不是一朝一夕的,需要好的技术,更需要好的架构,如何找到落地点并一步步踏实落地,这是关键。有想法、有目标、有执行力,必有所成。

我们是技术人,但我们的很多工作并不一定要多高深的技术,业务和技术的平衡点才是最重要的。业务敏锐性对应用架构师和开发人员来说都尤为重要,因为更多的时候我们要的是解决方案而不是技术方案。

谨以此献给那些在追求高可用、高并发、高性能道路上飞奔的同学们!祝你们早日三高:)


感谢郭蕾对本文的策划和审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-11-10 17:2312476

评论 1 条评论

发布
用户头像
高可用、高并发、高性能基于系统的全面监控和预警
2019-03-25 11:20
回复
没有更多了
发现更多内容

关于fastjson出现反序列化远程代码执行漏洞的通知

天翼云开发者社区

撑算力之帆,天翼云助力数字时代逐潮者远航

天翼云开发者社区

InfoQ 极客传媒 15 周年庆征文|一文读懂分布式系统本质:高吞吐、高可用、可扩展

No Silver Bullet

架构 分布式系统 可扩展 6月月更 InfoQ极客传媒15周年庆

多张图解,一扫你对多线程问题本质的所有误区

华为云开发者联盟

Java 开发

数字先锋| 天翼云牵手中能融合

天翼云开发者社区

AI“爷青回”:一键找回童年记忆

最新动态

Flutter 图片库重磅开源!

阿里巴巴终端技术

flutter 开源 native 客户端

2022年中国新能源汽车换电市场发展洞察

易观分析

新能源汽车

选择天翼云混合云管理平台的五大理由

天翼云开发者社区

多模态语义检索 | 基于 MetaSpore 快速部署 HuggingFace 预训练模型

Geek_a02d1e

机器学习 深度学习 开源 AI 多模态

龙蜥开发者说:不忘初心,方得始终 | 第 7 期

OpenAnolis小助手

开源 cpu 龙蜥开发者说 飞腾 不忘初心

样品管理系统解决方案

低代码小观

Lims LIMS实验室信息管理系统 LIMS系统

【Spring 学习笔记(一)】第一个Spring程序与IoC思想

倔强的牛角

6月月更

leetcode 417. Pacific Atlantic Water Flow 太平洋大西洋水流问题

okokabcd

LeetCode 搜索 数据结构与算法

Hoo研究院|一文速览风投机构NGC Ventures的加密布局

区块链前沿News

投资 VC Hoo NGC

这个API文档,太拽了吧!

Liam

前端 Postman API API文档 开放api

【高并发】在高并发环境下该如何构建应用级缓存?

冰河

并发编程 多线程 高并发 异步编程 6月月更

【云服务器】云计算平台的架构是什么样的?

Finovy Cloud

云服务器 GPU服务器

你的App是信息化时代的还是数字化时代的

FinClip

小程序开发

当AI抄起了水表

华为云开发者联盟

人工智能 modelarts workflow 智能水务

斐波那契系列

开发微hkkf5566

征文投稿丨基于轻量应用服务器搭建Hexo个人博客

阿里云弹性计算

node.js nginx git Hexo 轻量应用服务器

【LeetCode】 删除二叉搜索树中的节点Java题解

Albert

LeetCode 6月月更

5G+实时云渲染:交互实时云看车革新购车体验

3DCAT实时渲染

5G 汽车之家 汽车 元宇宙 实时云渲染

玩转云端|一文读懂天翼云CDN升级重点

天翼云开发者社区

使用 LakeSoul 构建实时机器学习样本库

Geek_a02d1e

机器学习 大数据 开源 新基建 湖仓一体

博云容器云产品族:如何实现让“Any APP on Any Kubernetes”?

BoCloud博云

云原生 容器云

Java 中三大类数据类型

迷篱

天猫精灵语音技能单轮对话表达式的参数定义

汪子熙

人工智能 机器学习 聊天机器人 机器人 6月月更

函数节流和函数防抖和他们的区别

工边页字

JavaScript 性能优化 前端 6月月更

直播回顾 | 7000字干货,深析区块链+汽车供应链金融的应用价值

旺链科技

区块链 产业区块链 供应链金融

1号店11.11:从应用架构落地点谈高可用高并发高性能_语言 & 开发_张立刚_InfoQ精选文章