转向微服务如何造成运行时问题?


104

以下评论员写道

微服务将组织功能障碍从编译时问题转移到运行时问题。

评论员扩展了该问题的说法:

功能不是错误。运行时问题=>产品问题=>向功能负责人反馈更强大,更快速的功能障碍

现在,我通过微服务获得了您:

  • 可能会增加吞吐量的延迟-这是生产和运行时的问题。
  • 增加代码中“网络接口”的数量,其中可能存在潜在的运行时解析错误。
  • 可能会进行蓝绿色部署。接口不匹配可能会阻止这些故障(请参阅网络接口)。但是,如果蓝绿色部署能够正常工作,那么它就更是运行时的问题。

我的问题是:转移到微服务会带来运行时问题,这是什么意思?


13
如果A在一个单一的情况下与B交谈,则至少实际接口可以被证明是兼容的(通过静态键入),这使得它更有可能也是正确的。通常,微服务在不进行编译时间检查的情况下就通过某种东西进行通信
Richard Tingle

如果您正在研究涉及使用微服务的问题,则必须阅读Fowler文章。martinfowler.com/articles/microservices.html 我相信这不仅仅是@Richard Tingle所说的编译时与运行时的情况。而且,我并不完全同意生产问题要好于开发中的问题。但是微服务可能会以其他方式帮助扩展大型项目。(对于大多数小型项目而言,这是一个过大的杀伤力)
Borjab

2
那位评论员是近视的。运行时问题=>产品问题=>用户不满意=>赔钱。
菲利普

@Philipp:这就是重点。由组织功能障碍引起的编译时问题=>没人关心。由组织功能障碍导致的金钱损失=>确切地伤害了那些负责组织功能障碍的人。希望:组织功能障碍更快得到解决。
约尔格W¯¯米塔格

Answers:


194

我有个问题。让我们使用微服务!现在我有13个分布式问题。

将系统分为封装,内聚和解耦的组件是一个好主意。它使您可以分别解决不同的问题。但是,您可以在整体部署中完美地做到这一点(请参阅Fowler:Microservice Premium)。毕竟,这是OOP几十年来一直在教的东西!如果您决定将组件转换为微服务,则不会获得任何架构优势。您将在技术选择方面获得一些灵活性,并且可能(但不一定!)获得一些可伸缩性。但是,由于(a)系统的分布式特性和(b)组件之间的通信,您一定会感到头疼。选择微服务意味着您还有其他迫在眉睫的问题,尽管有这些问题,您仍然愿意使用微服务。

如果您无法设计干净整洁的组件,那么您也将无法设计微服务系统。在整体代码库中,痛苦将非常明显。理想情况下,如果代码严重损坏,将不会编译。但是对于微服务,每种服务都可以单独开发,甚至可能使用不同的语言。在集成组件之前,组件交互中的任何问题都不会变得明显,到那时,修复整个体系结构为时已晚。

错误的第一大来源是接口不匹配。可能会出现明显的错误,例如缺少参数,或者更细微的示例,例如忘记检查错误代码或忘记在调用方法之前检查前提条件。静态类型可以在代码运行之前尽早检测到此类问题:在您的IDE和编译器中。动态系统没有这种奢侈。在执行错误的代码之前,它不会崩溃。

微服务的含义令人恐惧。微服务本质上是动态的。除非您使用正式的服务描述语言,否则您无法验证接口使用情况的任何正确性。您必须测试,测试,测试!但是测试是昂贵的,并且通常不能穷举,这可能会导致生产中仍然存在问题。这个问题何时会显现出来?只有在运行时在生产中采用该错误路径时。产品问题会导致更快的反馈的观念是滑稽地 除非您对数据丢失的可能性感到高兴,否则这是非常危险的错误。


13
@JacquesB我相信“组织功能障碍”是指无法开发系统。我的大部分回答是为了说明一个人如何得出这样的结论的背景,但这是我的专业意见,并非来自推文。
阿蒙

10
“整洁地分为组件的整体”-这到底是什么意思?

10
更不用说接口的版本控制(接口随时间变化)。
彼得·莫滕森

12
@mobileink Monolith在这里不是一个理想的术语,因为它表示“无体系结构”。但是,与基于服务的体系结构(其中系统的各个部分可以独立部署)相比,我要传达的是一个作为单个系统开发和部署的系统。如果您有更好的用语,请编辑该帖子……
amon

7
@amon听到Monolith这个词并不能立即使人想到“没有建筑”的想法。大多数建筑都是巨型独石,埃及的大金字塔以及许多其他物品也是。显然,它们是架构师,并作为一个整体交付。许多软件系统缺乏良好的体系结构。但是缺乏好的架构似乎与它们的部署方式无关。您可能会借用另一个项目的一些脚手架,并将其称为架构(3层,2层,n层,微服务等),但是这样做并不能确保您做得很好。
Edwin Buck

215

第一条推文是我的,因此我将在其上进行扩展:

假设您有100个开发人员,在一个整体应用程序上工作。太多的人无法彼此有效地沟通,因此公司必须努力将他们分成较小的团队,并在他们之间建立良好的沟通模式。当组织处于“功能失调”状态时,团队可能不会互相交谈,他们没有达到更大的目标,他们在优先事项等方面意见不一致-结果,他们要花很多时间才能运送东西。从某种意义上说,功能异常在软件生产之前就很明显,这是一个“编译时问题”。该项目可能是步履蹒跚或永不出货(“编译”)。

我认为许多人被微服务所吸引,并且正在转向微服务,这并不是因为固有的技术/架构优势,而是因为它使他们可以忽略组织功能障碍。他们希望不要让100个开发人员结盟,而是希望他们可以有一些小团队在各自为战,每个团队都专注于自己的微型服务。如果您处于这样一个功能失调的组织中,那么它会如此吸引人:它给您更大的权限,可以避免您不喜欢的人,不进行交流。

不幸的是,这成为一个“运行时问题”,因为一旦软件在生产中运行,良好的沟通就变得同样重要。组织的问题-团队以及他们如何协调和沟通-在“运行时”出现。

我的推文的重点是:如果您遇到的是人员问题,那么新的体系结构将无济于事。这只会延迟问题的影响。我认为微服务对许多人的吸引力是希望它将神奇地解决这些人的问题。


67
+1。作为Stack Exchange的答案,这比发送Tweet的要好得多。:-)
ruakh

3
实际上,对于任何动态系统而言都是如此。动态键入非常有用,但前提是您拥有合适的人员。“自由格式数据库”非常有用,但前提是您拥有合适的人员。如果您没有合适的人,那么您只是委派问题,而不是解决问题。
a安

2
我认为这是一个重言式。当人们遇到问题时,问题就会无处不在。我无法想象没有适当的集成测试就可以交付作为一组微服务运行的解决方案。在这种情况下,无法交付具有支持的工作流程的解决方案。如果有人在进行微服务时没有进行流量测试,尤其是为了隐藏问题,那就是问题所在。也许还可以运送未经测试/破损的二进制文件。它从更高级别的士兵级别的程序员那里提出了这个问题。
luk32

10
@ luk32在某种程度上,是的,但是使微服务对坏团队具有吸引力的要点是,使您的技能和沟通不足会在很长一段时间内不被察觉。这是没有问题的事与否,什么时候他们会出现
T.萨

18
很好的答案。感谢您确认我对Twitter的看法,除了引起人们的注意之外,它对任何事情都毫无用处。
罗伯特·哈维

43

我的问题是:转移到微服务会带来运行时问题,这是什么意思?

不是那些推文所说的!他们没有说过转向微服务,也没有说过制造问题。他们只说了解决问题的方法

而且他们把上下文限制对他们的主张,即你的组织是不正常的。

因此,第一条推文基本上是在说两件事:

  • “如果您的组织现在无法使用微服务来设计复杂的系统,那么它将无法神奇地使用微服务来设计复杂的系统”和
  • “由这种无能引起的问题现在会在编译时(即在开发期间出现,然后在运行时(即在生产中)出现”(从技术上讲,它们也可能在测试期间出现,但请记住,引号本身就具有局限性)到功能失调的组织,这些组织可能具有不合格的测试制度)

第二鸣叫说的事实,问题只体现在生产,即让客户看到他们,是一种功能,而不是一个错误,因为当客户抱怨,倾向于在不同的地方可以听到比当生成中断,即在能够解决组织功能障碍的地方(例如高层管理人员)。由于组织功能障碍通常是高级管理的失败,这意味着不满意的客户会对最终导致这种不满意的客户产生严重影响,而更高级别的管理失败所导致的代码质量低下通常只会对开发人员造成不良影响。但是,这并不是错误,也无法对此做任何事情。

因此,第一条推文说微服务将管理不善引起的问题从编译时(只有开发人员看到)转移到运行时(客户看到它们)。第二条推文说这是一件好事,因为那样的话,问题会伤害那些对此负责的人。


6
@Michael如果您看不到它们如何影响代码质量,则可以考虑管理层对他们业务创造的产品质量的任何部分(如果有)的影响。
wjl

30
@Michael:一切最终都是由高层管理人员引起的。代码质量低是否由不可能的期限引起?谁设定这些期限?谁告诉那些设定截止日期的人设定那些截止时间?不称职的开发人员会导致代码质量低下吗?谁雇用了那些不称职的开发人员?谁雇用了那些没有能力的开发商?是由于工具不足引起的吗?谁购买这些工具?谁批准购买这些工具的预算?这是由愚蠢的架构引起的吗?谁雇用了建筑师?谁负责他?这些鸣叫是明确的背景下...
约尔格W¯¯米塔格

13
……组织功能障碍。那么,使该组织的功能是相当多更高级别的管理岗位。这是管理什么
约尔格W¯¯米塔格

4
尽管从长远来看可能会奏效,但通过使问题影响客户来解决公司问题的想法似乎并不正确。
Stijn de Witt

1
@JörgWMittag我认为声称由不良开发人员编写的不良代码是雇用这些不良开发人员而不是不良开发人员本身的人的错,这是不合理的。最终可能是管理的责任,但这是由开发人员引起的。
Miles Rout

9

编译时问题相反,它会产生运行时问题。

单片应用程序难于编译且昂贵。但是一旦编译完成,您就可以合理地确定组件之间不存在极其愚蠢的不兼容性,因为类型系统可以捕获它们。只有当两个特定的组件以特定的方式实际交互时,微伺服系统中的相同错误才会显示出来 。


9
这似乎假设“整体”应用程序始终是静态类型的。动态类型的语言呢?静态类型的服务接口又如何呢?
JacquesB

1
@JacquesB OTOH,我可以想到完全为零的动态类型的编译语言。
immibis

2
@JacquesB未编译JavaScript和Python。除非您将内部解释器结构视为编译目标,否则将编译每种语言
immibis

3
@immibis:当前存在的每个 ECMAScript实现都有至少一个编译器。例如,V8有两个编译器和正好为零的解释器,它从不解释,而是始终编译为二进制本机代码。我相信SpiderMonkey有四个编译器和一个解释器,但是该解释器不能解释ECMAScript。SpiderMonkey 从不解释ECMAScript,它总是先将其编译为SpiderMonkey字节码,然后再将其编译为二进制本机代码。当前所有现有的Python,Ruby和PHP实现都具有编译器。
约尔格W¯¯米塔格

12
@LieRyan如果您认为类型推断与动态类型相同和/或Haskell是动态类型,则您会感到非常困惑。
德里克·埃尔金斯

2

在单片系统和微服务中,都必须定义子系统之间的接口。界面应设计合理,文档完善且尽可能稳定。这与OOP中的相同。

如果您的组织无法做到这一点,微服务也将无法解决问题。在微服务中,您具有公共Web界面。因此,您甚至必须花费更多的精力进行界面设计。

如果接口的设计不正确,则会遇到两种运行时问题:

  1. 如果未正确使用该接口,则会在运行时(而不是在编译时)出现错误。
  2. 调用Web界面的速度很慢,因此会出现性能问题。

我认为产生运行时问题不是将组织问题传达给负责人员的正确方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.