一毛一条的接码平台,卡商资源群对接平台

  • 一毛一条的接码平台,卡商资源群对接平台已关闭评论
  • 87 次浏览
  • A+

点击“开发人员技术前线”,选择“明星”

观看|星星|留言,? 爱

一毛一条的接码平台,卡商资源群对接平台

回复“ 666”,获得独家礼品包

照片?@?布鲁斯滑雪板

文本? |班静

个人资料:

2014年12月加入饥饿,参与了后台系统的研发(Walis + Javis =>瓦勒),主要用于客户服务和BD。

在2015年5月, 我开始联系定单系统的研发。负责7月的订单研发团队; 通过单个应用程序进入服务阶段。

在2016年初建立订单的测试团队,在将订单分为正向和反向之后,主要负责转发和交付部分。

在2017年, 我们做了一些平台建设的探索。

负责整个订单的前进和后退以及2018年初的交付,在年中 订单和购物车零件将合并在一起。年底与商家订单部分整合,形成交易平台。

在2019年10月从交易台转出,最近, 我做了很短的组织效能和结构。

我为什么写这篇文章,原因:

第一, 我进入贸易领域已有4年了,只有我知道很多可以串在一起的故事,我想保留这些记录。

第二个发现是,当许多背后的学生研究交易系统时,分配了一个联系人, SOA, 每天有成千上万的数据,我只知道看起来像这样很难理解背后的思想和原因。根据我过去几年的经验,希望让每个人都更容易理解这一进化过程的原因和过程,有起有落。

第三是很多总结,方法也不错,更多的是删除“浮渣”并将其呈现给所有人,这里可以加一点“有毒的鸡汤”,现实不一定那么美,我们有很多选择,现在回望也许是幸运的也许这是一个错误。

本文希望通过一些开发故事和思想向读者展示整个过程。您会看到很多野蛮增长的痕迹,有了一些想法和结论,但这不会总结快餐风格等许多原则。

然后,我们将从2012年的古时代开始。


在谈论订单之前,让我们继续讲考古,在远古时代有一个用Python编写的系统,一个叫做宙斯的系统该宙斯包含Ele的几个核心模块。当时我例如订单 用户, 餐厅,这些全都在一个代码库中,并部署在同一台机器上, 除了宙斯,还有两个核心饥饿? 电脑这是许多老人经常提到的“主要车站”,和NaposPC为商人。这些系统通过Thrif协议进行通信。除了此链接之外,所有杂乱的内部功能一切都在一个叫做walle的系统中,这个Walle系统是用PHP编写的。

那么当时的Zeus,大概长这个样子:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一毛一条的接码平台,卡商资源群对接平台

?据不严格考究,从Git的提交历史看,订单部分的第一个承诺是余立鑫同学于2012年9月1日提交的,内容是“为宙斯添加eos服务。 目前仅定义一个简单的get api。 ”,这个EOS?指的就是订单系统,即ElemeOrderService的简称,这个名词沿用到了今天,成为交易正向的订单部分,甚至是是订单组的代名词。

?Zeus在后来实际上经历了一定的改造,叫做Zeus2,但具体时间已不可考。


2014年10月I到饿了么来面试,面试官是商户端负责人磊哥。?12月1日,我渴望这份工作吗? 人力资源使我焕然一新,我来到雷弟兄面前雷弟兄带我去JN说:“这是实习生”,然后转过头逃跑了。后来才知道面试后雷弟兄和JN说,我刚见过实习生使它起作用,碰巧商人小组有一个计划来转换Java,而且Caringian仍然缺少python人,然后,他向JN撒谎,并给我卖了饭。

回到主题,在2014年12月至2014年4月的几个月中,我合作完成了将较旧的BD系统后端迁移到Walis的工作,在我的导师调到CI团队之后,我完成了Walis从单个应用程序到分布式应用程序的迁移。

对我来说,这都是运气和命运。

2015年5月,我的上司JN同学,有一天突然发现我看起来很兴奋告诉我,该公司打算建立一个订单组,他负责此订单组,除了他他只选择了我(可能是由于我在上一段中提到的一些经历,在有空的人中还是做吧?),说这是我吸引他的照片这个人忽悠一套。

作为技术员,心脏非常沸腾。首先是高并发性 高流量, 分散式, 这些熟悉的高名词只是以前听过的。我从没想过我能够这么快地访问这样的系统。 第二个是我们之前所做的系统非常“边缘”。边缘如何白天的请求很少, BD是从来访的商人那里回来的,碰巧是夜晚的高峰,即使在晚上关键的单一接口有时是几个或十几个请求,有人发现之前,这种悬挂已经挂了两个小时。挂在不一定由某人长时间调用的系统上,那时候, 我们晚上七点之前下班,我第一次发行的时候 我郑重地说,可能必须加班,直到晚上8:30。

选择JN作为订单组负责人的原因,因为尽管他最初是一名前端工程师,完成的是“边缘”后端系统,但它是熟悉整个公司的所有系统和业务的人员,非常适合开发订单系统。

好,是,该小组成立的前一天,我们一直只有两个人。我还没毕业除了兴奋更多的是不安。

5月12日 2015年订单组正式成立,成立之日,隔壁小组的ZH(是PHPer,当我被录用时 我打算去接沃勒),然后在谈话中途,当时的部门主任来了,说那天有一个小兄弟被雇用,不错,只需将其交给订单组,是一名Java工程师。自从,成立之日,我们的人数增加了一倍,成为4个人。

我们给自己的第一项任务是:阅读代码,管理业务画画。CTO申请了1个月的缓冲时间,在这段时间, 不接受任何业务需求!

我们邀请了该订单的前总工程师, Python框架负责人 Zeus部门的应用程序运行和维护负责人向我们解释。其实,每个人的共享仅一个多小时。该月实际上来自数万行Python代码,没有任何产品文档,极为罕见的音符逐行每个人都解释一个部分。我终于总结了整个订单生命周期, 关键操作 和关键的业务逻辑,画出一幅大图这张照片,后来我们使用了一年多。

事实上,你在年中饿吗?生产和研究的规模已经达到数百人,新任首席技术官雪峰老师今年年初加入饥饿了吗?整个基础架构将于2015年下半年启动,整个系统的快速建造是在2016年。

? ? ? ?

可以说是一团糟一个快速发展的时期。我们说时间在驾驶跑车时正在更换轮胎。

与订单紧密相关的第一个超级任务,大概从六月左右开始-宙斯去耦,HC老师是Python框架的负责人,他还是最受尊敬和尊敬的技术专家之一,在美国举行的Qcon上,作为首席建筑师, 我介绍了Ele的总体技术架构。我。就像在原始时代之前提到的 Zeus是一个巨大的整体应用程序,为了未来的快速发展,减少耦合和纠缠, 等等,该公司启动了zeus去耦项目,简而言之, 只是两个字,分裂

? ?

经过一个多月的密集会议,拆分计划已完成。似乎并不难说,但是这种口水战当时是打过的。拆分后,不同的服务属于谁?模块和模块没有很好地分开,如何确定A和B服务之间的边界等。当时我没有资格参加讨论。

结论是 Zeus将分为以下主要服务:

  • 宙斯。eos => 订购服务

  • 宙斯。eus => 用户服务

  • 宙斯。ers => 商户服务

  • 宙斯。eps => 营销服务(新产品)

  • 宙斯。短信=> 短信服务

第一阶段

各项服务拆分后,随后是新一轮的重建和分裂浪潮。例如来自宙斯。EOS与Biz分离。预订,取消下订单和购物车的能力; 分开业务。ugc取消了订单评估的相关功能。

? ? ? ?一毛一条的接码平台,卡商资源群对接平台

拆分的主要阶段:

1。 (七月)共享代码库,由模块独立运行。就是将所有Zeus代码打包在服务器上之后,根据部门划分仅在特定计算机上分别启动特定模块,打开特定的端口。

2。 (八月) 代理阶段。那是, 在原始服务中,将代理添加到要移出的接口,可以代理到新服务的接口,服务注册表的交换容量用于控制交换流。

3。 (八月至九月初)完成脚本和模块的分段和转换。

4。 (九月)代码仓库独立性。使用Git的核武器过滤器分支,模块中的代码和更改历史记录,与原始代码库完全分开。此时, 部署仍然是混合的。在发布工具中,发布独立应用程序后, 它实际上替换了大项目Zeus下的某个目录。

5, (九月)独立于配置。原始配置由saltstack刷新到服务器,由服务器上的多个应用程序共享,我们直接对其进行了更改,以使用服务注册表的配置交付功能来获取单个应用程序配置。在这个阶段, 它基本上过渡到软负载。

6。 (次年3月)身体独立。当然,这是第二步解耦的内容。

当然,这次分开还带来了另一种产品, Python的SOA框架zeus_core,zeus_core将于4月左右在业务服务之前拆分。

整个解耦期间它持续了大约半年。在此期间,没有因分裂造成的事故,几乎没有烟。想一想当时没有什么进步,工具落后了没有全日制考试,这完全取决于一堆早期工程师以及运维生的技术素养。

子数据库和子表

还是在2015年,大约在九月或十月 确定应该实现子数据库和子表。以及子数据库和子表的方案,当我介入时,它几乎完成了,它由CI部门的DAL团队领导。

为什么要子数据库和子表?

一个无法处理并发。那时候, 我们的订单数据库的MySQL?是采用1主5从架构,还有一个MHA。DB当时无法承受并发压力,和,抵抗风险的能力非常弱。如果商家进行某些活动而没有事先通知,一旦我们的一个从库被暂停,您只能来回切换,严重的话 只能限制大量电流。和,那段时间作为一项技术,我们还祈祷美团的外卖在旺季期间不会挂起。一旦美团外卖,某些流量会饿吗?我们也开始变得紧张。相同,那段时间我们挂断了整个网站,美团的外卖不是很能干, 要么。每个人都处于相似的发展阶段。

第二, DDL的成本太高,业务再次处于战斗的顶峰。那时候, Ele的订单数量。我每天只有一百万。有一些业务需求,我希望在订单中添加字段,然而,当我们发现DBA评估时,给出的答案是,乐观的是,该服务将暂停3小时,悲观估计需要5个小时,并且需要首席执行官的批准。明显,这种风险技术团队难以接受,业务团队也不能接受。所以机会主义的计划,它不断地填充在保留的Json扩展字段中,这样可以在一定程度上缓解长时间的压力,然而,也埋藏了很多隐患。

当然,还有一些特殊的业务场景和一些非常细微的界面向公众开放。会产生一些性能很差的SQL,将引爆整个车站。

Shardin之后的物理结构如下:

一毛一条的接码平台,卡商资源群对接平台

更新操作的逻辑如下:

? ? ? ? ? ? ? ? ? ? ? ?一毛一条的接码平台,卡商资源群对接平台

? ?

我们实际上做了二维分片 ,这两个尺寸都是 120个碎片,但是可以通过三种方式进行路由(用户ID, 商家ID, 订单ID),写优先级以确保用户维度成功。由于资源,用户和商户碎片交错和混合。

?(粗体部分实际上有一些孔,这种特殊的定制也是我唯一饿的事情,如果你感兴趣, 您可以稍后进行扩展)

此处不扩展子数据库和子表的更多具体技术细节。它大致经历了几个阶段:

1。 制定新的订单号生成规则,并完成转换访问。

2。 数据双重写入老了,比较数据。

3。 修改不兼容的SQL,例如对各个分片进行排序和统计,没有shardingkey的SQL等。

4。 数据双重写入阅读新内容。(与3部分同步)

5, 完成数据库切换,数据是新写入的,也是新读取的。

这些日子,作为业务团队,实际上,大部分时间都花在了第三部分中,我也挣扎了几次,直到凌晨3点或4点。

在2016年春节前夕,为了克服业务高峰和系统稳定性,我们甚至将数据归档到数据库中,仅保留最近15天内的订单

记住最后一次转换的日子,在2016年3月中旬左右,我和几个同学早上5点左右到达公司,天很亮。我饿了,停止服务了,然后阻止写请求,完成数据库所指向的配置,检查正确,恢复写请求,验证业务正确,慢慢放开前端流量,重新打开服务。整个过程的核心部分是大约10分钟,从悬挂到完全开启,整个过程持续了半个小时。

第二天我们能够导入过去3个月的历史订单。

完成此更改后,我们基本上摆脱了DB的瓶颈和痛点(当然,背后的故事告诉我们,有时候还是有点天真~~~)

新闻广播

在那个时期,同样是15年7月,受一些建筑文章的影响,也是因为JN提到了这一点,我们决定广播订购新闻,主要目的是进一步解耦。

在调查RabbitMQ之后, NSQ, RocketMQ, 卡夫卡 ActiveMQ,我的最后结论选择仍然是RabbitMQ,其实我当时以为RocketMQ比较合适,特别是顺序消息的特征它可以在交易的某些业务场景中提供自然支持,然而,运维团队的主要运维经验是RabbitMQ。框架团队和运维团队中的学生非常有信心,自成立以来没问题,一匹稳定的马,如果您选择RabbitMQ,可以得到运维团队的自然支持,对于当时的业务团队,可以避免很多风险。

因此,框架团队对RabbitMQ进行了一轮严格的性能测试,给出了一些性能指标。这个测试最后, 建立了一个由3Broker组成的集群,分别处理订单,在这之前, 只有一个MQ节点,服务Zeus系统的异步消息传递任务。

为了确保它不会影响主交易流程,然后,在客户端的SOA框架上进行了一系列的容错转换,主要是为了容错,例如在连接到MQ集群时发送超时和断开连接,消息发送是异步执行的,并重试了一定次数。最后, 构建了一个由3个节点组成的新MQ集群。订单消息最终发送到此集群。

期,居然踩了个小坑。尽管框架团队对异常情况进行了容错。但是毕竟 消息广播的时间与主过程状态的反转密切相关。在代码上线之前,我一直很谨慎首次在线添加了消息发送开关。那天晚上大约八点现在回想一下,那时候, 灰度和观察时间都比较短,当我全部发布时,很快,从监视显而易见,接口已经开始严重超时(我们当时使用了框架的默认超时设置, 30多岁事实上, 此配置非常严重),这导致大量严重的接口超时,很明显,是什么在减慢界面速度。交易曲线从悬崖上掉下来,我立即被NOC召唤,快速关闭消息发送开关,恢复也是一回事,然后,人肉冲到了架构团队的最前面,恳求帮助调查原因(毕竟, 那时他仍然食物太多)。

那晚,我们打开 关, 打开, 关, 打开, 关。流量范围为5%, 10% 30% 等等,经过不同的尝试和验证,最后的结论,它与当时的HAProxy配置有关,由于HAProxy预先关闭了与RabbitMQ集群的连接,服务的客户端仍然持有坏死的连接请求,造成这个问题的原因和, 客户端不能容忍此超时。调整HAProxy的链接超时配置后,症状消除。虽然,从日志中 有一些隐藏的危险。

此时,看起来像这样每个关联的业务方都需要申请一个主题, 您可以根据业务需要自行确定“主题”下要挂多少个队列。

一毛一条的接码平台,卡商资源群对接平台

?这种物理架构已经稳定部署了不到一年, 而且有很多问题。我们将在下一章再次开始。

正在使用,当时制定了几个原则:

1,该命令不会直接将其状态暴露给外界,它以事件的形式公开。因为状态是描述,事件代表一个动作,同时, 订单状态详细信息可以与访问方分离。

2,消息广播仅用于广播事件,不用于数据同步,如果消费者需要更多数据, 检查订单数据界面,时间戳包含事件生成时间和发送时间(该时间将在以后添加)。那是, 邮件正文包含标头信息,仅放入用于解释此事件的内容,它还包括交易双方的主键和一些可用于常规筛选或辅助路由的信息。

3。消除消费者在使用邮件时应确保自己的同等能力,同时, 消费时应使自己无国籍。如果您必须按顺序食用,然后自己通过Redis和其他程序实现它。

4。当消费者连接时, 主题和队列需要遵循某些命名约定,同时, Queue的最大积压深度为10k,如果超过 丢弃它。消费者需要明确他们是否接受该新闻具有破坏性,同时, 有必要确保自己的消费表现。根据当时的评估,当邮件累积达到一百万时, 整个集群的性能将下降10%。(根据全球架构的建议,我们还提供Redis作为媒介,订单事件存储为镜像,但是体验不够优雅)

这个新闻播报的逻辑结构一直使用到今天这种脱钩产生了巨大的好处。

初步


2015年中至16月初,我们正处于每天订单量超过一百万并且正在迅速增长的阶段。

OSC

那时候,我也读了很多建筑文章,ESB, SOA, 微服务 CQRS, EventSource, 等等,我们还积极讨论如何重组订单系统,支持更高的并发性。我当时听得最多是京东的OFC,我还购买了“京东技术解密”进行研究,但很快得出结论,几乎没有参考价值。主要原因是京东的OFC,显然,这取决于零售业务的特征。OFC中的许多概念作为我们还年轻的人,设置为用餐O2O,几乎很难理解。但是我们仍然深受其影响,给小组一个类似的缩写,OSC,订单服务中心。

由于手头订单已使用3年以上,该公司的主要语言堆栈在数字方面也趋于从Python到Java。不久,我们计划重写此订单系统。然后,我设计了一个架构系统使用osc作为应用程序的域前缀。该系统的核心思想是:订单是为了保持交易时刻的快照,保持自己尽可能简单,减少对各方的依赖,减少充当数据通道的角色。

我们选择的语言栈是Java,那是, 计划开始转换Java。(不幸,我们到Java的真正过渡是在2019年发生的)。

此时,现在是九月。巧合的是该公司首次开始建立新的服务结构审核系统,我的计划,可能是参与审查的排名第一和第二的小鼠,新鲜的大锤正等着敲门。

事实上,回首一年感谢您对此架构进行审查,不是因为它过去了但是因为它被拒绝了。

这也很有趣那时,我隐约记得参加过架构审查的评委成员, DA的负责人 基本OPS负责人, 和一个没有工作很久的建筑师。

? ? ? ?

当时的架构师问题是该架构可以使用1年还是3年。基本OPS负责人的问题,很有意思,他问了第一个问题,这个系统是关键路径吗?我想知道,这不是荒谬的,我直接回答中间部分是。

然后第二个问题出问题了,这个应用程式可以降级吗?我想,这不是胡说八道吗当然, 此链接不能降级,这是最基本的核心链接,该公司的核心业务围绕交易。(可能是双方的理解不在同一个渠道上)。

然后,他得出的结论是,关键路径,再次是核心订单不能降级,一旦出现问题,每个人都没有食物可吃。审查结束了,结论未通过。

交易团队从未进行过全职测试,换一种说法,所有内容所有这些都通过研发自检得到保证。该公司的自动化测试当时非常薄弱。几乎所有测试都是手动进行的。但,我觉得这时获取测试资源非常必要。我强烈要求建立测试团队,以增加订单质量的保护层。

当时发生了一些有趣的事情,根据JN,框架团队未经测试,然而, 他们似乎没有任何问题。当时他们很自豪地解释,技术本身不应保证代码的质量。简直是义人无可挑剔。我认为这种观点有些理想,自己研发可能不太容易发现自己的错误,引进另一群人从另一个角度切入,可以进一步提高质量保证,毕竟, 这个系统是如此重要和高风险,但是我们不应该建立一个只能提供“点”的测试团队。

最后,与JN长期沟通后,我们当时确定了测试团队的定位和职责: 确保代码质量是研发的责任。测试开发基于此,主要提供工具支持,为了降低测试成本,在能量允许的同时,提供一定程度的测试保证。

然后,2016年2月至3月左右,交易团队进行了首次测试,差不多在四月测试HC达到了4个人,我负责整个测试团队。

第一件事,建立自动集成测试

技术栈上的选择,使用RobotFramework,主要原因是当时整个团队仍然使用Python作为主要语言。测试开发的学生实际上可以编写Python和Java。 另一点是? 由RobotFramwork驱动的关键字,有自己的一套规格,与系统相关的lib可以完善,即使进行语言堆栈转换,成本不会很高。

除了测试过程的规范和标准外,我开始想建立一个平台,用于管理测试用例, 执行状态和执行报告。

我命名这个系统 微博:

  • 使用RobotFramwork作为测试案例执行的基础

  • 詹金斯将实际部署在哪里执行,并满足执行计划的管理

  • 建立了一个基于Django的简单管理界面,用于管理用例和测试报告,并使每个测试用例可以随意组装为一个单元,如果您熟悉Java,这是一个大概的比喻,这里的每个用例都可以视为SPI。

  • 此外, 引入了Docker来部署从属环境,很浅虽然Ele。我当时没有在生产中使用Docker(Ele的容器化。我的作品应该是17年左右)。

想想我在测试环境中玩的东西很有趣,我喜欢折腾。

总体思路如下:

一毛一条的接码平台,卡商资源群对接平台

测试单位: 商业库实际上是从SOA服务接口到RobotFramwork的封装层。每个测试单元可以调用一个或多个接口来完成原子业务活动。

检查组件: 提供返回值,或者另外配置Redis和数据库数据的验证。

集成测试: 多个测试单元串联排列以完成一个集成的测试用例。在执行每个测试单元之后,要求的入场和用餐,它可以在集成测试用例的操作域中的任何位置获得。

回归测试: 选择多个集成测试,可以用作解决方案,配置执行。

通过这种方式, 实现了不同粒度的多级复用。根据整合测试和回归测试的方案,后台会编译并生成相应的内容吗? 机械手文件。

这个项目,事实上, 它失败了。最重要的原因测试与开发学生的开发能力不足,该界面需要更多的前端开发工作,一开始 我直接应用了Django的扩展管理界面xadmin,做一个简单的扩展,然而, 当时的能量不要让自己花太多精力在上面,内置的前端组件在体验方面存在一些缺陷,代替, 效率不高。直到五月基本上放弃了二次开发。

但是这种尝试还带来了其他一些结果。我们相当于放弃使用系统管理用例,Jenkins + RobotFramwork组合已保留。我们托管一些我们在Git上编写的集成测试用例,研发部门将在指定环境中部署自己开发的分支机构,每天早上拉并执行在早上, 研发委员会将根据自动测试报告检查最近发布的内容是否存在问题。同时,它还允许手动进行研发,两个学生 文武和晓东 在这方面贡献了很多精力。

建立这种自动集成回归,它为后续订单系统的拆分和小规模重构提供了重要保证。加大研发力度,这些步骤可能需要更长的时间。研发人员本人将非常积极地使用此工具,尝到很多明显的甜味。

第二件事,进行性能测试。

背景:

我记得15年来第一次联系订单时,您有幸参观之后会饿吗?但后来成为XL老师,后来又成为Ele的负责人。我的全球架构谈论如何建立订单系统,重要一点这也是压力测试。

那时候, 存在一些与性能和容量有关的问题。我们没有事先预测的能力。如,在完成分片之前 商家终端上有一个订单清单修订。由于使用了现有的通用接口(接口的粒度非常粗糙,条件组合具有很强的自由度),我们谁都无法进行预评估,该查询的索引性能很差。正午时分快到了,几千个QPS?查询界面Congku突然被击败(我们的监视和警告系统在15年内还不够完善),从库奇上吊一个我必须采用50%不加限制的电流限制来降低速度。整个过程持续了近半个小时。最后, 可以追溯到最近的变化,商户回滚了此更改,然后才将其真正还原。在调查之后导致此事件的缓慢SQL, QPS?大概几百左右。

整个公司的性能测试是有组织的,比我的计划要早但是该公司的性能测试是针对517外卖节服务的。有一波专门的考试学生,这是第一次庆祝Ele。该事件的准备和实施实际上花费了很长时间。

在压力测试过程中,必须不断解决问题,再次重复压力测试,此事件使许多学生每小时都看到近铁城市广场的外观。回想那个时候,我记得最新的一个大约是5月6日我们早上5:30下楼,当我回到家时,两侧的路灯都刚刚熄灭。

以上是题外话,尽管完整的链接压力测试一定会带给我们,但是我们在某些地方也无法压缩完整链接,有一些接口或逻辑需要单独完成,需要随时进行。

建立:

选择了刺槐作为技术选择,由于Python的SOA框架及其组件,可以带来极大的便利。在之前进行公司级全链接压力测试时,基于JMeter, JMeter不容易与Java的SOA框架集成,必须有一个前端HaProxy来进行流量转移,不能直接使用软负载,这在当时造成了一些不便。另一个原因, 蝗虫的设计理念,某些性能测试用例可能更接近实际业务场景,仅遵守QPS指标,有时会有些失真。

前面有完整的链接性能测试团队,事实上, 我自己的性能测试能力的建设很快就完成了。整个施工过程耗时一个多月, 在八月和九月 您基本上可以组织域内服务的性能测试。绩效测试人员包括研发研究,这需要一些过程。很快,我们小组的绩效测试已遍及整个部门。包括与财务团队合并后的情况。

此版本允许我们提供外部接口,对他们的服务负载和性能限制有一定的期望,这样可以避免使用某些隐藏的性能界面来上网,特别是对于商家方面的复杂查询条件; 它还可以模拟高并发场景,在我们的某些重构阶段,预先发现了一些并发锁定和呼叫链接相关性问题。

第三件事随机故障演习。

1。版本0:

最初的原型实际上非常简单。总体思路是:

1,?在测试环境列表中拉出特殊环境,有单独的监视和数据库。

2。 建立客户模拟用户行为。(我们在自动化集成测试中积累的经验开始发挥作用。

3。 提供一个工具来构建依赖服务的Mock Server,解决长链接服务依赖性问题。Mock Server可以根据输入返回一些设置的输出。

4。 此外,框架团队提供了一些技巧,发送了特殊版本,让我们标记流程。根据客户的流量标记,让Mock Server模拟某些异常行为,例如阻止和超时,对我们测试过的服务器的反馈。

这是一个非常简单的原型,而且订单已由我们多次管理,外部依赖性很小因此它在不到2的时间内就完全形成了 3天。但这只是一个玩具它没有足够的参考意义。因为并发性不是很高, Mock Server可以执行的操作也受到限制。

2。版本0:

JN叫一些同学,以Netflix的Choas Monkey为原型,做了一个轮子我们称之为狗窝。

控制中心的设计图如下:

一毛一条的接码平台,卡商资源群对接平台

在特殊学生和运维学生的帮助下,Kennel将于2016年10月左右首次上市。该工具提供诸如:模拟网络数据包丢失; 界面注入异常; 删除集群中的节点; 暴力破解服务过程等。

以前没有人尝试过我们不知道可以衡量什么,我想在11月进行第一轮试验,我尝试开发5个需要接受的方案:

1。 长期分布式交易

2。 接口异常导致整个服务雪崩

3。 重新启动集群中的节点或计算机,呼叫者的反应显而易见

4。 集群中节点的CPU负载变高,负载不均匀

5, 该服务是单点服务,群集行为不一致

根据这些情况,选择一名测试学生来领导实施。不同服务的测试报告略有不同。其中之一的部分屏幕截图如下:

一毛一条的接码平台,卡商资源群对接平台

一毛一条的接码平台,卡商资源群对接平台

一毛一条的接码平台,卡商资源群对接平台

经过对几项主要交易服务的测试后,我们确实发现了一些隐藏的危险:

  • 在某些情况下, 部署的群集和服务注册表计算机的数量可能不一致。那是, 在服务节点被猛烈杀死之后,服务注册表无法主动发现并踢出。这是一个相对较大的隐患。

  • 每个群集的负载不均匀个别计算机可能具有较高的CPU使用率。(与负载平衡策略有关)

  • 进行“破坏性打击”自我恢复时,某些节点的CPU使用率将明显高于其他节点,几个小时后它将逐渐变为。(与负载平衡策略有关)

  • 当单节点CPU负载较高时,负载平衡不会将流量路由到其他节点,即使这部分请求的性能比其他节点差很多,甚至有很多超时。(关于负载均衡和融合的实现机制,Python的SOA是服务器端的断路器,和客户端不)

  • 大量服务的超时设置配置错误,该框架支持软超时和硬超时的配置,软超时仅发出警报而不会阻塞,然而, 默认的硬超时时间为20秒,许多服务仅配置软超时,甚至没有配置,实际上,这是由低级别错误造成的严重隐患。避免雪崩可能是不可能的。

  • 在某些情况下, 超时配置失败,通过呼叫链接的掩埋点,并与框架团队一起进行复制,最后的锁定是在某些情况下,使用消息队列发送消息,Python框架使用Gevent实现高并发支持,框架无法捕获此超时。

这个项目,有几个明显的原因,我们做了很多设计和预防工作,必须与失败演习结合使用才能被接受,无论是低级错误还是设计不足,可以在一定程度上提前发现。

当然我们也犯了一些错误,可靠的补偿链接(通常不起作用),当你攻击自己时它失败,后来发现,这是某种改变造成的隐患。我自己煮的回到你的眼泪,但我感到更多的是,进行故障钻探更值得。谁能保证当真正的失败来临时,没有更严重的事故。

除了积极的系统,员工也有很多好处,例如, 测试和R&D学生实时完成该项目,我们的跟踪和日志系统的使用非常好,我们对SOA框架的运作有更全面的了解,这里有许多隐藏的危险和根本原因,它是由测试同学发现的。高水平的质量检查学生非常重要,提高质量检查学生的质量也很重要。

当然,除了测试团队的工作之外,我们没有参加单元测试,16年保持代码行覆盖率80%?90%。

改进Redis的使用

使用姿势管理:

在2016年初, 主要瓶颈是数据库。事实上, 我已经提到了子数据库和子表。可以喘口气到六月每个人最担心的是成为Redis。那时候, Zabbix只能监视机器的运行情况, Zabbix实际上正在逐渐脱机, SRE团队建立了更省时的机器指示器收集系统,直接读取Linux的一些数据,然而,整个Redis操作仍然完全是黑匣子。

你饿了吗? 我还在twemproxy和codis上踩了很多坑, redis-cluster尚未在行业中大规模使用,所以我开发了一套Redis代理:我自己的乌鸦座它还提供了强大的指标报告,您可以监视内存, 链接, 命中率, 按键数 传输的数据量, 等等 Redis。它是在此时启动的,用来代替twemproxy,这使得Redis的治理迎来了一个转折点。

我们与这次迁移合作,我真的不知道我是否不动吓坏了

那时候, 我们将Reids用于三个主要目的,一种是缓存表格和界面的纬度相似; 第二个是分布式锁一些场景用于防止并发写入。 第三是餐厅序列号的生成。该代码由前辈编写。

旧的使用姿势,表级缓存和接口缓存,在一个集群中配置; 其余的配置在另一个集群中,但是在使用中该框架包含两个客户端,有不同的容错机制(即, 无论是高度依赖还是易碎)。

每个人都知道外卖交易具有一项功能,短时间内下订单交易阶段的进展会更快,因此,订单缓存的更新频率更高,我们在短时间内验证了Redis集群的可用性之后,进行了完整的移交(我不记得当时特定移交计划的详细信息。回想起来, 实际上可以有一个更安全的解决方案)。

引用原始缓存的群集为55G, OPS准备了一个100G集群。切换约10分钟后,群集内存已满。

一毛一条的接码平台,卡商资源群对接平台

我们得出了一个惊人的结论。55G的旧集群,超级棒(巧合的是,与我们的迁移合作的OPS也称为Chao Ge。

从监控指标来看,密钥快速增长,ttl迅速下降,我们很快锁定了两个界面, query_order和count_order,那时候, 这两个接口的前一个约为7k QPS?,后者是10k QPS?,这两个接口之前的rt都没有问题。平均为10毫秒。

我们必须从业务场景开始,这两个界面的主要功能是查询一段时间内某个餐厅的订单。为了确保商家可以尽快看到新订单,商方采用轮询刷新机制,而这个问题主要在于查询参数。这两个接口使用接口级缓存,所谓的接口级缓存,是根据输入参数生成哈希作为键,以返回值作为值, 缓存起来 ttl以秒为单位,乍看没有问题。如果是查询参数的时间戳,如果截止日期是当天的最后一秒,它的确是。看到这个 我相信很多人已经猜到了截止时间时间戳实际上是当前时间,这是一个滑动的时间,这也导致缓存同时接近100%未命中,高频填充了新数据。

?(由于新群集和旧群集的内存回收策略不同,在这种情况下, 新的clusterFrequent GC将导致严重的性能指标抖动)

这两个缓存其实没用。经过一天的回滚,灰度之后这两个接口的缓存已完全删除,我们再次切换,顺便, 接口级缓存和表级缓存分为两个集群。

然后,我们又发现了一些有趣的东西。

我们先来看一下我们的业务量峰值的近似曲线,对于国外送货行业,一天有两个高峰,中午和晚上中午明显高于晚上。

一毛一条的接码平台,卡商资源群对接平台

? ? ? ?转换后大约是下午3点,内存再次爆炸。 ,内存使用情况曲线类似于下图:

一毛一条的接码平台,卡商资源群对接平台

紧急扩容后我们一直在观察夜晚最终曲线变为下图,从点击率来看,还有一定的改进(不再提供特定数据,在88%?95%之间,后来达到了98%以上。

一毛一条的接码平台,卡商资源群对接平台

为什么与业务高峰不同。

事实上, 它必须与业务相结合,很简单,那时,在商家端进行轮询有多种方案。最长的是查询最近3天内的订单。还有一个页面可以分别检查当天的顺序。

轮询时 后端查找的条目多于每页所需的前端,和,从一开始,并不是每个商人的订单都大于一页。因此,随着时间的流逝,出现了以上现象。

为什么以前的性能指标没有出现任何问题?一个与旧Redis集群的内存回收策略选择有关。第二, QPS的数量非常高,如果您仅查看平均响应时间,不良指标是平均值, 命中率也平均提高了。

好,解决了这个问题之后发现了一个新问题。

大约1点 在深夜2点,随叫随到监视发现内存使用量猛增。

我们被锁定到一个呼叫量异常的界面,再次是query_order。几天之前,居所刚刚进行了改革,只是在这个安静的夜晚用光了帐户,那时候, 我们的结算期相对较长(这是由于订单可以退款的天数所致,下面将有扩展的地方),此时, 大量的历史订单将被撤消,这会占用很多内存我们的表级缓存时间限制为12h,如果你不清理这可能会对早上的高峰产生一定的影响。后来, 我们提供了一个无需缓存第二天的界面。单独清算。

这里的核心问题是?我我们不到不到一年的时间就无法完善服务治理,服务打开界面,暴露于Intranet,任何人都可以打电话我们的接口协议也是公开的,任何人都很容易知道界面,和,公司里的老人比较狂野(不需要停靠,你想要什么,如果不, 自己添加)。Git仓库代码合并权限和发布权限最早在15日末恢复。但是那时SOA尚未完成,直到很晚才支持接口授权。

Redis的使用仍然需要基于对业务场景的深刻理解。并注意各项指标。

缓存机制的改进

我们当时的缓存机制是这样的:

一毛一条的接码平台,卡商资源群对接平台

这种架构设计的优点:

1。 有一个独立的链接来更新缓存,减少对原始服务的干扰

2。 高组件可重用性

3。 有MQ峰值削波,同时,存在一级RedisDid聚合,进一步减少并发

在很多场景中这是一个非常好的架构。

缺点:

1。 使用了两级队列,长链接

2。 实时性能不佳

推动我们转型的原因,这也源于一次小事故。

商家订单列表的查询实际上是基于订单状态的。收到的订单应付款。然而, 有一部分错误的判断逻辑,将其放在商家订单的后端,此逻辑将确定订单上的序列号是否为0(默认值),如果是0 推断该订单尚未付款,只需筛选出订单即可。

那次事故缓存更新组件正在崩溃(没人知道。)尽管此架构是由该框架的一些学生设计的,但是它太稳定了,不能被遗忘。)。由于缓存未及时更新,得到过时的数据,外观是商家看不到一些新订单。我看到的时候随着时间的流逝,自动取消错过的订单的逻辑已将其取消,多么奇妙的组合。

转换为以下内容之后:

一毛一条的接码平台,卡商资源群对接平台

相比下,这种架构减少了很多并保证了实时性能。但是为了不阻止进程,在一定程度上可以容错这必须添加监视补偿链接。经过改进,我们立即删除了对ZeroMQ代码和配置的依赖。

改进消息的使用

完成子数据库和子表后,我们对MQ不太有信心,在接下来的几个月里,MQ连续有几个例外。这是墨菲定律,不幸, 我们只是觉得即将发生什么,我们不知道会发生什么。

姿势错误

在上一章中,我提到建立了一套订单消息广播机制,以此新闻为契机,商家已对高频轮询进行了技术优化,希望通过长久的联系,推拉组合减少轮询的压力。简单介绍一下这个方案,商家有后端服务,接收订单的消息广播,如果有新订单(即, 直到付款商可见之前刚刚撤销的订单),将通过长时间的连接推动到达终点,然后终端将触发活动刷新,并发出触摸声提醒商家。原始轮询会增加时间间隔,降低频率。

一毛一条的接码平台,卡商资源群对接平台

那么问题出在哪里呢? 有时,蓝线,实际上,花费的总时间少于红线,换一种说法,去往外部网络的请求的一部分比内部网络数据库的主从同步更快。

商家建议打开主图书馆,野兽明显,这个频率不用考虑不可能承诺毕竟, 轮询从属库之前已被破坏。消费者在本地停留一段时间,然后消费,也不太友好。毕竟, 有时,快速不一定是一件好事,那么我们可以让它放慢一点吗?

然后,绑定的拓扑已由我们更改为此,上一段中的粉红色队列,使用RabbitMQ的死队列功能(即, 该消息设置了到期时间,到期时间到了, 您可以将其从队列中丢弃或将其移至其他位置):

一毛一条的接码平台,卡商资源群对接平台

眼前的问题解决了,而且还埋了坑在RabbitMQ和建筑设计方面有一定经验的学生,您应该迅速意识到这里犯了什么错误。诸如绑定关系之类的元信息由每个Broker存储,用于路由。然而,消息的持久性在队列中,队列中只有一个节点,它最初是一个集群,此时,拓扑的顶部成为单点。

回到我开头提到的MQ集群事故,由于某些原因,我们的MQ集群的某些节点正在跪下,不幸,包含此粉红色队列。同时,暴露出另一个问题,这种拓扑无法自动化操作和维护,必须依靠一定数量的手动维护,重建新节点, 元信息需要从旧节点导出和导入,但是会有一些冲突。和,在早些时候, 我们的Topic和Queue声明没有经验,队列不是根据消费者的实际消费分配的,使某些节点过热。在称重自动运行维护和相对平衡下,以下方法,事实上, 随机选择一个节点来声明队列。

之后,我们进行了两项改进,一种是在服务配置文件中声明了拓扑支持,服务启动时自动在MQ中声明;第二个是商人的后端服务,收到要轮询的新订单消息时,分别按订单请求新订单(使用缓存,如果想念 它将被路由到主库)。

然后,消息的拓扑如下:

一毛一条的接码平台,卡商资源群对接平台

邮件集群拆分

仍然是以上故事的背景,让我们回到影响这次事故的原因。根据我们对RabbitMQ集群的性能测试,这个吞吐量应该能够承受,然而, CPU负载很高它还会影响生产者发送的消息(触发RabbitMQ的自我保护机制),甚至挂断电话。

在建筑师的努力下终于追溯到这次事故的原因在商家使用的公共SOA框架中,消息队列的客户端,由部门自己独立包装,这个客户对RabbitMQ的某些客户端参数了解得不太清楚(例如获取和获取模式, 在抓取下的prefetch_count参数, 等等),事实上, 此参数需要进行某些计算才能获得合理的值。除此以外,即使机器上仍有CPU,消费能力也不能提高。

与订单有什么关系?答案是混合布。该群集使用虚拟主机来分隔不同服务的消息广播。因此, 订单, 运单 上面部署了商户转移消息。

在事故发生的那一天运营技术部老板下达命令无论您如何移动机器,在同一天, 必须建立一个独立的消息广播集群以接收订单。运营技术部和我们团结所有消费者,那晚,那是, 建立了一个7节点的集群,将订单的消息广播与其分开。

(一年之后,这个集群也达到了瓶颈,它不能通过扩展来解决,主要原因,一是使用者不使用RabbitMQ的功能来监视消息。但是本地过滤结果是, 白白浪费了一些加工资源; 第二, 随着群集大小的增加,连接数已达到瓶颈。对于后者, 我们将生产者的其他消息发送给新建的集群,松一口气。真的解决了您还饿吗,在RabbitMQ中种了很多筋斗,使用Go自行开发的MaxQ替代RabbitMQ之后)。

PS:如果你回到过去,在原始改进项目中,第三点将被提前添加,对于使用通配符“ *”订阅消息的用户,两者都要求订户根据实际需要进行更改。这里腐败的原因,主要原因是控制和治理不够强大。标准和最佳做法建议在初始文档中,稍后还会提供一些用于调整参数的计算公式,不能完全期望所有消费者都是诚实的人,它不受技术操作的完全控制,需要服务提供商。

早餐:

从2015年末到2016年初,你想吃早餐吗虽然单笔交易的比例不高,但是对于当时的技术架构而言,比较大。

一开始,外卖和早餐之间的互动是这样的:

一毛一条的接码平台,卡商资源群对接平台

我想这时候孩子们一定有一堆问号。

让我解释一下背景:

1。 早餐独立于餐饮和新系统(用户, 商店, 订单, 分配, 等等)已完全构建。

2。 由于无法独立完成付款,在2016年初之前,耦合到用户系统中,和,这套付款完全是针对外卖定制的。

然后,作为“创新”部门的“创新业务”,为了快速尝试和出错,我完全自己建立了一个完整的电子商务原型,为了使用付款,强行“借用”外卖交易链接。该计划由早餐研究与开发学生和付费研究与开发学生确定并实施。成为没有订单意识的工具人。

我知道的时候已经是这样了我什么时候知道的从锅里出来的时候非常真实那时候, PPE和PROD没有完全隔离,错误的操作导致PROD的异步任务被拉到PPE,再次转移后,到底, 没有工人消费导致订单被取消。

饥饿交货会员卡

在2016年初,业务方面提出了要求,希望销售Ele。我的发行会员卡可以在线制作,先前, 物理卡被骑手离线出售。正好,经过先前的架构审查后,我们还需要一种流量较少的商业模式,为了实现我们的新架构构想,然后,我们有用于虚拟商品销售的订单系统。

我们抽象出最简单的状态模型:

一毛一条的接码平台,卡商资源群对接平台

核心点:

?1。 世界上所有交易永远不要离开它的起源,主节点相对稳定。

2。 C端购买行为相对简单,B端的交付可能会不断变化。

3。 更核心的系统更应该保持简单。

一毛一条的接码平台,卡商资源群对接平台

上游和下游的相互作用如上所述。商品管理 行销 购物指南, 等等,对于业务团队本身,交易系统核心责任是提供渠道并携带交易数据。

根据数据设计买卖双方, 主题, 进展阶段当时认为这三个是必要的,当然,现在我可以给出一个更标准的模型但,然后,我们真的没那么想。

?所以,主交易表分为两部分。

?一张基本表包括主要买家ID, 买家编号, 状态码 业务类型, 和付款金额。业务类型用于区分不同的买方和卖方系统。

另一个变成扩展表,包含主题列表, 营销信息列表, 接收电话号码, 等等,属于细节,允许业务方拥有一定数量的可用空间。

(PS:事后看来,主题, 营销信息, 等等,尽管可以由上游控制但是范式需要从代码级别进行限制,否则治理会更麻烦,商业方面真的敢于停止任何事情。)

拆分两个表,背后的原因第一, 一旦生成订单,快照的职责即将完成,剩下的最重要的事情是状态维护。高频操作也注重状态,然后使每条记录足够小,以帮助确保核心流程; 第二是参考餐饮订单的经验, 2/3的存储空间用于详细信息,特别是几个Json领域。

构建整个虚拟订单系统后,许多平台销售业务都通过此系统建立联系,为了我们自己访问成本开发+测试仅需2到3天,整个业务通常在一周内即可完成。我们很开心,前台业务团队也非常高兴。由于没有大规模的查询方案,需很长时间,每天稳定支持数十万个订单,数十个内核的资源已绰绰有余。

这实际上是一个简单平台系统的原型。

其他

围绕交易,实际上,我们开展一些业务,通常,那时候, 订单团队负责这也是由组织结构的影响引起的,

例如, IP“准时”在技??术方面, 我团队的老板从零开始意识到同时, 派生了“交易补偿中心”,用于关闭交易过程中的所有补偿(包括红包, 优惠券, 现金, 点, 等等),;

为了改善用户的交易体验,我们推出了“交易到达中心”(后来演变为公司的通用到达中心),我关闭了通过短信与用户联系的方式, 推, 电话, 等等 在交易过程中。特别是极端情况的覆盖率得到了提高,同时,减少用户的反复骚扰。

以上大部分是技术细节方面的改进。以下两件事,是应用程序体系结构的重大发展,它还列出了应用程序体系结构的未来方向。

反向销售和售后

2016年?年中业务背景为了改善用户不满意的情况(在我们的白板上密集张贴了数十种情况),同时, 为了缩短结算期(因为反向有效时间长达7天,结算时间在很大程度上取决于此时间)。

在JN的倡议下,从原始订单开始,分别分开反方向,然后将原始订单组分成两个小组,我建议我的一位同学成为新团队的团队负责人。

对于积极的方向,核心责任是确保交易的顺利进行。因此, 它专注于高性能, 高并发性和稳定性。越清晰越简单越好,小学和中学很清楚,依靠清洁快速找到问题越容易,快速恢复。

反向并发比向前并发要小得多,仅1%的订单将需要撤消。然而,业务逻辑的分支和层次结构的复杂性,比正方向大得多需要更强大的业务抽象。尽管稳定性和性能对于逆向工程同样重要,但是相对不是很高。

由于核心问题域不同,不同的服务水平,分裂是理所当然的。

实际的分割过程还是很痛苦的每个人都在探索我和反向团队包括老板我们在口水战中战斗了无数次。

当时的最终形式如下(仍然存在问题,在接下来的几年中我负责反向工程之后,合并的销售和售后):

一毛一条的接码平台,卡商资源群对接平台

第一步,是要添加订单状态,用于指示订单已完成(大约等于收货,由于货物通常在收到后立即完成,但是,这两个概念之间仍然存在一些差异。轻增加这种状态,促进上游和下游,包括APP升级,花了将近3个月的时间。

第二步建立一组拒付,灰度完成订单完成状态后,将此状态作为订单生命周期的终点,后续工作是退款的责任。通过这种方式, 清算和结算的输入和扣除相互独立。

第三步订单销售所涉及的逻辑也被削减到销售服务中。(关于销售和售后的演变,以后仍有机会扩展)

我们当时进入的一个陷阱相对干净,无需将状态与上层事件分开,到底, 业务边界和分布式事务中存在许多问题。

吵了几次以后订单系统的主要逻辑实际上已被剥离并且相对简单。主要工作是定义状态之间的关系,比如一个->C,B->C,一种->B,在这里 B, C以及是否可以反转都由顺序定义。该层的业务含义很轻,专注于 *->C我们认为这是一个场景,上级负责。

例如, C此状态是订单无效。除了已完成的订单,任何州都有某些条件可能会失效,满足哪种条件取决于业务表格,适用于售后服务,他决定是否触发命令以反转状态。类似于订单收据。

这时已经有一个状态机的神(重构状态机的实现,(我将一直讨论到17月初)

特别说明是红线,对于具有高及时性要求的这种交易情况,确实是一种折衷设计。这条线的主要任务是这纯粹是标记,在订单上标记以指示是否有售后。我们指的是电子商务(淘宝, 当时,从页面的最后完成垂直拆卸,对于系统设计,简单得多而且我们不能那样做这由业务形式决定,商家必须在很短的时间内完成订单,同时, 时刻注意异常情况,许多页面承受不了压力,注意用户体验。换一种说法,尽管系统已拆卸,但是高层业务仍然不能分开,甚至,里面也有很多声音我们只想退款,我为什么要识别 区分并连接两个系统。因此,部分数据将写回到订单中。

在这个阶段,最常用的两个句子:

1。 对错误的人:无论多么嘈杂,每个人都想做得更好底线是不抬高人民。 (没有什么可以喝一杯下午茶解决的)。

2。 坚持使一件事情变得更有益:没有人是圣人,不管最初的决定是什么没有绝对的说服力,决定后执行找到问题就解决了而不是抱怨以前的决定。(相反,停止损失时间,两者没有冲突,但这也需要决定)。

物流对接

在八月初 我计划将MQ业务逻辑移交给我。由于设计概念不同,语言堆栈也不同首先是开始重构。

我先说两个“过时的”建筑设计。

ToC&ToB&托德:

在2016年初,有一个古老的名词,大多数人现在不知道的事情: 董事会

这是Ele的自我交付形式。这组业务反映出命令, 商店, 分配, 沉降, 等等 都在一起做生意。嗯我自己的大型物流系统始于2015年中期。此时,继续做一个大项目, BOD去耦。

这次脱钩,天生服务包, 去边境, ToD订单。

稍微解释一下业务背景,当时的需求该平台打包并向商家出售一些服务,与商人签订合同,此处出售的服务包括送货服务。然后,商家是否使用送货,影响商户的佣金和应收款,然而,这个行业的特色创新,是商人接受订单时,告诉商人交易完成,你到底能赚多少钱这等同于让商人以较高的正确率(不管销售中的异常情况)来查看帐单我必须告诉商人,最后的帐单为准。

这实际上是帐户共享和利润共享的一些逻辑,向交易环节介绍清算域业务,清算和结算全年都是非实时业务。然后计算商家的估算收入,经过几天的流泪,它自然属于订单团队。另一个背景那时候, 携程系有很多学生,携程的业务形式是用户在平台上下订单。然后平台去供应商下订单,然后,ToC的概念 ToB, ToD,被介绍了。

我收到的任务只需设置一组ToB订单即可。我当时觉得这种形式是错误的,嗯我的交易与携程的交易不同。我反对这个计划给主管但,毕竟, 毕业后的六个月里没有多少降水我无法提出许多明确而有力的理由,还有其他一些人在挣扎,简而言之,灰度于3月初正式启动。

一毛一条的接码平台,卡商资源群对接平台

此图显示了几个明显的问题:

1。 交易分为几个部分,用户和商人实际上需要感知每个段落。每个阶段对及时性和一致性都有一定的要求。

2。 平台和物流仅通过红色先到互动,这个频道很重

3。 公式的脱机同步。

ToD

?完成上述架构后,到七月到这部分已成为平台和物流的唯一渠道,太沉重,业务尚未发展到那个阶段,弊大于利。商户送货小组的同学很不高兴,后勤学生不开心下令的学生不高兴。

正好,订单正在增加完成状态。我们相信,需要控制的订单的生命周期,应该扩展到分发,而分布属于亚生命周期,这是交易的一部分。然后,在七月底, ToD也交给了我,这是我们喜欢并再次听到的重构链接。

作为商人技术系统的局外人,那时候, ToD的设计非常反人类。

一毛一条的接码平台,卡商资源群对接平台

当我们实际接管时,那时候, 商家方的应用程序架构是这样的:

? ? ? ? ? ?一毛一条的接码平台,卡商资源群对接平台

有如此常见的基础架构层,该层封装了公共操作,例如DB和Redis。换一种说法,同一领域的业务逻辑和数据,根据该系统的分层原理,将其分为不同的服务级别。域中的业务层必须操纵自己的数据,还需要通过界面来完成。这可能是有道理的(包括当我在2020年面试一些候选人时, 我发现有些公司这样做),但,交房时痛!复杂耦合这等效于从复杂的系统中删除相对干净且独立的线路。

之后,让我们将其更改为以下内容:

一毛一条的接码平台,卡商资源群对接平台

1。 ToB和ToD合并为一层,将其放入osc中。在眨眼服务中,并消除这两个概念,作为订单的扩展数据,而不是削减交易。

2。 如果平台和物流之间存在数据交互,不必穿过此停靠层,该链路优选仅携带实时链路上分发所需的数据。物流Apollo可以去平台上的其他地方以获取所需的数据。(这里确实存在一些未解决的问题,osc。眨眼和阿波罗在两侧的位置并不完全相同,(阿波罗, 作为运单中心, 收集与平台对接的所有数据)

3。 节点之间的交互尽可能简单,节点本身保证了其自身的鲁棒性。本来, 订单是通过新闻推送的,现在将其更改为RPC,推送方可以主动重新推送(有证书可以确保幂等),拉拔方具有补偿拉拔链接。

?(图3。1,由于当时有外卖平台和物流平台,机房部署在不同的城市,跨计算机机房的多个请求具有巨大的影响,因此,此服务将链接封装一次)。

到八月底,呼叫订单部分已在线完成。数据在9月进行了重建。


到2016年底,整个交易系统如下:

一毛一条的接码平台,卡商资源群对接平台

当时有一些良好的习惯和意识,很重要:

?

1。 原因明确的权力和责任:恢复代码仓库权限,恢复发布权限,数据库和消息队列的连接字符串管理等。

2,保持卫生:

一种。 及时清理无用的逻辑(例如,我每隔两个月整理一次,清理一批没有流量的接口。它还会检查流量异常增长的接口。有时到下游很方便。

b。 及时清理无用的配置,无需立即杀死它,除此以外, 几次交接后,没人敢搬家。

C。 管理异常并及时解决错误日志,这将大大降低警报噪声和故障排除的干扰。

3。理想追求最终,但必须脚踏实地。

4。遵守测试标准和实施机制。

一种。 坚持自动化建设

b。 坚持性能测试

C。 坚持失败演练

5,不断征求意见, 交流和思考冲突。

6。保持简单, 保持简单。

7正确的事情不是正确的人。

?

架构的演变,最好由业务来驱动,向前看,不是偶然的。回头看,我们有一半的发展,实际上是在事故发生之后。幸好,那时候, 技术有更多的空闲时间。

?

如果您阅读此书,有很多共鸣和感受,但是我不知道因此,您确实根据自己的经验整理了一些脑图。

?

在实习的半年中,感觉每个月都在变化,在第一个1。毕业5年我总是觉得自己三个月前很虚弱。前两年这是我在Ele经历的最宝贵的时间之一。

?

上一篇文章就是这样如果有事您可以遵循官方帐户,等待下一个内容。

作者信息:

杨帆花名班静你饿了吗?2014年加入饥饿,在2018年, 嗯我被阿里巴巴收购,并加入了阿里巴巴。4年的团队管理经验,主要从事Ele的建设。我4年的交易系统,他还负责Ele。我的帐户, 评估, IM, 履行交付和其他系统。

它在这里,我准备了最新最全面的“ Java面试问答V3”的副本。0“,这套电子书涵盖了许多后端技术堆栈的面试问题和答案,我相信它可以帮助所有人在最短的时间内复习Java后端上的大多数面试问题。为了得到您最喜欢的报价。

剪照片您可以仔细检查左侧的菜单栏,涵盖的知识真的很广泛一毛一条的接码平台,而且质量很好。

一毛一条的接码平台,卡商资源群对接平台

信息获取方法

  1. 扫描下面的QR码

  2. 后台回复关键字:Java核心整理

一毛一条的接码平台,卡商资源群对接平台

结束

历史推荐

网易云音乐的消息队列转换一毛一条的接码平台,你做了什么?

2020年您必须掌握的21种Java核心技术

12306系统架构的性能如何?

爱奇艺的实时数据架构有多棒?

履历表写了30K的期望值卡商资源群对接平台,面试官邪恶地笑了:MySQL数千万张表卡商资源群对接平台,您如何优化?

支付宝的架构有多棒?

一毛一条的接码平台,卡商资源群对接平台

一毛一条的接码平台,卡商资源群对接平台

一毛一条的接码平台,卡商资源群对接平台

让我们读一些好文章!

一毛一条的接码平台,卡商资源群对接平台

  • 加我微信: kim7557 备注: t8
  • 免费领100集网络营销课程+微信社群学习
  • weinxin
  • 加我微信: kim7557 备注: t8
  • 免费领100集网络营销课程+微信社群学习
  • weinxin
营销圈.png
avatar