阅读更多

0顶
0踩

企业架构
基于Microservices(微服务)来构建分布式系统的优点之一是系统作为一个整体有能力能够承受错误和意外失败的组件、网络、计算资源等。这样的系统对错误更有弹性。容错性背后的原理很简单:假如我们的单体程序出错了,那么它所承担的所有功能都会随之出错;因此让我们把系统分解到更细小的粒度,让系统的任一独立模块出错时而不至于会影响到整个系统的运作。这在理论上听起来不错,但是是否意味着将系统简单的分解成小块给我们就是微系统?

其中一个测试方法是使用Netflix所说的“chaos monkey” 或类似的“混乱”策略:在系统中引入干扰的目的在于证明系统的弹性(或脆弱性)。只有在系统出错时才显示出它的本色,而不是当一切都一帆风顺时,所以人为的引入错误是一种非常好的方式来挖掘出我们所创建系统的真实面貌。实际上,你真正需要做的是建立antifragile的系统,但那不是这篇文章的主题,我们会在另外的文章中阐明。

将系统分解成小块可以给你的系统带来更多弹性,但并不意味着不需要对此深谋远虑。例如,系统模块的粒度分解越小,我们就越多的需要“编排”或依赖“下游”服务的数据,功能。假如这些下游服务宕机了,我们的服务又会如何表现?当这种相互依赖性越多时,我们的服务在运行时的相互联接就越多。假如有个我们所依赖的服务改变了它的接口、负载或是事件结构,这又将怎样的影响我们的服务?我们会被迫根据交互程序的变更而变更吗?假如如此,那么这种架构是非常脆弱的。服务提供者是否允许多个版本的服务共存为我们提供服务?

很多时候我们(或暗示)依靠一次并且只调用一个服务对于一个给定的事件。或者至少一次且仅一次处理。如果一个上游的服务体验网络延迟和重试?我们可能会有多个调用。我们做什么呢?很多时候,我们都依赖于或者说默认每个触发的事件都会导致一次且仅一次的服务调用,或者说这些事件会被一次且仅一次的处理。那么假如当上游服务发生网络延迟和重发时呢?我们可能会面对对同一事件的多重调用,我们该如何处理这种情况?

这些微服务的细节在各种会议及相关活动炒作时往往被忽略,但是它们是真实存在的。接下来我将努力介绍这些“微服务实现细节”,作为我建立一个不平凡的循序渐进的一个“微服务”范例(我将在我的Twitter@christianposta上发表它们)。仅仅是说我们将实施微服务并不会解决那些分布的问题。下面让我们来看三种相当容易理解的,你能用来实践构建你的微服务系统并增加弹性的模式。



Promises(承诺)和Fallbacks(回退)

Promises(承诺)理论,由Mark Burgess首先提出,描述系统间如何相互作用,它表明,我们的系统可能并不是和我们所期望的行为一致。服务提供者发布“意图”给“执行系统”,事实上真正的执行结果并不一定是我们所期望的。在很多时候,就像是我们人类相互交互一样。我们越是把微服务看作一个复杂系统中独立、自治的代理,我们就越是需要尊重这种自治通过理解这些系统可能在某些时候自愿提供某些服务,而有时则不能。

所以当事情没有按计划进行时,会发生什么?让我们来看看一个非计算机的例子。假设我当前是一个顾问为我的客户提供服务。也许我是一个建筑师,帮助你建立微服务架构并且我承诺提供一个现场建筑工作室。这是我自愿为你提供这个服务。假如我到你公司的航班被取消了 (例如:我曾经尝试飞往O’Hare)?我是否会打给你说“对不起,不能提供现场工作室了,因为我的航班被取消了”?我想我会的。那么下次你问我提供现场工作室时可能考虑一些额外因素。比如我会说“对不起,我的航班被取消了,也许我能找到另一个航班?”或“也许我可以提供远程服务”,或“我们可以重新安排日程吗?“我是自愿承诺提供微服务的工作室,所以我只会在我力所能及的范围内提供这个服务。

在微服务架构中提供服务时,这种思考方式是很重要的。当合作者服务不可用怎么办?我的Fallback(回退)程序是可用的吗?很多时候这种回退服务可能是业务所必须的。也许你需要返回一个封装回应。也许你可以调用不同的服务作为备份。也许你自己做一个简化计算。无论如何,在面对一些意想不到的错误时,你应该考虑选择什么来帮助完成或部分完成服务承诺。Apache CamelNetflix Hystrix也有助于此。
消费者契约

自从我们的SOA时代开始,我们就根深蒂固的认为服务合同就是定义了服务提供者应该提供的东西。在上面关于承诺的讨论中,就是关于服务提供者的“意图”。然而,从上述讨论我们也可以看到,提供者可能在某些情况下不能履行承诺,也许它会返回其他东西。这个时候,消费者应该如何反应?

服务提供者提供了某种形式的合同(即文档或模式描述请求的有效负载和制式响应)和提供者所规定的符合消费者需求的这些文档和实现其内部数据模型。然后消费者会将它分解,甚至验证这些服务交互的内容负载。现在如果提供者最终改变合同(如添加新字段)的分解和验证这些数据有效载荷可能被打破。这并不是个好方式,因为我们重视我们服务的自治权。我们应该能够改变某个服务而不至于强迫其他服务产生连锁反应。

一个解决方案是基于以下原则即“严出宽进”。基本上,我们只做“基本足够”的响应验证以及提取我们所需的数据,而不是去验证完整的数据。这意味着我们的数据编出逻辑应该足够聪明到解决的部分数据模型/响应,它不知道(或)关心数据的整体。此外,如果我们可以捕获的部分消费者真正关心的响应,我们就可以开始这一反馈循环返回给服务提供商,帮助他们理解实际上服务和消费者之间真正使用的服务由变化导致的变化。Thoughtworks的Ian Robinson在下面文章中有关于这个问题的阐述: Consumer Driven Contracts: A Service Evolution Pattern。Schema registries可以为此提供帮助。

幂等消费者(Idempotent Consumers)

当事情出错时,会发生什么?或者当服务失败?服务可能会卡在一个事务的中间。行为不端的服务请求可能无意中冲击我们的服务。消费服务网络中可能会经历延迟(假设部署在云上!)和可能超时并重试。一个系统,期望获得一次且仅一次传送消息的是脆弱的定义。如果你构建你的服务能够处理这些 “意想不到”类型的行为,那么它会更有弹性。因此我们需要幂等服务(idempotent services)。

一个例子不在“deltas”系统之间交换消息。这些都不是幂等消息,如果你多次收到一个消息说“X+20”,你可能会得到一个不一致的值。这里也许在消息中增加一个“当前值”是个好主意,这样无论你收到多少次消息,它们都不会导致一个不一致的值。

另一个选择是使用可以过滤掉重复消息的基础设施。例如,在故障场景中, Apache ActiveMQ可以过滤掉生产者发送给代理最终由于某些原因错误的终结在不同代理点上的重复消息。代理索引可以追踪和识别重复消息并丢弃它们。

另一个选择是在你的服务中跟踪消息的惟一标识符并拒绝接受那些已经成功处理的。将该标识符信息存储在一个LRU缓存帮助你快速诊断你是否已经处理过某个消息并返回一个制式响应,原始响应,或者忽略它。Apache Camel能够让你很容易使用这个idempotent-consumer模式的来构建服务。

虽然你如何实现这些模式并不重要,我们所需要的就是系统能够优雅的容错。所有这些都是久经考验的模式。没有什么想法是全新的,但我不认为它们经常被实现。恕我直言,它们应该被实现。上述三个建议将帮助你构建弹性服务,尽管它们不是唯一需要考量的。其他需要考虑的包括隔离、bulkhead模式、负载均衡、服务发现、apologies,事务一致性等等,都能帮助提高系统弹性。如果微服务的优点之一是弹性方面,我们应该基于这些最前沿的概念来设计我们的微服务架构。

译者:王旭敏,Nokia开发工程师,关注云计算、高性能及可用架构、容器等。
责编:魏伟,欢迎加入微服务技术交流群,搜索“k15751091376”,由群主拉入
原文链接:https://dzone.com/articles/3-easy-things-to-do-to-make-your-microservices-mor
  • 大小: 46.3 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 微服务十二要素

    使用标准化流程自动配置,从而使新的开发者花费最少的学习成本加入这个项目。 和操作系统之间尽可能的划清界限,在各个系统中提供最大的可移植性。 适合部署在现代的云计算平台,从而在服务器和系统管理方面节省资源...

  • 微服务:什么是微服务?一篇文章让你彻底搞明白

    文章目录前言一、微服务介绍1.什么是微服务2. 微服务由来3. 为什么需要微服务?3.1 早期的单体架构带来的问题1.复杂性逐渐变高2.技术债务逐渐上升3.部署速度逐渐变慢4.阻碍技术创新5.无法按需伸缩3.2 微服务与单体...

  • 微服务最重要的10个设计模式

    缺点 服务间的数据共享变得更有挑战性。 在应用范围的保证 ACID 事务变得困难许多。 细心设计如何拆分单体数据库是一项极具挑战的任务。 何时使用独享数据库 在大型企业应用程序中。 当团队需要完全把控微服务以...

  • 微服务

     在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、著名的"2 pizza 团队"很好的诠释了这一解释...

  • 入门、复习微服务的同学看过来,一篇文章让你彻底搞懂微服务

    目前大部分公司已经离不开微服务这个词了,那么微服务是什么呢?本文将带你深入浅出微服务。

  • 微服务(概念篇):什么是微服务?一篇文章让你彻底搞明白

    一、微服务介绍 1.什么是微服务 2. 微服务由来 3. 为什么需要微服务? 3.1 早期的单体架构带来的问题 3.2 微服务与单体架构区别 3.3 微服务与SOA区别 4. 微服务本质 5. 什么样的项目适合微服务 6. 微服务折...

  • 微服务架构中10个常用的设计模式

    Md Kamaruzzaman 的微服务独享数据库 优点 数据由服务完全所有 服务的开发团队之间耦合度降低 缺点 服务间的数据共享变得更有挑战性 在应用范围的保证 ACID 事务变得困难许多 细心设计如何拆分单体数据库是一项极具...

  • 微服务要素-十二要素(The Twelve Factors)

    “十二要素应用程序”(12-Factor App)为构建如下的SaaS应用提供了方法论: 将开发环境和生产环境的差异降至最低,并使用持续交付实施敏捷开发;这套理论适用于任意语言和后端服务(数据库、消息队列、缓存等)开发...

  • 微服务架构深度解析微服务定义是什么?微服务与云原生有何关联?

    在博文中,“微服务架构”这个术语用来描述一种将软件应用程序设计为可独立部署的服务套件的特定方式。 “细粒度自治服务”“自动化部署”“围绕业务能力”“端点智能”“语言和数据的分散控制”,从这些描述微服务...

  • 微服务12要素

    一旦有多个基准代码,就不能称为一个应用,而是一个分布式系统。分布式系统中的每一个组件都是一个应用,每一个应用可以分别使用12-Factor进行开发。 多个应用共享一份基准代码是有悖于12-Factor原则的。解决方案是...

  • 异构服务器 微服务_【转】微服务(概念篇):什么是微服务?一篇文章让你彻底搞明白...

    目录前言一、微服务介绍1.什么是微服务2. 微服务由来3. 为什么需要微服务?3.1 早期的单体架构带来的问题3.2 微服务与单体架构区别3.3 微服务与SOA区别4. 微服务本质5. 什么样的项目适合微服务6. 微服务折分与设计...

  • 微服务-十二要素

    前言 今天看“如何实现现代应用的快速落地”公开课,提到十二要素,之前文章也提到多次,这里统一汇总下: ...使用标准化流程自动配置,从而使新的开发者花费最少的学习成本加入这个项目; 和操作系统之间.

  • 微服务之初识微服务

    顾名思义,微服务得从两个方面去理解,什么是”微”、什么是”服务”, 微 狭义来讲就是体积小、著名的”2 pizza 团队”很好的诠释了这一解释(2 pizza 团队最早是亚马逊 CEO Bezos提出来的,意思是说单个服务的设计...

  • 基于FPGA的四相八拍步进电机控制系统设计:集成交付、正反转、加速减速及调速功能

    内容概要:本文详细介绍了基于FPGA的四相八拍步进电机控制系统的开发过程。主要内容包括:1. 使用VHDL和Verilog编写LED显示屏驱动代码,用于显示角度、学号和姓名等信息;2. 实现步进电机的正反转控制,通过状态机管理相序变化;3. 开发加速减速控制模块,确保电机启动和停止时的平稳性;4. 设计调速功能,通过调节脉冲频率实现速度控制。此外,文中还讨论了调试过程中遇到的问题及其解决方案。 适合人群:对FPGA开发和步进电机控制感兴趣的电子工程师、嵌入式系统开发者以及相关专业的学生。 使用场景及目标:适用于需要高精度运动控制的应用场合,如工业自动化、机器人技术和精密仪器等领域。目标是帮助读者掌握FPGA控制步进电机的基本原理和技术细节。 其他说明:文中提供了详细的代码片段和调试经验分享,有助于读者更好地理解和应用所学知识。同时,作者还提到了一些实用技巧,如通过PWM调节实现多级变速,以及如何避免步进电机的共振问题。

  • Android开发:基于SQLite的日历备忘录记事本项目详解与实现

    内容概要:本文详细介绍了基于Android Studio开发的日历备忘录记事本项目,涵盖日历查看、添加备忘录、闹钟提醒和删除备忘录等功能。项目使用SQLite数据库进行数据存储,通过CalendarView、EditText、Button等控件实现用户交互,并利用AlarmManager和PendingIntent实现闹钟提醒功能。此外,项目还包括数据库的设计与管理,如创建DatabaseHelper类来管理数据库操作,确保数据的安全性和完整性。文章还探讨了一些常见的开发技巧和注意事项,如时间戳的使用、手势监听的实现等。 适用人群:适用于初学者和有一定经验的Android开发者,尤其是希望深入了解Android开发基础知识和技术细节的人群。 使用场景及目标:该项目旨在帮助开发者掌握Android开发的基本技能,包括UI设计、数据库操作、闹钟提醒机制等。通过实际项目练习,开发者能够更好地理解和应用这些技术,提升自己的开发能力。 其他说明:文中提到一些进阶任务,如用Room替换SQLite、增加分类标签、实现云端同步等,鼓励开发者进一步扩展和优化项目。同时,项目源码公开,便于学习和参考。

  • Matlab实现基于SVM-Adaboost支持向量机结合Adaboost集成学习时间序列预测的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:本文档详细介绍了一个基于SVM(支持向量机)和Adaboost集成学习的时间序列预测项目。该项目旨在通过结合这两种强大算法,提升时间序列预测的准确性和稳定性。文档涵盖了项目的背景、目标、挑战及其解决方案,重点介绍了模型架构、数据预处理、特征选择、SVM训练、Adaboost集成、预测与误差修正等环节。此外,文档还探讨了模型在金融市场、气象、能源需求、交通流量和医疗健康等多个领域的应用潜力,并提出了未来改进的方向,如引入深度学习、多任务学习、联邦学习等先进技术。 适合人群:具备一定机器学习基础的研究人员和工程师,特别是那些从事时间序列预测工作的专业人士。 使用场景及目标:①用于金融市场、气象、能源需求、交通流量和医疗健康等领域的复杂时间序列数据预测;②通过结合SVM和Adaboost,提升预测模型的准确性和稳定性;③处理噪声数据,降低计算复杂度,提高模型的泛化能力和实时预测能力。 其他说明:文档不仅提供了详细的理论解释,还附有完整的Matlab代码示例和GUI设计指导,帮助读者理解和实践。此外,文档还讨论了模型的部署与应用,包括系统架构设计、实时数据流处理、可视化界面、GPU加速推理等方面的技术细节。

  • #游戏之追逐奶酪123

    #游戏之追逐奶酪123

  • 威纶通触摸屏配方管理系统解析:宏程序、数据结构与UI设计

    内容概要:本文详细介绍了威纶通触摸屏配方管理系统的实现方法及其应用场景。首先,文章讲解了配方管理的基本概念和技术背景,强调了配方管理在工业自动化中的重要性。接着,通过具体的宏程序代码示例,展示了如何实现配方的保存、加载以及安全校验等功能。文中还提到配方数据结构的设计,如使用寄存器地址偏移来确保数据不冲突,并通过CSV文件格式方便地管理和维护配方数据。此外,文章深入探讨了UI设计方面的内容,包括动态图层技术和按钮交互效果的应用,使得用户界面更加友好和直观。最后,作者分享了一些实际项目中的经验和技巧,如文件操作的异常处理和宏指令调试方法。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对触摸屏配方管理系统感兴趣的读者。 使用场景及目标:适用于需要频繁切换设备参数的生产环境,如食品加工、注塑成型等行业。通过使用威纶通触摸屏配方管理系统,可以提高工作效率,减少人为错误,同时简化设备调试和维护流程。 其他说明:附带的工具包提供了完整的宏指令注释版、图库资源和调试工具,帮助用户更好地理解和应用该系统。

  • 张彩明-图形学简明教程 配书资源

    张彩明-图形学简明教程 PPT课件

Global site tag (gtag.js) - Google Analytics