孤立服务:(微)服务架构的反面

在去年的莫斯科DevOpsDays会议上 Banki.ru门户网站的运营总监Andrei Nikolsky谈到了孤儿服务:如何识别基础设施中的孤儿,什么是不良的孤儿服务,如何处理孤儿以及如何在无济于事的情况下如何做。

剪切后是报告的文本版本。


大家好! 我的名字叫Andrey,我在Banki.ru负责业务。

我们有很棒的服务,这些是整体服务,有更经典的服务,有很小的服务。 用我的工农术语来说,我说的是,如果服务既简单又小,那么它就是微服务;如果它不是非常简单又不小,那它就是服务。

服务专家


我将快速介绍服务的优势。



首先是扩展。 您可以快速在服务上做些事情并开始生产。 您已经到达流量,已经克隆了服务。 您仍然有流量,仍然可以克隆并使用它。 这是一个很好的奖励,并且原则上,当我们开始时,它被认为是我们中最重要的,为什么我们要做所有这一切。



其次,隔离开发,当您有多个开发团队时,每个团队中都有几个不同的开发人员,并且每个团队都可以享受某种服务。

团队之间存在细微差别。 开发人员是不同的。 例如,还有人雪花 。 我第一次见到Maxim Dorofeev。 有时人们在某些团队中有雪花,而有些则没有。 这使得公司中使用的不同服务有些不平衡。



看图片:他是一个很好的开发人员,他有大手,可以做很多事情。 主要问题是这些手从何而来。



服务使使用更适合不同任务的不同编程语言成为可能。 Go上的某些服务,Erlang上的某些服务,Ruby上的某些服务,PHP上的一些服务,Python上的一些服务。 通常,您可以大范围地转身。 这里也有细微差别。



面向服务的体系结构主要与devop有关。 也就是说,如果您没有自动化,则没有部署过程,如果您用手进行配置,那么您的配置可以从一个服务实例更改为一个实例,而您必须去那里做某事,那么您就陷入了困境。

例如,您有20项服务,您需要动手部署,有20个控制台,并同时像忍者一样按下“ enter”。 这不是很好。

如果您在测试后拥有服务(当然,如果有测试的话),并且还需要用一个文件来完成它以便在生产中运行,那么对于您来说,我也有个坏消息。

如果您依赖亚马逊的特定服务并在俄罗斯工作,那么两个月前,您还遇到了“一切都在燃烧,我很好,一切都很棒。”



我们将Ansible用于部署自动化,将Puppet用于融合,将Bamboo用于部署自动化,将Confluence用某种方式来描述它。

我不会对此进行详细介绍,因为该报告更多地是关于交互的实践,而不是技术实施。



例如,我们遇到的问题是服务器上的Puppet可以与Ruby 2一起使用,并且某些应用程序是在Ruby 1.8下编写的,但是它们一起无法使用。 发生了某种类型的干扰。 而且,当您需要在同一台机器上保留多个版本的Ruby时,通常会遇到问题。

例如,我们为每个开发人员提供一个平台,在该平台上,我们拥有几乎所有东西,可以开发的所有服务,从而使他拥有隔离的环境,他可以按需分解并构建它。

碰巧您需要某种经过特殊编译的程序包,并对该程序包提供支持。 这足够艰难。 我听了一份报告,其中docker映像重45 GB。 当然,在Linux中,它更简单,那里的所有内容都较小,但是无论如何,这里没有足够的空间。

好吧,当您有一个项目取决于一个版本的库,而另一个版本在不同版本上的项目,而一个库根本没有放在一起时,就会有冲突的依赖关系。



我们有PHP 5.6中的站点和服务,我们为它们感到羞耻,但是该怎么做。 这是我们的一个站点。 PHP 7中有站点和服务,还有更多,我们并不为它们感到羞耻。 每个开发人员都有自己的基地,在那里他开心地看到了。

如果您使用一种语言在公司中编写代码,那么每个开发人员要使用三个虚拟机-听起来很正常。 如果您使用不同的编程语言,那么情况会变得更糟。



您在此拥有站点和服务,在此之上,还有另一个用于Go的平台,一个用于Ruby的平台,另一个在侧面的Redis。 结果,所有这些都变成了一个广阔的支持领域,而与此同时,其中一些可能会中断。



因此,我们使用不同的框架替换了编程语言的包子,因为PHP中的框架完全不同,它们具有不同的功能,不同的社区,不同的支持。 您可以编写服务,以便为它做好准备。

每个服务都有自己的团队。




我们的主要优势体现在每一个部门都有自己的团队,而这些优势已经在几年中得以体现。 这对于大型项目很方便,您可以节省文档时间,管理人员非常了解他们的项目。

来自支持人员的任务可以完美地抛出。 例如,保险服务出现故障。 保险团队立即进行维修。

新功能会很快出现,因为当您拥有一项原子服务时,您可以快速将某些内容插入其中。

而且,当您中断服务时,这不可避免地发生了,您并没有伤害到其他人的服务,并且其他团队的开发人员没有求助于您,他们也没有说:“噢,不要那样做。



一如既往,有细微差别。 我们拥有稳定的团队,管理人员已牢牢钉在团队中。 有明确的文件,管理人员会密切监视这一切。 每个有经理的团队都有数项服务,并且有特定的权限。

如果团队是浮动的(有时也与我们一起使用),则有一个很好的方法称为星图。



您有服务和人员的列表。 星号表示某人是这项服务的专家,书意味着某人正在学习这项服务。 人类的任务是为星号换一本小书。 如果对服务没有写任何东西,那么问题就开始了,我将继续谈论。

孤儿服务如何出现?




使基础设施中的服务成为孤儿的第一个问题(第一种方法)是裁员。 在评估任务之前,有什么事情发生过吗? 有时会发生最后期限很紧的情况,并且根本没有足够的时间来编写文档。 “我们必须将服务移交给生产,然后将其添加。”

如果团队很小,那么碰巧其中只有一名开发人员负责编写所有内容,其余人员则处于编写之中。 “我写了基本架构,您给了我接口。” 然后,例如,经理离开了。 在此期间,当经理离开后,还没有任命新经理时,开发人员自己决定服务在哪里移动,那里发生了什么。 正如我们所知(让我们回过几张幻灯片),在一些团队中,人们雪花纷飞,有时是雪花雪花。 然后他辞职了,我们得到了一个服务孤儿。



同时,来自支持和业务的任务不会消失,它们会积压在待办事项中。 如果在服务开发期间出现任何体系结构错误,则这些错误也将解决在积压中。 服务正在慢慢降级。

如何识别孤儿?


该列表很好地描述了这种情况。 谁从基础设施中学到了什么?



关于已记录的变通办法:有一项服务,通常来说,它可以工作,它有两页的手册,介绍如何使用它,但没人知道它如何在内部工作。

或者,例如,存在某种链接缩短器。 例如,我们现在在不同的服务中将三个链接缩短器用于不同的目的。 这些就是后果。



现在我将成为证据的队长。 需要做什么? 首先,您需要将服务转移到另一个经理,另一个团队。 如果您的团队负责人还没有辞职,那么在另一个团队中,当您了解服务就像一个孤儿时,您需要包括一个至少了解他的东西的人。

最主要的是:您必须具有手写的输血程序。 在我们的情况下,我通常会遵循此步骤,因为我需要这样做。 经理们需要迅速地做到这一点,后来对他的影响对他们而言并不那么重要。



创建孤儿的下一种方法是“让我们外包,它将更快,然后我们将其转移给团队。” 显然,每个人在队列中都有一些计划。 通常,业务客户认为外包商将与公司的技术部门一样。 尽管他们的动机不同。 外包有奇怪的技术解决方案和奇怪的算法解决方案。



例如,我们提供了一项服务,在该服务中Sphinx出现在各种意外的地方。 稍后再告诉您我该怎么做。

外包商具有自写的框架。 这只是来自上一个项目的复制粘贴的裸PHP,您可以在其中找到所有内容。 当您需要使用某些复杂的Bash脚本更改某些文件中的几行时,部署脚本中的拐杖却大打t,而这些部署脚本则由某些第三个脚本调用。 结果,您更改了部署系统,选择其他选项,跳了一下,您的服务无法正常工作。 因为在不同文件夹之间还有8个链接。 或者碰巧有一千条记录起作用,但是十万条记录消失了。

我将继续担任队长。 从外包接受服务是必需的过程。 谁曾发生过外包商的服务到达,但任何地方都不接受的情况? 当然,这并不像服务孤儿那样受欢迎,但是仍然如此。



必须检查该服务,必须检查该服务,必须更改密码。 我们遇到了一个情况,当服务被扔给我们时,直接在代码中写入了管理面板“如果login =='admin'&& password =='admin'...”。 我们坐下来思考,人们在2018年写下这个吗?

测试存储量也是必须的。 您甚至需要在生产环境中启动此服务之前,还要查看十万条记录上将发生的情况。



发送服务进行修订不应该感到羞耻。 当您说:“我们将不接受此服务时,我们有20项任务,执行这些任务,然后我们将接受”,这是正常现象。 良心不应因您替代经理或企业花钱而受到伤害。 然后,企业将花费更多。

我们有一个案例,当我们决定进行外包试点时。



它按时交付,这是唯一的质量标准。 因此,他们做了另一个试点项目,甚至根本没有试点项目。 他们接受了这些服务,他们以管理方式说,这是您的代码,这是团队,这是您的经理。 服务确实已经开始盈利。 而且,实际上,他们仍然是孤儿,没有人了解他们的工作方式,管理人员以各种可能的方式拒绝了他们的任务。



还有一个很好的概念-党派发展。 通常,一个部门是市场营销部门时,他们要检验假设,并订购整个服务外包。 交通开始涌向他,他们关闭文件,与承包商签约,开始运作,并说:“伙计,我们在这里有服务,已经有交通,给我们带来了金钱,让我们接受。” 我们是:“ Oppa,是这样。”



获得孤儿服务的另一种方法:当某个团队突然被加载时,管理人员说:“让我们将这个团队的服务转移给另一个团队,它的负载就更少了。” 然后,我们将转移到第三小组,并更换经理。 最后,我们又有了一个孤儿。

孤儿有什么问题?




谁知道呢,这是瓦萨(Wasa)在瑞典升起的那艘船,以发射后5分钟沉没而闻名。 顺便说一句,瑞典国王没有为此处决任何人。 它是由两代无法建造这种船的工程师建造的。 自然效果。

顺便说一句,这艘船可能沉没得更厉害,例如,当国王在暴风雨中把它骑到某个地方时。 因此,他马上就淹死了,据阿贾伊尔(Ajail)说,尽早失败是件好事。

如果我们尽早失败,通常不会有任何问题。 例如,在接受期间,他们发送了修订。 如果我们已经生产失败了,那么当我们把钱投入时,那就有问题了。 结果,在业务中称为后果。

为什么选择危险的孤儿服务:

  • 服务可能会突然中断。
  • 服务已修复很长时间或根本无法修复。
  • 安全问题。
  • 改进和更新方面的问题。
  • 如果一项重要的服务出现故障,公司的声誉就会受到损害。

孤儿服务怎么办?




再次,该怎么办。 首先,应该有文件。 在Banki.ru的7年间,我被告知测试人员不应该对开发人员说一句话,操作也不应该对每个人都说一句话。 有必要检查。



其次,有必要编写交互方案,因为碰巧,没有被很好地接受的服务包含没有人谈论的依赖项。 例如,开发人员将服务放在其某些Yandex.Maps或Dadata的密钥上。 您已经超出了免费限制,一切都坏了,并且您根本不知道发生了什么。 应该描述所有此类耙:服务使用Dadata,Sms等。



第三,处理技术债务。 当您拐杖或接受服务并说需要做某事时,您需要确保他们做了。 因为那样可能会导致小孔不是那么小,而您掉在那里。

关于建筑任务,我们有一个关于狮身人面像的故事。 在其中一项服务中,使用了Sphinx输入列表。 只是一个分页列表,但每晚都会重新索引。 它由两个索引构成:一个索引每晚都有大索引,还有一个小的索引被拧紧。 每天都有50%的概率爆炸或不爆炸,在计算期间,索引在跳动,新闻在主页上停止更新。 最初是5分钟,在重新索引索引后,索引又增长了,在某个时候它开始重新索引40分钟。 当我们将其删除时,我们松了一口气,因为很显然,还会再花一点时间,并且我们的索引将全时重新索引。 这将是我们门户网站的文件,八个小时没有消息-就是这样,业务已经站起来了。

孤儿服务的工作计划




实际上,这非常困难,因为devop与沟通有关。 我想与我的同事保持良好的关系,当你用头脑中的法规击败同事和经理时,他们对这样做的人可能会有矛盾的感觉。

除了所有这些要点外,还有另外一件重要的事情:对于部署程序的每个特定服务,每个特定部分,应由特定人员负责。 当没有人并且您必须吸引其他人来研究整个事情时,这将变得很困难。



如果所有这些都无济于事,并且服务孤儿仍然是一个孤儿,没有人愿意接受它,没有编写文档,被调用此服务的团队拒绝做某事,有一种简单的方法可以重做一切。

也就是说,您可以重新提出服务要求,并在更好的平台上更好地编写新服务,而无需使用怪异的技术解决方案。 并在战斗中迁移到它。



我们遇到了一种情况,当我们在Yii 1上使用该服务时,意识到我们无法进一步开发它,因为我们已经淘汰了可以在Yii 1上写得很好的开发人员。所有开发人员在第三Symfony上都写得很好。 怎么办 我们花了时间,分配了团队,分配了经理,重新编写了项目,并顺利地将流量切换到该项目。

之后,可以删除旧服务。 这是我最喜欢的过程,当您需要从配置管理系统中取出并清理一些服务,然后再去检查生产中的所有汽车都已还清,从而使开发人员没有痕迹时。 git中的存储库仍然存在。

我想谈论的就是这些,我已经准备好进行讨论,这个话题是整体的,很多话题都涉及其中。

在幻灯片上是关于您统一语言的事实。 一个例子是调整图片大小。 但是,真的有必要硬要一种语言吗? 因为很好地使用PHP调整图片的大小,所以您可以在Golang中真正做到这一点。

实际上,像所有做法一样,这不是必需的。 在某些情况下,甚至是不可取的。 但是,您需要了解,如果技术部门有50名员工,其中45名是PHP开发人员,另外3名是devops,他们可以执行Python,Ansible,Puppet之类的事情,而其中只有一位写过一些去维修图片的大小,然后当他离开时,检查就和他一起离开。 同时,您将需要寻找了解这种语言的特定于市场的开发人员,尤其是在这种语言很少的情况下。 也就是说,从组织的角度来看,这是有问题的。 从开发人员的角度来看,您不仅需要克隆一些用于部署服务的现成的剧本,而且还必须再次编写它们。

现在,我们在Node.js上看到了该服务,对于每个使用单独语言的开发人员来说,它只是一个平台。 但是我们坐下来以为这场比赛是值得的。 也就是说,这里的问题是坐下来思考。

您如何监控服务? 您如何收集和跟踪日志?

我们在Elasticsearch中收集日志并将其放入Kibana,并且根据生产或测试环境,在那里使用了不同的收集器。我不再记得伐木工人的某个地方,某个地方的某个地方。在某些服务中仍有某些地方,我们会将Telegraf和bullet分别放在其他地方。

如何在一个环境中与Puppet和Ansible一起生活?

实际上,我们现在有两个环境,一个是Puppet,另一个是Ansible。我们正在努力使它们杂交。 Ansible是初始设置的好环境,Puppet对于初始设置是不好的事情,因为它需要双手直接与垫板协同工作,并且Puppet提供了配置的融合。这意味着该站点本身是最新的,并且要使已集成化的机器保持最新,您需要以一定的频率不断地对其进行操作。这是有区别的。

您如何保持兼容性?您在Ansible和Puppet中都有配置吗?

这是我们最大的痛苦,我们保持双手的兼容性,并认为现在好像要从所有这些地方移开。事实证明,Puppet在此处滚动包并支持某些链接,而例如Ansible则在此处滚动代码并驱动新的应用程序配置。

该演讲是关于不同版本的Ruby的。有什么解决办法?

我们在一个地方面对这个问题,我们必须时刻牢记这一点。我们只是关闭了与Ruby兼容的与应用程序不兼容的部分,并将其分开。

今年,DevOpsDays莫斯科会议将于12月7日在Technopolis举行。在11月11日之前,我们将接受报告申请。如果您想发言,请我们发送电子邮件

参加者报名已开放,请加入!

Source: https://habr.com/ru/post/zh-CN471146/


All Articles