蓟县网站制作wordpress 显示全文

news/2025/9/24 4:55:22/文章来源:
蓟县网站制作,wordpress 显示全文,分销怎么做网站开发分销,成都手机建站戳蓝字“CSDN云计算”关注我们哦#xff01;作者|马岛本文翻译自Alexandra Noonan 的 《Goodbye Microservices: From 100s of problem children to 1 superstar》内容是描述 Segment 的架构如何从 「单体应用」 - 「微服务」 - 「140 微服务」 - 「单体应用」 的… 戳蓝字“CSDN云计算”关注我们哦作者|马岛本文翻译自Alexandra Noonan 的 《Goodbye Microservices: From 100s of problem children to 1 superstar》内容是描述 Segment 的架构如何从 「单体应用」 - 「微服务」 - 「140 微服务」 - 「单体应用」 的一个历程。翻译比较粗糙如有疏漏请不吝指教。注下文说的目的地就是对应的不同的数据平台例如Google Analytics Optimizely除非你生活在石器时代不然你一定知道「微服务」是当世最流行的架构。我们Segment早在2015年就开始实践这一架构。这让我们在一些方面上吃了不少甜头但很快我们发现在其他场景他时不时让我们吃了苦头。简而言之微服务的主要宣传点在于模块化优化减少测试负担更好的功能组成环境独立而且开发团队是自治的因为每一个服务的内部逻辑是自洽且独立的。而另一头的单体应用「巨大无比且难以测试而且服务只能作为一个整理来伸缩如果你要提高某一个服务的性能只能把服务器整体提高」2017 早期我们陷入了僵局复杂的微服务树让我们的开发效率骤减并且每一个开发小组都发现自己每次实现都会陷入巨大的复杂之中此时我们的缺陷率也迅速上升。最终我们不得不用三个全职工程师来维护每一个微服务系统的正常运行。这次我们意识到改变必须发生了本文会讲述我们如何后退一步让团队需要和产品需求完全一致的方法。为什么微服务曾经可行Segment 的客户数据基础设施吸收每秒成百上千个事件将每一个伙伴服务的API 请求结果一个个返回给对应的服务端的「目的地」。而「目的地」有上百种类别例如Google Analytics Optimizely或者是一些自定义的webhook。几年前当产品初步发布当时架构很简单。仅仅是一个接收事件并且转发的消息队列。在这个情况下事件是由Web或移动应用程序生成的JSON对象例子如下事件是从队列中消耗的客户的设置会决定这个事件将会发送到哪个目的这个事件被纷纷发送到每个目的地的API这很有用。开发人员只需要将他们的事件发送到一个特定的目的地也就是Segment的API而不是你自己实现几十个项目集成。如果一个请求失败了有时候我们会稍后重试这个事件。一些失败的重试是安全的但有些则不。可重试的错误可能会对事件目的地不造成改变。例如50x错误速率限制请求超时等。不可重试的错误一般是这个请求我们确定永远都不会被目的地接受的。例如请求包含无效的认证亦或是缺少必要的字段。此时一个简单的队列包含了新的事件请求以及若干个重试请求彼此之间事件的目的地纵横交错会导致的结果显而易见队头阻塞。这意味着在这个特定的场景下如果一个目的地变慢了或者挂掉了重试请求将会充斥这个队列从而整个请求队列会被拖慢。想象下我们有一个 目的地 X 遇到一个临时问题导致每一个请求都会超时。这不仅会产生大量尚未到达目的地 X的请求而且每一个失败的事件将会被送往重试的队列。即便我们的系统会根据负载进行弹性伸缩但是请求队列深度突然间的增长会超过我们伸缩的能力结果就是新的时间推送会延迟。发送时间到每一个目的地的时间将会增加因为目的地X 有一个短暂的停止服务因为临时问题。客户依赖于我们的实时性所以我们无法承受任何程度上的缓慢。为了解决这个队头阻塞问题我们团队给每一个目的地都分开实现了一个队列这种新架构由一个额外的路由器进程组成该进程接收入站事件并将事件的副本分发给每个选定的目标。现在如果一个目的地有超时问题那么也仅仅是这个队列会进入阻塞而不会影响整体。这种「微服务风格」的架构分离把目的地彼此分开当一个目的地老出问题这种设计就显得很关键了。个人Repo的例子每一个目的地的API 的请求格式都不同需要自定义的代码去转换事件来匹配格式。一个简单的例子还是目的地X有一个更新生日的接口作为请求内容的格式字段为 dob API 会对你要求字段为 birthday那么转换代码就会如下起初目的地分成几个拆分的服务的时候所有的代码都会在一个repo 里。一个巨大的挫折点就是一个测试的失败常常会导致整个项目测试无法跑通。我们可能会为此付出大量的时间只是为了让他像之前一样正常运行通过测试。为了解决这个问题我们把每一个服务都拆分成一个单独的repo所有的目的地的测试错误都只会影响自己这个过渡十分自然。拆分出来的repo 来隔离开每一个目的地会让测试的实现变得更容易这种隔离允许开发团队快速开发以及维护每一个目的地。伸缩微服务和Repo们随着时间的偏移我们加了50多个新的目的地这意味着有50个新的repo。为了减轻开发和维护这些codebase 的负担我们创建一个共享的代码库来做实现一些通用的转换和功能例如HTTP 请求的处理不同目的地之间代码实现更具有一致性。例如如果我们要一个事件中用户的名字event.name() 可以是任何一个目的地里头的调用。共享的类库会去尝试判断event 里的 name 或者 Name 属性如果没有他会去查 first name那么就回去查找first_name 和 FirstName往下推last name 也会做这样的事情。然后吧first name 和last name 组合成full name.Identify.prototype.name function() { var name this.proxy(traits.name); if (typeof name string) { return trim(name) } var firstName this.firstName(); var lastName this.lastName(); if (firstName amp;amp; lastName) { return trim(firstName lastName) }}共享的代码库让我们能快速完成新的目的地的实现他们之间的相似性带给我们一致性的实现而且维护上也让我们减少了不少头疼的地方。尽管如此一个新的问题开始发生并蔓延。共享库代码改变后的测试和部署会影响所有的目的地。这开始让我们需要大量时间精力来维护它。修改或者优化代码库我们得先测试和部署几十个服务这其中会带来巨大的风险。时间紧迫的时候工程师只会在某个特定的目的地去更新特定版本的共享库代码。紧接着这些共享库的版本开始在不同的目标代码库中发生分歧。微服务起初带给我们的种种好处在我们给每一个目的地都做了定制实现后开始反转。最终所有的微服务都在使用不同版本的共享库——我们本可以用自动化地发布最新的修改。但在此时不仅仅是开发团队在开发中受阻我们还在其他方面遇到了微服务的弊端。这额外的问题就是每一个服务都有一个明确的负载模式。一些服务每天仅处理寥寥几个请求但有的服务每秒就要处理上千个请求。对于处理事件较少的目的地当负载出现意外峰值时运维必须手动伸缩服务以满足需求。编者注肯定有解决方案但原作者突出的还是复杂度和成本。当我们实现了自动伸缩的实现每个服务都具有所需CPU和内存资源的明显混合这让我们的自动伸缩配置与其说是科学的不如说更具有艺术性其实就是蒙的。目的地的数量极速增长团队以每个月三个目的地的速度增长着这意味着更多的repo更多的队列更多的服务。我们的微服务架构的运维成本也是线性地增长着。因此我们决定退后一步重新考虑整个流程。深挖微服务以及队列这时列表上第一件事就是如何巩固当前超过140个服务到一个服务中管理所有服务的带来的各种成本成了团队巨大的技术债务。运维工程师几乎无眠因为随时出现的流量峰值必须让工程师随时上线处理。尽管如此当时把项目变成单一服务的架构是一个巨大的挑战。要让每一个目的地拥有一个分离的队列每一个 worker进程需要检查检查每一队列是否运行这种给目的地服务增加一层复杂的实现让我们感到了不适。这是我们「离心机」的主要灵感来源「离心机」将替换我们所有的个体队列并负责将事件发送到一个单体服务。译者注「离心机」其实就是Segment 制作的一个事件分发系统。 相关地址搬到一个单体Repo所以我们开始把所有的目的地代码合并到了一个repo这意味着所有的依赖和测试都在一个单一的repo 里头了我们知道我们要面对的会是一团糟。120个依赖我们都提交了一个特定的版本让每一个目的地都兼容。当我们搬完了目的地我们开始检查每一个对应的代码是否都是用的最新的依赖。我们保证每一个目的地在最新的依赖版本下都能正确运行。这些改变中我们再也不用跟踪依赖的版本了。所有目的地都使用同一版本这显著地减小了codebase 的代码复杂度。维护目的地变得快捷而且风险也变小了。另一方面我们也需要测试能简单快速地运行起来之前我们得出的结论之一就是「不去修改共享库文件主要的阻碍就是得把测试都跑一次。」幸运的是目的地测试都有着相似的架构。他们都有基础的单元测试来验证我们的自定义转换逻辑是否正确而且也能验证HTTP 的返回是否符合我们的期望值。回想起我们的出新是分离每一个目的地的codebase 到各自的repo 并且分离各自测试的问题。尽管如此现在看来这个想法是一个虚假的优势。HTTP 请求的发送仍然以某种频率失败着。因为目的地分离到各自的repo所以大家也没有动力去处理这类失败的请求。这也让我们走进了某种令人沮丧的恶性循环。本应只需几个小时的小改动常常要花上我们几天甚至一周的时间。构建一个弹性测试套件给目的地发送的HTTP 请求失败是我们主要的失败测试原因过期凭证等无关的问题不应该使测试失败。我们从中也发现一些目的地的请求会比其他目的地慢不少。一些目的地的测试得花上5 分钟才能跑完我们的测试套件要花上一小时时间才能全部跑完。为了解决这个问题我们制作了一个「Traffic Recorder」「Traffic Recorder」是一个基于yakbak 实现的工具用于记录并且保存一些请求。无论何时一个测试在他第一次跑的时候对应的请求都会被保存到一个文件里。后来的测试跑的时候就会复用里头的返回结果。同时这个请求结果也会进入repo以便在测试中也是一致的。这样一来我们的测试就不再依赖于网络HTTP请求为了接下来的单一repo 铺好了路。记得第一次整合「Traffic Recorder」后我们尝试跑一个整体的测试完成 140 目的地的项目整体测试只需几毫秒。这在过去一个目的地的测试就得花上几分钟这快得像魔术一般。为何单体应用可行只要每个目的地都被整合到一个repo那么他就能作为一个单一的服务运行。所有目的地都在一个服务中开发团队的效率显著提高。我们不因为修改了共享库而部署140 个服务一个工程师可以一分钟内重新完成部署。速度是肉眼可见地被提升了在我们的微服务架构时期我们做了32个共享库的优化。再变成单体之后我们做了46个过去6个月的优化甚至多过2016年整年。这个改变也让我们的运维工程师大为受益每一个目的地都在一个服务中我们可以很好进行服务的伸缩。巨大的进程池也能轻松地吸收峰值流量所以我们也不用为小的服务突然出现的流量担惊受怕了。坏处尽管改变成单体应用给我们带来巨大的好处尽管如此以下是坏处1. 故障隔离很难所有东西都在一个单体应用运行的时候如果一个目的地的bug 导致了服务的崩溃那么这个目的地会让所有的其他的目的地一起崩溃因为是一个服务。我们有全面的自动化测试但是测试只能帮你一部分。我们现在在研究一种更加鲁棒的方法来让一个服务的崩溃不会影响整个单体应用。2. 内存缓存的效果变低效了。之前一个服务对应一个目的地我们的低流量目的地只有少量的进程这意味着他的内存缓存可以让很多的数据都在热缓存中。现在缓存都分散给了3000个进程所以缓存命中率大大降低。最后我们也只能在运维优化的前提下接受了这一结果。3. 更新共享库代码的版本可能会让几个目的地崩溃。当把项目整合的到一起的时候我们解决过之前的依赖问题这意味着每个目的地都能用最新版本的共享库代码。但是接下来的共享库代码更新意味着我们可能还需要修改一些目的地的代码。在我们看来这个还是值得的因为自动化测试环节的优化我们可以更快的发现新的依赖版本的问题。结论我们起初的微服务架构是符合当时的情况的也解决了当时的性能问题还有目的地之间孤立实现。尽管如此我们没有准备好服务激增的改变准备。当需要批量更新时我们缺乏适当的工具来测试和部署微服务。结果就是我们的研发效率因此出现了滑坡。转向单体结构使我们能够摆脱运维问题同时显着提高开发人员的工作效率。我们并没有轻易地进行这种转变直到确信它能够发挥作用。 1. 我们需要靠谱的测试套件来让所有东西都放到一个repo。没有它我们可能最终还是又把它拆分出去。频繁的失败测试在过去损害了我们的生产力我们不希望再次发生这种情况。 2. 我们接受一些单体架构的固有的坏处而且确保我们能最后得到一个好的结果。我们对这个牺牲是感到满意的。在单体应用和微服务之间做决定的时候有些不同的因素是我们考虑的。在我们基础设施的某些部分微服务运行得很好。但我们的服务器端这种架构也是真实地伤害了生产力和性能的完美示例。但到头来我们最终的解决方案是单体应用。福利扫描添加小编微信备注“姓名公司职位”加入【云计算学习交流群】和志同道合的朋友们共同打卡学习推荐阅读Docker一个傲娇的男人做了中台就不会死吗每年至少40%开发资源是被浪费的AI“生死”落地谁有资格入选AI Top 30案例Python爬取B站5000条视频揭秘为何千万人为它流泪最前沿堪比Emc2Al-GA才是实现AGI的指标性方法论Zend 创始人欲创建 PHP 方言暂名为 P鸿蒙 OS 面世中国首个开源协议诞生 | 开发者周刊真香朕在看了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/914893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站是什么字体高速建设材料在哪个网站购买

哈喽,大家好呀,淼淼又来和大家见面啦,如今移动应用市场不断的发展,许多开发者小伙伴们都选择将他们的应用发布到苹果App Store上,但是,有时候他们可能希望通过直接分享IPA文件来分发他们的App,那…

济南小程序网站开发天空人体网站怎么做

来源:楼今岁阅 摘要:2018年,我们都在谈智能家居、智能交通、智能工业、智能安防等热门物联网话题,并且预计到2020年,中国物联网的整体规模将超过1.8万亿元。发展如此迅速,其涉及的领域一定会越来越广&#…

paypal外贸门户网站中外网站建设区别

设置 VIO 核以执行测量 您添加到自己的设计中的 VIO 核会显示在“硬件 (Hardware) ”窗口中的目标器件下。如果未显示这些 VIO 核 , 请右键 单击器件并选择“ Refresh Hardware ”。这样将重新扫描 FPGA 或 ACAP 并刷新“ Hardware ”窗口。 注释 &#xff…

小型网站设计及建设设计方案评价

文章目录 JDK7 vs JDK8 的 HashMap 结构变化Java8 中哈希表的红黑树优化机制HashMap 添加元素的完整流程解析1. 计算 key 的哈希值并确定索引2. 检查该索引位置是否已有元素3. 处理哈希冲突4. 判断当前存储结构(链表还是红黑树)5. 判断链表长度是否超过 …

深圳做外贸网站的公司wordpress收费下载资源插件

(201) 201 三十0 中断优先级补充 (202) 202 三十1 TCP的用户需求 函tcp_usrreq一 (203) 203 三十2 TCP的用户需求 函tcp_usrreq二 (204) 204 三十3 TCP的用户需求 函tcp_usrreq三 (205) 205 三十4 TCP的用户需求 函tcp_usrreq四 (206) 206 三十5 TCP的用户需求 函tcp_usrreq五 …

美食网站html代码ui培训班哪家好

为什么需要Schema Register 注册表 无论是使用传统的Avro API自定义序列化类和反序列化类 还是 使用Twitter的Bijection类库实现Avro的序列化与反序列化,这两种方法都有一个缺点:在每条Kafka记录里都嵌入了schema,这会让记录的大小成倍地增加。但是不管怎样,在读取记录时…

阿里云建站的优缺点企业网站建设规划可行性分析

全世界只有3.14 %的人关注了青少年数学之旅(图源 阿粪青,侵权删)

网站的邀请怎么做的手机网站 模板

电脑自动弹出网页的解决方法:我们可以利用360安全卫士中的弹窗过滤工具来解决此问题。首先我们打开360安全卫士;然后找到弹窗过滤工具;最后选择【强力模式】,保存设置即可。电脑自动弹出网页可以使用360安全卫士来进行弹窗拦截。打…

asp 网站 500wordpress在php什么版本

游戏公司面试题系列-CocosCreator实现虚拟摇杆控制角色移动&中心旋转自转小球&割草旋转逻辑<&#xff01;&#xff01;&#xff01;文章末尾有完整代码下载链接地址&#xff01;&#xff01;&#xff01;> Hello大家好&#xff01;今天我们来用最新的CocosCreat…

WordPress激活邮件链接无效网站购物分享seo

物联网&#xff08;Internet of Things&#xff0c;IoT&#xff09;是指将各种物理设备、车辆、家用电器、工业设备等通过网络连接起来&#xff0c;实现数据交换和通信的技术。物联网操作系统是管理这些设备并使其能够相互通信的软件平台。以下是一些常见的物联网操作系统&…

网站建设合同百度文库中国在线商城注册管理平台

现在越来越多的人或公司都想开发出自己的直播网站或者直播APP&#xff0c;但是在技术这一块又不知道怎么下手&#xff0c;那么我就给大家讲一下在视频直播系统开发中要了解那些知识和技术&#xff1a; 在开发上需要用的技术有&#xff1a; 摄像头采集 音视频编解码 流媒体协议…

湖南建设局网站大连网站开发培训班

1 概要说明 使用微信扫描登录相信大家都不会陌生吧&#xff0c;二维码与手机结合产生了不同应用场景&#xff0c;基于二维码的应用更是比较广泛。为了满足ios、android客户端与web短信平台的结合&#xff0c;特开发了基于SinglarR消息推送机制的扫描登录。本系统涉及到以下知识…

网站建设永远在路上国际购物网站有哪些

摘 要 本系统为用户而设计制作旅游信息管理系统&#xff0c;旨在实现旅游信息智能化、现代化管理。本旅游信息管理自动化系统的开发和研制的最终目的是将旅游信息的运作模式从手工记录数据转变为网络信息查询管理&#xff0c;从而为现代管理人员的使用提供更多的便利和条件…

信贷 网站模板 下载网站文字规划

1、GitHub遭遇严重的供应链“投毒”攻击&#xff0c;影响GG平台 多年来&#xff0c;威胁行为者一直在使用多种策略、技术和程序 &#xff08;TTP&#xff09;&#xff0c;包括劫持 GitHub账户、分发恶意 Python 包、使用虚假的 Python 基础设施以及社会工程进行攻击&#xff0c…

网站建设如何创建框架页面记事本代码做网站

执行流程 spring中Bean对象的执行流程大致分为四步: 启动Spring容器实例化Bean对象Bean对象注册到Spring容器中将Bean对象装配到所需的类中 ①启动Spring容器,在main方法中获取spring上下文对象并配备spring. import demo.*;import org.springframework.context.Applicati…

企业网站建设推广含义重庆潼南网站建设公司电话

一、前言 随着深度学习在图像、语言、广告点击率预估等各个领域不断发展&#xff0c;很多团队开始探索深度学习技术在业务层面的实践与应用。而在广告CTR预估方面&#xff0c;新模型也是层出不穷&#xff1a; Wide and Deep[^1]、DeepCross Network[^2]、DeepFM[^3]、xDeepFM[^…

广德做网站护肤品网站制作 网新科技

关于JSP页面无法加载css&#xff0c;游览器访问jsp页面样式未生效导致乱序 1.修改自己过滤器中对编码格式的修改 如图&#xff1a; 代码如下&#xff1a; public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOE…

制作外贸网站开发asp.net 价格查询网站

为什么使用消息队列&#xff08;如RocketMQ&#xff09;&#xff1f; 异步处理&#xff1a;解耦系统间调用&#xff0c;提高响应速度。解耦&#xff1a;降低模块间的直接依赖&#xff0c;使系统更易于扩展和维护。流量削峰&#xff1a;在高峰期将请求暂时存储起来&#xff0c;…

长沙做网站一般多少钱wordpress如何添加注册登录

1.链表 1.1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 现实中&#xff1a;链表就像是一列动车&#xff0c;一节连着一节 数据结构中的链表 注意: 1.从上图可看出…

xampp做网站可以吗清远做网站的公司

任务已完成&#xff0c;聚类效果很好&#xff08;主要在于数据的处理以及特征工程&#xff09;, 需代码si&#xff0c;yuer有限先到先得。