⽣产环境微服务部署_5种在⽣产中不⽀持微服务的⽅法
⽣产环境微服务部署
Java开发⼈员? Takipi替代了⽣产JVM中的⽇志记录,并让您在所有已记录的错误,警告和异常之后查看源代码,调⽤堆栈和变量状态–微服务的阴暗⾯:可能会出什么问题?
如今,似乎每个⼈都在使⽤微服务,⽽整体式架构则像崩溃⽼旧城堡⼀样受欢迎。
某些趋势引起的公众关注经常被夸⼤,不能反映实际情况,但是这次感觉更像是共识。 微服务迭代关注点分离的基本原理,并根据⼯程师团队的见解命名,这些⼯程师为需要解决的实际问题制定了解决⽅案。
在这篇⽂章中,我们将扮演魔⿁的拥护者,分享和⽤户的⼀些见解,研究⽣产中微服务的主要问题–以及如何解决它们。
— Takipi(@takipid)
微服务的另⼀⾯
关注点分离不是⼀个新概念,也不是分布式计算。 好处是巨⼤的,但是它们通常是时间和⾦钱上的更⾼的运营成本。 混合两者,您会得到各种⿇烦问题的⽪⽒培养⽫。 将其投⼊⽣产后,问题就会翻两番。 调试救援,哦,等等...
调试并不是要解决问题。
正如 上指出的那样,“调试已演变成⼀种⼝头传统,民间传说中的问题已经消失”。 实际上,它更像是⼀门科学,了解系统是如何⼯作的,⽽不是我们如何思考它的⼯作。
调试不仅是次要任务,⽽且是⼀个基本问题。 Maurice Wilkes爵⼠是有史以来第⼀个创建的程序之⼀的调试器,他已经意识到调试对开发⼈员的主要作⽤:
“在1949年,我们开始编程时,我们惊讶地发现,正确地编写程序并不像我们想象的那么容易。 调试必须被发现。 我记得那⼀刻的确切瞬间,当我意识到从那时起我的⼀⽣中有很⼤⼀部分将被⽤来寻⾃⼰程序中的错误”。
我们被认为只是使问题消失。 真正的挑战是了解系统的实际⼯作原理。
问题1:好像监视整体程序还不够困难
⽆论您是逐步将单⽚应⽤程序分解为微服务,还是从头开始构建新系统,现在都需要监视更多服务。 这些都很可能:
–使⽤不同的技术/语⾔
–住在其他机器/容器上
–有⾃⼰的版本控制
关键是要进⾏明智的监控,系统会变得⾼度分散,并且对集中式监控和⽇志记录的需求也越来越强,这样才能更好地了解正在发⽣的事情。
例如,在最近的“ 中描述的⼀种情况是不良版本,需要回滚。 通常,对于整料来说,这是⼀个简单的过程。 但是……我们现在有微服务。因此,我们需要确定哪些服务需要回滚,回滚对其他服务的影响是什么,或者也许我们只需要增加⼀些容量,但是这可能会将问题推到下⼀个服务排队。
要点1:如果您认为监视整体架构⾮常困难,那么使⽤微服务则要困难10倍,并且需要在前期计划上进⾏更⼤的投资。
问题2:⽇志记录在服务之间分布
⽇志⽇志⽇志。 服务器每天都会⽣成GB的⾮结构化⽂本。 相当于IT排放的碳,以硬盘溢出和疯狂的Splunk账单/ ELK存储成本的形式出现。 顺便说⼀句,如果您正在研究Splunk或ELK,则应该查看我们最新的电⼦书:《 Splunk与ELK: 。
使⽤整体式体系结构,您的⽇志可能已经分散在不同的位置,因为即使采⽤整体式⼼态,您也可能必须使⽤⼀些可能记录到不同位置的不同层。 使⽤微服务–您的⽇志会进⼀步细分。 现在,在调查与某个⽤户事务相关的场景时,您必须从所有可能通过的服务中提取所有不同的⽇志,以了解问题所在。
在塔基⽪,我们的团队通过在塔基⽪上使⽤来解决此问题。 对于来⾃⽣产JVM的所有⽇志错误和警告,我们将智能链接注⼊到⽇志中以进⾏事件分析。 包括它的完整堆栈跟踪和每帧的变量状态,即使它分布在许多服务/机器之间。
要点2:微服务就是将事物分解为单个组件。 副作⽤是,ops程序和监视也正在破坏每种服务,并失去了整个系统的功能。 这⾥的挑战是使⽤适当的⼯具将这些部件集中起来。
问题3:由⼀项服务引起的问题可能会在其他地⽅引起⿇烦
如果您跟踪特定服务中的某个断掉的交易,则不能保证⼀定要归咎于您所寻的同⼀服务。 假设您在服务之间具有某种消息传递机制,例如RabbitMQ,ActiveMQ,或者您正在使⽤Akka。
即使服务的⾏为符合预期,也可能会出现⼏种可能的情况:
–收到的输⼊是错误的,然后您需要了解是什么原因导致先前的服务不当
–结果的接收者返回了⼀些意外的响应,然后您需要了解下⼀个服务的⾏为
–这些依赖关系⽐1:1更复杂的可能性很⾼的场景呢? 还是有不⽌⼀种服务可以解决该问题?
⽆论问题是什么,微服务的第⼀步都是要了解从哪⾥开始寻答案。 数据分散在各处,甚⾄可能根本不在⽇志和仪表板指标之内。
总结#3:有了整体,您通常会知道您正在寻正确的⽅向,⽽微服务使您很难理解问题的根源以及应该从何处获取数据。
问题4:出问题的根本原因
好吧,让我们继续进⾏调查。 现在的出发点是,我们已经确定了有问题的服务,提取了要提取的所有数据,从⽇志中收集了跟踪信息和⼀些变量值。 如果您拥有APM(例如我们和也写过的New Relic,AppDynamics或Dynatrace),您可能还会获得⼀些⽅法处理时间过长的数据/对问题的严重性进⾏⼀些基本评估。
微服务在哪里但是……那……实际的问题是什么? 真正的根本原因? 实际被破坏的代码。
在⼤多数情况下,您希望从⽇志中获取的可变数据的前⼏位不会移动针头。 它们通常会引出下⼀个线索,这要求您发现更多的内幕魔术,并添加另⼀个或多或两个受⼈欢迎的对数语句。 部署更改,希望问题不再发⽣,因为……有时仅添加⽇志记录语句似乎可以解决问题。 某种有害的逆墨菲定律。 那好吧。
要点4:当微服务错误的根本原因跨越多个服务时,⾄关重要的是要有⼀个集中的根本原因检测⼯具。 如果您使⽤的是Java /其他JVM语⾔,请务必查看我们在 。
Takipi的错误分析仪表板–变量值覆盖堆栈中每⼀帧的实际代码 –
问题5:版本管理和服务之间的循环依赖关系
在这⾥,我们要强调的“持续讨论”播客中提到的另⼀个问题是,从典型的整体架构中的层模型变为具有微服务的图模型。
这⾥可能发⽣的两个问题与检查依赖关系有关。
1.如果您的服务之间存在依赖关系的循环,则当某个事务可能陷⼊循环时,您很容易遭受分布式堆栈溢出错误的影响。
2.如果两个服务共享⼀个依赖性,并且您以可能影响其他服务的⽅式更新了该服务的API,则您需要⼀次更新所有三个。 这就提出了类似的问题,您应该先更新哪个? 以及如何使之安全过渡?
更多服务意味着每种服务的发布周期都不同,这增加了这种复杂性。 在⼀个版本中出现问题并在较新版本中出现问题时,重现问题将⾮常困难。
要点5:在微服务架构中,您更容易受到依赖关系问题引起的错误的影响。
最后的想法
调试⽴即使您进⼊解决问题的思路,这从字⾯上看是调试⼀词的直接含义。 当您考虑到系统的上下⽂来考虑它时,除了临时解决问题之外,还有很多其他功能。 这是关于了解系统的整体,如何使之滴答作响,以及事情的真相与希望的样⼦。
最重要的是,所有关于您使⽤的⼯具和您使⽤的⼯作流程的信息。 这正是我们在构建 ,解决这些确切类型的问题以及将应⽤程序⽇志的世界颠倒过来⾯向⽣产应⽤程序当前状态时所想到的。
Java开发⼈员? Takipi替代了⽣产JVM中的⽇志记录,并让您在所有已记录的错误,警告和异常之后查看源代码,调⽤堆栈和变量状态–
⽣产环境微服务部署
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论