网站在刚开始的时候大概只是一个想法:一个产业的模型,快速地将它产生出来。“快”是第一位的,不需要花太多精力在架构设计上。
网站进入扩张期才需要对架构投入更多的精力来承载网站在爆发时的流量。饿了么成立已经 8 年,现在日订单量突破 900 万。我们也有了较为完善的网站架构。
网站基础架构
初期,我们使用了能够更容易拓展 SOA 的框架。我们用 SOA 的框架,解决两件事情:
1. 分工协作
网站初期,程序员可能就 1~5 个,那时候大家忙同一个事情上就可以了。彼此之间的工作都互相了解,往往是通过“吼”的方式就把问题解决了。
但是随着人员的增加,这种方式显然是不行的,不可能一个人更新了代码再把其他人的所有代码重新上线一遍吧?于是就要考虑分工协作的问题。
2. 快速扩展
以前订单量可能从 1k 到 1w,虽然增长了 10 倍,但是总量并不是很高,对于一个网站的压力来说,也不是那么大。真的订单量从 10w 到 100w,从 100w 到 200w 的时候,可能也只是扩大了 10 倍,但是对整个网站的架构上来说是一个巨大的挑战。
我们的背景就是 2014 年的 100 万突破现在 900 万,技术团队由刚开始的30多个人,到现在已经是超过 900 人的团队。这时候分工协作就是个巨大的挑战。服务的分分合合,团队的分分合合,这都需要一套框架体系来支撑,这也是 SOA 框架的一个作用。
看一下我们的现状,中间是我们整个架构的体系,右侧是和服务化相关的一些基础,包括基础的组件或者服务。
先说语言,我们原来的网站是在 PHP 上的,然后慢慢转型。
创始人都是大学生创业,那么理所当然 Python 是一个很好的首选。到现在 Python 也是很好的选择,但是我们为什么要扩展到 Java 和 Go 呢?
Python 很多人都会写,但是真正能把他做的很好的人并不多。随着业务的发展,需要更多的开发人员。考虑到Java 成熟的生态环境,以及新兴的 Go 生态,我们最终选择了 Python、Java、Go 多语言共存的一个生态。
WebAPI主要做一些 HTTPS 卸载、限流,还有安全校验等一些通用的和业务逻辑无关的操作。
Service Orchestrator是服务编排层,通过配置的方式实现内外网的协议转换、服务的聚合裁剪。
架构图右边是一些围绕这些服务化框架的辅助系统,比如说用于定期执行一个任务的 Job 系统。我们有将近快 1000 个服务,这些系统怎么监控?所以必须有一套监控系统。刚开始只有 30 多个人的时候,我们更擅长的是跑到机器上去搜一下 Log,那么 900 多人的时候,你不可能都到机器上去搜一遍 Log,就需要有个集中式的日志系统。其他的系统就不一一赘述了。
罗马不是一天建成的,基础架构是个演进的过程。我们精力有限,那先做什么呢?
服务拆分
当网站变大了,原来的架构跟不上发展的节奏了。我们要做的第一件事情就是:
把大 Repo 拆成一个小 Repo,把大服务拆成小服务,把我们的集中基础服务,拆分到不同的物理机器上去。
光是服务拆分用了一年多的时间才做完,这是一个比较漫长的过程。
这个过程中,首先要对 API 做一个很好的定义。因为一旦你的 API 上线之后,再做一些修改的成本是相当大的。会有很多人依赖于你的 API,很多时候你也并不知道有谁依赖于你的 API,这是一个很大的问题。
然后再把一些基础服务抽象出来。很多原来的服务其实是耦合在原来的业务代码里面的。比如说支付业务,业务很单一的时候,紧耦合的代码没有关系,但是扩展出越来越多业务都需要支付服务的时候,你每一个业务(比如说支付的功能)都要去做一个吗?所以我们要把这些基础服务抽离出来。比如说支付服务、短信服务、推送服务等。
拆服务看似很简单、没什么价值,但这恰恰是我们刚开始就要做的事情。其实在这个时期,前面所有的那些架构都可以往后拖,因为不做架构调整其实不会死人,但是拆服务你不做的话,真的会死人的。
服务拆分必定是一个漫长的过程,这实际上是一个很痛苦的过程,也是需要很多配套系统的系统工程。
发布系统
发布是最大的不稳定因素。很多公司对发布的时间窗口有严格的限定,比如说
每周只有两天可以发布;
周末是绝对不可以发布的;
业务的高峰期绝对不允许发布;
等等...
我们发现,发布的最大问题在于发布上去之后没有简单可执行的回退操作。回退操作到底是谁来执行,是发布人员就可以执行,还是需要专人来执行?如果是发布人员的话,发布人员并非 24 小时在线工作,出了问题找不到人怎么办?如果是有专人来执行回退,而又没有简单、统一的回退操作,那这个人需要熟悉发布人员的代码,这基本上不可行。
所以我们就需要有发布系统,发布系统定义了统一的回退操作,所有服务必须遵循发布系统的定义回退操作。
在饿了么对接发布系统是对所有人的强制要求,所有的系统必须全部接入发布系统。发布系统的框架很重要,这个东西其实对于公司是很重要的一件事情,需要放到第一优先级的队列里面去考虑的。
服务框架
紧接着就是饿了么的服务框架,把一个大的 Repo 拆分成一个小的 Repo,把一个大的服务拆成一个小的服务,让我们的服务尽量独立出去,这需要一套分布式服务框架来支撑。
分布式服务框架包含的服务注册、发现、负载均衡、路由、流控、熔断、降级等功能,这里就不一一展开了。前面已经提及,饿了么是多语言的生态,有 Python 的,也有 Java 的,我们的服务化框架对应也是多语言的。这对我们后来一些中间件的选型是有影响的,比如说 DAL 层。
DAL 数据访问层
当业务量越来越大的时候,数据库会变成一个瓶颈。
前期可以通过提升硬件的方式来提升数据库的性能。比如:
升级到一个有更多 CPU 的机器
把硬盘改成 SSD 的或者更高级一点的
但硬件提升终归是有一个容量的限制的。而且很多做业务的小伙伴,写代码的时候都直接操作数据库,发生过很多次服务一上线数据库就被打爆的情形。数据库被打爆掉了之后,除非等待数据库恢复,没有任何其他机会可以恢复业务。
如果数据库里面数据是正常的,业务其实都可以补偿出来的。所以我们做 DAL 服务层的时候,第一件事情是限流,其他的东西还可以放一放。然后做连接复用,我们 Python 框架用的多进程单线程加协程的模型。
多进程之间其实是不可以共享一个连接的。比如:一台机器上部署了 10 个 Python 进程,每个进程 10 个数据库连接。再扩展到 10 台机器上,就有 1000 个数据库连接。对数据库来说,连接是一个很昂贵的东西,我们 DAL 层要做一个连接复用。
这个连接复用讲的不是服务本身的连接复用,而是说 DAL 层上的连接复用,就是服务有 1000 个连接到 DAL 层,经过连接复用后对数据库可能只是保持着十几个连接。一旦发现某个数据库请求是一个事务的话,那么 DAL 就帮你保留这个连接的对应关系。当这个事务结束之后,就把数据库的连接,放回到共用池里面去,供其他人使用。
然后做冒烟和熔断。数据库也可以熔断的。当数据库发生冒烟时,我们会杀掉一些数据库的请求,保证数据库不至于崩溃。
服务治理
服务框架之后,涉及服务治理的问题。服务治理其实是一个很大的概念。首先是埋点,你要埋很多很多的监控点。
比如有一个请求,请求成功了或者失败了,请求的响应时间是多少,把所有的监控指标放到监控系统上面去。我们有一个很大的监控屏幕,上面有很多的监控指标。我们有专门小组72小时去盯着这个屏幕,如果有任何曲线波动了,就找人去解决。另外是报警系统,一个监控屏幕展示的东西总是有限的,只能放那些很重要的关键指标。这个时候就需要有报警系统。
罗马不是一天建成的,基础架构更是一个演进的过程。
我们的资源和时间总是有限的,作为架构师和 CTO 来说,如何在这种有限的资源下,产出更重要的东西?
我们做了很多系统,觉得自己做的很棒了,但其实不是,我感觉我们又回到了石器时代,因为问题越来越多,需求也越来越多,总感觉你的系统里还缺点什么东西,想做的功能也一大堆。
比如对于流控系统,现在我们还是需要用户去配一个并发数,那么这个并发数,是不是根本不需要用户去配?是不是可以基于我们服务本身的一个状态自动去控制并发数?
然后是升级方式,SDK 升级是个很痛苦的事情。比如说我们服务框架 2.0 发布的时候是去年 12 月份,到现在还有人用的是 1.0。是不是可以做到 SDK 的无损感升级,我们自己来控制升级的时间和节奏。
还有我们现在的监控只支持同一个服务上的汇聚,是不分集群、不分机器的,那么是不是以后的指标可以分集群的,分机器的?举一个最简单的例子,比如一个服务上有 10 台机器,那么可能只是某一个机器上出了问题。但是它所有的指标都会平均分摊到其他的 9 台机器上去。你只是看到了整个服务延时增加了,但有可能只是某一台机器拖慢了整个服务集群。但是我们现在还做不到更多维度的监控。
还有智能化的报警,这个报警,就是快、全、准,我们现在做到更快了,做到更全了,怎么才能做到更准?每天的报警量高峰时间一分钟一千多个报警发出去。所有的一千报警都是有用的吗?报警多了之后,就相当于没有报警。大家都疲劳了,就不去看了。我怎么能够把这个报警更准确地区分出来?还有更智能化的链路分析?以后是不是我们的监控不要放监控指标,而是放链路分析,这样就能够很清晰的知道,这个问题对应的是哪一个结点上出了问题。
这些问题涉及我们做事的一个原则:东西够用就好,但是要能够未雨绸缪,做一定的超前规划。
IT技术群,期待你的加入
后台回复“入群”审核受邀
MCM的双肩包分为大号,中号,小号,迷你号四个型号。因为奴家觉得平时出门用不着太大的包,旅游的话,随身带的东西也不会太多,就选择了小号的包包。事实证明,确实如此,因为包包是纯皮的,所以单是包包就很沉了,大了的话会更沉呀。下图是包包跟ipad4大小的对比(灭错,就是右边那个大红唇)。因为奴家一直没有背背包的习惯,一直也没考虑入手,直到去年辞职打算出去旅游的时候,猛然发现,拎着包真的不太方便呀。况且奴家是个随手丢东西的货,在几次差点丢了包以后,终于决定入手一个背包。正好那时候婶婶要去韩国买东西,MCM在韩国又
背假包有什么丢人的呢?我认为这并不重要。Kelly二代就是一个假包。然而,如果你在景区里背一个价值十几万元的包四处逛,这真的不太合适。你可能会担心被小偷盯上,或者被别人认为你很有钱。事实上,在某些情况下,购买假货可能是更好的选择。只需要知道自己买的是假货,不要花正品的价格购买假货就可以了。老花月牙和这个Kelly二代都是假的。
MCM的铆钉双肩包大家应该都不陌生吧?在“北上广”这些一线大城市,在大街上随处可见它的身影,就连很多明星们也都很热衷于这个牌子的双肩包,其实个人真实感觉就是MCM的双肩包并没有那么好看,只是一款满身大LOGO的双肩包而已,之所以它那么火,个人总结了这几点。这款邮差包是单肩包的系列,肩带是皮革质感的,可以调节,月桂叶包锁,看起来很有质感,里面有多个主隔层,装起物品很方便,有白色,黑色,干邑色三种颜色可以选择,比较复古的感觉,并且复古的前提下还不失可爱,所以适合各种性格的妹子,很好驾驭的一款包包,很百搭,不挑
你好,可以送去专业的奢侈品修复机构进行修复,也可以在淘宝上买个包撑改善一下。mcm包包属于二线奢侈品牌,价格一般在几千元左右,基本不会过万,所以在价格方面还是很实惠的,再加上mcm包包是用纯手工制作,而且每一只包包都有独一无二的编码,所以在同档次的包包品牌中是非常受欢迎的。Mcm品牌的包包有自己经典的老花设计,非常具有辨识度,产品设计将时尚与古典相结合,很受当代年轻人的喜爱。mcm是一家德国品牌,主要生产皮具类产品,其中mcm家的包包是最受欢迎的,非常有档次...
不正常。根据彪马官网介绍得知,彪马正品鞋垫和标志的底色为米白色,与鞋身颜色协调一致。商标立体感明显,鞋带眼、鞋舌剪裁整齐,无毛边,而彪马同款鞋鞋垫颜色不一样属于仿品是不正常的。PUMA是德国运动品牌,提出全新品牌口号Forever-Faster,设计提供专业运动装备,产品涉及跑步。
mcm菜篮子logo正反有区别的。正品的MCM铜牌上的螺丝都是一字形的(特殊产品除外),而且可以用特质的工具或者螺丝刀拧取下来,铜牌上的番号是不可重复的,必须做到一牌一号,铜牌表面光滑没有纹路(可以当镜子用!)正品的MCM铜牌LOGO和番号是非常清晰的刻在铜牌上的,并且表面贴有塑料薄膜。仔细观察LOGO的话,会发现叶子的数量是不对称的,左边是9个、右边是8个(不对称才是正常!)
MCM双肩包有多个尺寸,适合不同需求和场合。对于女生来说,一般建议选择小号和中号尺寸的MCM双肩包。小号尺寸通常在30厘米左右,适合日常出街或短途旅行,可以装下一些日常用品,如手机、钱包、化妆品等。同时,小号尺寸的双肩包也更容易搭配不同风格的服装,展现出时尚、活力的形象。中号尺寸通常在35厘米左右,适合需要携带更多物品的场合,如旅行、登山等。
今天,奢易买就给大家分享MCM兔子水桶包一眼辨别真假超简单的小方法。mcm兔子抽绳水桶包 MCM兔子水桶包,个性十足,一经推出便风靡一时 正品走线细密,线条颜色与包包皮子颜色一致,整体协调。仿品走线松散,线条颜色浅,偏白,与包包颜色不协调。现在在韩免购物的话 折扣是85折 7-14天到手韩免直邮 小票这些都是齐全的...
我是dawuhao,结果一看就觉得很危险。师傅,这包改一下,这是嫌幼稚了。你们总问我旧包怎么办?怎么办?作为一个拆包上千,坐包上万。治包百病的整形中医,我就跟你唠了旧包怎么样才能变得更好码?一下说不定马上就有用。平时总把旧包往那一扔,是不会发言,你又不当回事,穿那么大的时候又需要新款的包。但凡是背出去的包有什么问题?影响你一天的好心情。空间大于多余着急,想找的东西就像在大大的花园里面挖。现在想,想之前放它们在百万,今天真的是活该。
中号棕色拼红色,包里面有内层,日常背出门装口红钥匙完全可以,可以单肩斜挎还可以手拿,包包既可以搭配女人味又有时尚感的服装,也可以搭配日常休闲风·
二、MCM双肩背包的尺寸一般以英寸为单位,包括迷你、小号、中号等多种不同的规格。MCM双肩背包中号尺寸为:16.0 x 13.0 x 6.0 英寸。一、MCM是创始于德国慕尼黑的奢侈时装品牌,创始人是MICHAEL CROMER。MCM的产品以服装、服饰和皮具为主,另外涉及多个领域,包括珠宝、手表、香水、箱包以及小型皮具等在内的超过500种产品。
说到入手MCM的包包,相信很多小伙伴都会选择通过代购的方式,有人问为什么韩国代购的MCM那么便宜,是不是正品呢?今天就来说一下~为什么韩国代购的MCM那么便宜?所谓代购,顾名思义就是支付代购费找人从MCM官网或者专柜买东西,省时省力,并且比自己买可能会便宜很多。但毕竟代购有真有假,海淘购物流程又是很复杂,很难去辨别是不是正品,只有拿到商品才会知道真假,但大部分代购还是可靠的。
4. 二维码技术:将二维码作为隐形暗码的一部分嵌入产品包装中。这些二维码可以被设计成只在特定条件下才能被识别,例如需要使用特定的扫描设备或通过特定的扫描方式。MCM作为品牌包包的知名品牌,实施隐形暗码防伪技术可以有效保护其产品的真实性和品牌声誉。以下是一些可能的隐形暗码防伪技术做法:5. 消费者验证系统:建立一个消费者验证系统,让消费者可以通过手机应用程序或在线平台,在购买包包后输入或扫描产品上的暗码进行验证。该验证系统可以提供即时的真伪检测结果,并为消费者提供保证。
它的实物的颜色偏芭比粉,油边是比包身更深一点的粉色。不得不说大牌的五金真的是很亮,不是街边仿货能轻轻松松做出来的。这款包的铆钉就真的亮得不行,很有质感。辨别mcm包包真假可以从铜牌的清晰程度,册包开口处,拉链,皮质等几个方面判断。mcm包包怎么样 近期想买个书包,lv mini太贵,一般小书包又不好看,但这不妨碍这款MCM卖萌啊~女孩子啊,包包有上班用的,读书用的,去超市用的,去聚会用的,逛街用的,吃饭用的,逛公园用的,所以啊,一个百搭小双肩包还是很有用滴。
解释原因:MCM菜篮子包在不同的年份和季节,设计和材质都会有所不同。有些款式的设计中会加入白色标志,而有些款式则不会。此外,MCM菜篮子包也有不同的材质,有些材质的表面不适合加入白色标志。明确结论:MCM菜篮子包有白色标志的款式和没有白色标志的款式都是真品,这取决于不同款式的设计和材质。内容延伸:MCM是一家德国奢侈品牌,主打尊贵、时尚和高品质。MCM的菜篮子包作为代表性产品,深受时尚爱好者的喜爱。在购买MCM菜篮子包时,除了要注意真假外,还需要注意款式和材质的选择,以确保符合自己的需求和品味。
凯莉包好看。1、外观设计:MCM邮差包以简约的线条和方正的轮廓为特点,显得低调而时尚。包包的金属配件为其增添了一份复古感。整体外观较为简约,适合休闲和正式场合。凯莉包以圆润的线条和优雅的曲线为特点,显得高贵而典雅。包包的金属扣环和皮质链条设计为其营造出奢华氛围。整体外观较为华丽,更适合正式场合。2、材质:MCM邮差包一般采用品牌经典的三维纹皮革,质感柔软且耐用。
四个型号,分别是mini 、小号、 中号、 大号。3, MCM包的铜牌序号为一个字母+4位数字,每个包的序号都是唯一的,如果某店里的包序号有一样的则为假。MCM虽然是源于德国的慕尼黑,但是在2005年的时候被韩国的公司收购了,MCM的包包一般会分为韩版和德版。MCM 原是具有浓厚德国文化气息的皮具品牌,于1976年创立于德国慕尼黑。经典系列Cognac Visetos蕴含MCM品牌的信念和工艺坚持。2005年,韩国女商人金圣珠 收购了MCM并将产地移至韩国。