穹顶灯打不出阴暗面

大量的博客文章,白皮书和幻灯片组,宣扬了微服务的优点。 他们谈论微服务如何“提高敏捷性”,“更具可扩展性”,并承诺当您进行切换时,工程师会在办公室门口寻找工作。

让我们清楚一点,尽管有时会夸大其词,但微服务的好处在某些情况下可能是真实的。 对于具有许多团队的大型组织而言,微服务尤其有意义。 但是,微服务并不是万能的-尽管它们具有所有优点,但它们也具有明显的缺点。 在这篇文章中,我将描述微服务的分布式本质如何使它们本质上更加复杂。

分布式系统很难

分布式系统是可以协同工作以执行任务的任何计算机集合。 微服务只是设计用于交付Web服务后端的一种分布式系统。

分布式系统研究的早期可以追溯到70年代。 我们知道分布式系统很难。 从理论上讲,困难主要来自两个关键领域:共识和部分失败。

共识

从理论上讲,构建可行的分布式系统的根本问题归结为共识问题-关于分布式状态的共识。 几乎所有的分布式系统研究都试图以某种方式解决这个问题。 Paxos,Raft,Vector Clocks,ACID,最终一致性,Map Reduce,Spark,Spanner以及该领域中的大多数其他重要进展都在某种程度上摆在强共识和性能之间的取舍。

为了更好地理解分布式共识的问题,我们举一个例子进行说明。 假设Bob要求Server_1写入x = 5,而同时Jill要求Server_2写入x = 6,x等于5还是6? 天真的,可以看看x = 5发生的时间和x = 6发生的时间,然后选择最后发生的那个。

但是,您如何确定写入发生的时间

看时钟吗 谁的时钟? 您怎么知道时钟是准确的? 您怎么知道Bob,Jill,Server_1和Server_2与该时钟一致?

众所周知,时钟是不同步的,而且(正如阿尔伯特·爱因斯坦所教我们的)是不可修复的[1]。 因此,每个人真的需要就x的值达成一致吗? 如果是这样,需要多少协议? 该协议需要多长时间? 如果Bob试图达成协议而去世怎么办?

它变得复杂。

那么,鉴于很难达成分布式共识,这个问题在微服务的背景下如何体现? 好的微服务实现往往会通过简单地禁止共享状态来完全避开该问题。 在我们上面的示例中,不存在x,因此两个微服务需要在任何特定时间点就x的值达成一致。 而是将系统中的所有共享状态都发送到外部数据库或容器协调器。

这种方法可以解决也不能解决共识问题。 从理论的角度来看,它并不能解决问题,因为仍然存在共享状态仍然需要管理。 您刚刚移动了它。 顺便说一下,这就是为什么Kubernetes和数据库是如此复杂的原因。

从实际的角度来看,该方法确实解决了问题,与大多数微服务相比,Kubernetes和数据库在管理共享状态方面更胜一筹。 这些系统是由工程师设计的,他们每天花费一整天思考这些问题。 结果,他们更有可能达成正确的共识。

部分失败

考虑由整体服务的HTTP请求。 收到请求后,一台服务器从头到尾处理事务。 如果存在问题,无论是软件错误还是硬件故障,整个整体都会崩溃–每个故障都是完全故障。

现在考虑进入微服务的相同HTTP请求。 该微服务可能会向其他微服务发送新请求,而其他微服务反过来可能会生成更多的请求,而这些请求还会发送给更多微服务。 现在假设这些微服务之一失败了。 现在怎么办? 一个或多个微服务都依赖于数据微服务准备。

他们该怎么办? 稍等片刻? 多久? 再试一次? 尝试其他人吗? 还有谁? 放弃并尽力利用他们拥有的数据吗? 必须设计微服务来处理这些问题,这又使它们的开发更具挑战性。

部分失败被描述为不合格的好东西。 想法是,通过支持部分故障,应用程序将变得更有弹性-可以轻松解决小问题。 在我看来,好处很小,在实践中很少获得,并且以大大增加实现复杂性为代价。

更多动人的作品

除了微服务的理论挑战之外,还有很多挑战。 如此多的移动部件使堆栈的几乎每个部分以及软件开发生命周期的每个部分都变得复杂。

发展历程

通常,您可以直接在笔记本电脑上运行整体。 使微服务在本地计算机上运行需要更专业的工具,例如docker-compose和minikube。 此外,它们占用大量的CPU和内存,使它们在笔记本电脑上的运行速度极慢。

请注意,请查看 Kelda ,尤其是我们的 白皮书 ,以详细了解此问题。

调试

整体中发生的所有事情都在单个过程中发生。 您可以连接所选的调试器,然后开始比赛。 使用微服务,单个请求可能会分散在数十个不同的流程中。 像Jaeger这样的分布式跟踪工具可能会有所帮助,但这仍然是一个挑战。

记录中

使用整体,您可以将日志存储在文件中,并在需要时获取它们。 对于微服务,您需要Splunk或ELK堆栈之类的工具来为您处理。

监控方式

当您拥有数百个微服务时,像Nagios这样的简单的服务器上监视工具就无法扩展。 同样,更好的工具(Prometheus / Datadog / Sysdig等)使问题更容易解决,但是仍然很难。

部署方式

诸如Chef和Puppet之类的工具足以部署整体,但对于微服务而言,您需要诸如Kubernetes之类的更为复杂的工具。

联网

整料可以使用简单的负载平衡器处理。 微服务具有更多的端点,所有这些端点都需要负载平衡,服务发现,一致的安全策略等。我想服务网格可以帮助实现这一点(我不相信,但这是以后的主题)。

微服务有时有意义

从技术角度来看,微服务严格比整体服务难。 但是,从人类的角度来看,微服务可能会对大型组织的效率产生影响。 它们允许大型公司中的不同团队独立部署软件。 这意味着团队可以快速行动,而不必等待最慢的公分母对他们的代码进行质量检查并准备发布。

这也意味着大型软件工程组织中的工程师/团队/部门之间的协调开销较小。

尽管微服务可能有意义,但这里的关键是它们不是魔术。 就像计算机科学中的几乎所有事物一样,在技术复杂性与组织效率之间也要进行权衡。 一个合理的选择,但是您最好确保需要组织效率,以便使技术挑战值得。

[1]:是的,当然,地球上的大多数时钟都不会以接近光速的速度移动。 此外,一些现代的分布式系统(特别是Spanner)依靠这一事实,即使用极其精确的原子钟来回避共识问题。 尽管如此,这些系统本身还是极其复杂的,这证明了我的观点:分布式共识很难。

Kelda 使 Kubernetes上 的开发人员可以更轻松地使用微服务。

加入我们的Slack社区!

先前发布在 https://kelda.io/blog/the-dark-side-of-microservices/

翻译自: https://hackernoon.com/the-dark-side-of-microservices-explained-s6z3679

穹顶灯打不出阴暗面

穹顶灯打不出阴暗面_微服务的阴暗面,解释相关推荐

  1. 穹顶灯打不出阴暗面_知更鸟的崛起为愤怒的交易者带来了阴暗面

    穹顶灯打不出阴暗面 By Robert Schmidt and Ben Bain 罗伯特·施密特(Robert Schmidt)和本·贝恩(Ben Bain) Robinhood Markets ha ...

  2. 穹顶灯打不出阴暗面_Java生产监控的阴暗面

    穹顶灯打不出阴暗面 自动化的工作流程是在敏捷环境中交付最优质产品的新金标准. 不幸的是,不断变化会带来不断的风险. 输入"可观察性",这是一种度量,可以从其外部输出中推断出系统的内 ...

  3. 穹顶灯打不出阴暗面_Java 8星期五:Java 8的阴暗面

    穹顶灯打不出阴暗面 在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. Java ...

  4. 微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关

    微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关 1. 微服务简介 1.1 服务架构演变 1.2 SpringCloud ...

  5. ajax请求是宏任务还是微任务_微服务-如何解决链路追踪问题

    一.链路追踪 微服务架构是将单个应用程序被划分成各种小而连接的服务,每一个服务完成一个单一的业务功能,相互之间保持独立和解耦,每个服务都可以独立演进.相对于传统的单体服务,微服务具有隔离性.技术异构性 ...

  6. 怎么创建数据表的实体类和业务类_微服务项目第13天:商品分类业务的实现

    今天是刘小爱自学Java的第143天. 感谢你的观看,谢谢你. 学习计划安排如下: 商品分类业务的初步实现. 数据模型的分析:数据表字段的设计,Java中对应的实体类,前端页面vue组件. 业务模型的 ...

  7. vue一级分类和耳机分类_微服务项目第13天:商品分类业务的实现

    今天是刘小爱自学Java的第143天. 感谢你的观看,谢谢你. 学习计划安排如下: 商品分类业务的初步实现. 数据模型的分析:数据表字段的设计,Java中对应的实体类,前端页面vue组件. 业务模型的 ...

  8. 协方差意味着什么_微服务意味着我们可以使用所需的任何语言? 真?

    协方差意味着什么 Quick; let's list out some of the benefits of microservices: 快; 让我们列出微服务的一些好处: More agile d ...

  9. 多个微服务的接口依赖如何测试_微服务测试之接口测试和契约测试

    日常开发过程中,项目的接口通常由服务提供方约定和提供,微服务模式下接口被多个消费者调用更是常态,那么提供方接口的变更如何快速.高效.无遗漏的通知给消费者呢?另外,当一个service同时被多个使用者调 ...

最新文章

  1. C# - linq查询现有的DataTable
  2. 微软HTTP API指南
  3. oracle中execute函数,oracle Execute Immediate(sql语句)
  4. 循环链表设计与API实现
  5. SpringCloud微服务注册调用入门-路由网关
  6. pcre-7.9编译安装出错[pcrecpp.lo] Error 1
  7. 2.Linux下C++操作MongoDB
  8. Java酒店管理系统项目
  9. 如何在网上隐藏自己的IP地址(转)
  10. android 实现仿美团点菜和京东分类导航
  11. Tecplot新手进阶--使用tecplot宏操作批量处理数据输出图片(详细步骤)
  12. SoundPool播放系统提示音
  13. emoji表情mysql处理_Mysql Emoji表情处理
  14. 桌面计算机回收站打不开,b8,教您电脑回收站打不开怎么解决
  15. FPGA进行多路并行插值滤波(多相滤波)的实现原理
  16. The Graveyard Book
  17. 项目1_小鲨鱼记账系统
  18. 国际长相思庆典在新西兰马尔堡举办
  19. Java之品优购课程讲义_day08(3)
  20. 数据要素三级市场经济性分析模型研究

热门文章

  1. 两张图搞定IJK源码
  2. 高新技术企业的申报流程是怎样的?
  3. 社交网站SNS的运用
  4. 中国省级GDP增长目标(2000-2018年)
  5. 安全基础教育第一季:堡垒是从内部攻破的
  6. git 用idea打tag
  7. MySQL之MYISAM和INODB
  8. 微软Windows Azure项目交流会小记
  9. 黑马程序员-logback.xml配置文件
  10. Batch Momentum