我们如何在Kubernetes中制作云FaaS并在Tinkoff Hackathon上获胜


从去年开始,骇客马拉松开始在我们公司举办。 第一次这样的竞赛非常成功,我们在文章中对此进行了描述。 第二次黑客马拉松于2019年2月举行,同样取得了成功。 组织者最近了后者的目标。

参与者被赋予了一项相当有趣的任务,可以完全自由地选择要实施的技术堆栈。 有必要实现一个决策平台,以方便客户评分功能的部署,这些功能可以在快速的应用程序流程中工作,承受沉重的负担,并且系统本身易于扩展。

正如我们在参与者项目的最终演示中所看到的那样,这项任务并非易事,可以通过多种方式解决。 这次黑客马拉松共有6人团队,每人5个人,所有参与者都有不错的项目,但是我们的平台竟然是最具竞争力的平台。 我们有一个非常有趣的项目,在本文中我想谈一谈。

我们的解决方案是Kubernetes内部基于无服务器架构的平台,可减少将新功能投入生产所需的时间。 它使分析人员可以在对他们方便的环境中编写代码,并将其部署到产品中,而无需工程师和开发人员的参与。

什么是计分?


像许多现代公司一样,Tinkoff.ru也拥有客户评分。 评分是基于数据分析统计方法的客户评估系统。

例如,客户要求我们给他贷款或在我们这里开设IP帐户。 如果我们计划给他贷款,那么您需要评估他的偿付能力,并且如果该帐户是私募股权,那么您需要确保客户不会进行欺诈性交易。

这些决策基于数学模型,该模型同时分析应用程序本身的数据和我们的存储数据。 除了评分以外,服务的工作中也可以使用类似的统计方法来为我们的客户生成有关新产品的个别建议。

这种评估的方法可以接收各种输入数据。 在某个时候,我们可以向输入中添加一个新参数,根据对历史数据的分析,该参数将增加服务使用的转换。

我们存储了大量有关客户关系的数据,并且这些信息的数量正在不断增长。 为了使评分有效,数据处理还需要规则(或数学模型),这些规则使您可以快速决定谁批准该应用程序,谁拒绝该应用程序,以及谁可以提供一些产品来评估其潜在利益。

对于此任务,我们已经使用了专用的IBM WebSphere ILOG JRules BRMS决策系统 ,该系统基于分析师,技术人员和开发人员设置的规则,决定是否批准特定的银行产品给客户或拒绝。

市场上有许多现成的解决方案,包括评分模型和决策系统本身。 我们在公司中使用这些系统之一。 但是随着业务的发展,多元化,客户数量和产品数量都在增加,随之而来的是如何改善现有决策流程的想法。 当然,使用现有系统的人们对如何使其更简单,更好,更方便有很多想法,但是有时来自外部的想法很有用。 为了收集合理的想法,组织了一次新的黑客马拉松。

工作任务


黑客马拉松于2月23日举行。 向参加者提供了一项战斗任务:开发一种决策系统,该系统应该符合许多条件。

我们被告知现有系统如何运行,在运行过程中会遇到什么困难,以及正在开发的平台应遵循的业务目标。 系统应具有快速制定规则的上市时间,以使分析师的工作代码尽快投入生产。 对于传入的应用程序流,决策时间应趋于最短。 此外,如果我们批准了其他公司产品,并且客户有潜在的兴趣,那么开发的系统应该能够交叉销售,以便为客户提供购买其他公司产品的机会。

显然,在一夜之内不可能编写一个肯定会投入生产的易于发布的项目,而且整个系统很难覆盖,因此我们被要求至少实施其中的一部分。 建立了原型必须满足的许多要求。 可以尝试涵盖所有需求,并详细制定开发平台的各个部分。

至于技术,那么所有参与者都拥有完全的选择自由。 可以使用任何概念和技术:数据流,机器学习,事件源,大数据等。

我们的决定


在进行了小型头脑风暴会议之后,我们认为FaaS解决方案将是完成任务的理想选择。

对于此解决方案,有必要找到一个合适的无服务器框架来实现已开发的决策系统的规则。 由于Kubernetes在Tinkoff的基础架构管理中得到了积极的应用,因此我们研究了基于它的几种现成的解决方案,我将在后面进一步讨论。

为了找到最有效的解决方案,我们从用户的角度对开发的产品进行了研究。 我们系统的主要用户是参与规则制定的分析师。 必须将规则部署到服务器,或者像我们一样,部署到云以进行后续决策。 从分析师的角度来看,工作流程如下:

  1. 分析人员根据存储库中的数据编写脚本,规则或ML模型。 作为黑客马拉松的一部分,我们决定使用Mongodb,但是在这里存储系统的选择并不重要。
  2. 在根据历史数据测试开发的规则之后,分析师将其代码倒入管理面板中。
  3. 为了确保版本控制,所有代码都将转到Git存储库。
  4. 通过管理面板,可以将代码作为独立的无服务器功能模块部署在云中。

来自客户的源数据应经过专门的扩展服务,该服务旨在利用存储库中的数据来丰富初始请求。 重要的是,以与单个存储库(分析人员在制定规则时从中获取数据)一起使用的方式实施此服务,以维护统一的数据结构。

甚至在黑客马拉松之前,我们就决定要使用的无服务器框架。 市场上有很多实现此方法的技术。 最受欢迎的Kubernetes架构解决方案是Fission,Open FaaS和Kubeless。 甚至有一篇很好的文章,对它们进行了描述和比较分析

在权衡了所有利弊之后,我们选择了Fission 。 该无服务器框架非常易于管理,可以满足任务要求。

要使用Fission,您需要了解两个基本概念:功能和环境。 函数(function)是用裂变环境(environment)的一种语言编写的一段代码。 在此框架的框架内实现的环境列表包括Python,JS,Go,JVM和许多其他流行的语言和技术。

Fission还可以执行功能,分为几个文件,这些文件已预打包在存档中。 Kubernetes集群中的Fission操作由专用Pod提供,这些Pod由框架本身管理。 要与群集Pod交互,必须为每个功能分配一个路由,如果有POST请求,则可以向其中传递GET参数或请求正文。

结果,我们计划获得一种解决方案,该解决方案允许分析师在无需工程师和开发人员参与的情况下部署开发的规则脚本。 所描述的方法还消除了开发人员用另一种语言重写分析师代码的需要。 例如,对于我们当前使用的决策系统,我们必须使用狭义技术和语言编写规则,这些规则和语言的范围非常有限,并且由于所有银行规则草案都部署在单个环境中,因此还强烈依赖于应用程序服务器。 结果,为了部署新规则,必须释放整个系统。

在我们提出的解决方案中,无需发布规则,单击按钮即可轻松部署代码。 而且,Kubernetes中的基础架构管理使您无需考虑负载和扩展,此类问题可以立即解决。 单个数据仓库的使用消除了将实时数据与历史数据进行比较的需求,从而简化了分析师的工作。

我们得到了什么


自从我们以现成的解决方案来到hackathon时(幻想中),我们只需要将所有想法转换成代码行即可。

任何黑客马拉松成功的关键是准备和精心制定的计划。 因此,首先,我们决定了系统架构将包含哪些模块以及将使用哪些技术。

我们项目的架构如下:


该图显示了两个入口点,一个分析师(我们系统的主要用户)和一个客户。

工作流程的结构如下。 分析人员为其模型开发规则功能和数据丰富功能,将其代码保存在Git存储库中,并通过管理员的应用程序将其模型部署到云中。 考虑如何调用扩展功能,并根据客户端的传入请求做出决定:

  1. 客户在站点上填写表格将其请求发送给控制器。 应用程序到达系统的输入,必须根据该输入做出决定,并以其原始形式记录在数据库中。
  2. 接下来,如有必要,将发送原始请求进行浓缩。 您可以用来自外部服务和存储库的数据补充初始请求。 接收到的丰富查询也存储在数据库中。
  3. 启动分析功能,该功能在输入处接收丰富的请求并做出决定,该决定也记录在存储库中。

作为系统中的存储,我们决定使用MongoDB来考虑以JSON文档的形式记录数据的存储,因为扩展服务(包括初始请求)通过REST控制器聚合了所有数据。

因此,我们有一天来实施该平台。 我们非常成功地分配了角色,每个团队成员在我们的项目中都有自己的职责范围:

  1. 分析人员工作的前端管理面板,通过该面板,他可以从书面脚本的版本控制系统中下载规则,选择用于丰富输入数据的选项,并在线编辑规则脚本。
  2. 后端管理面板,包括用于前端和VCS集成的REST API。
  3. 在Google Cloud中建立基础架构,并开发源数据丰富服务。
  4. 用于将管理应用程序与无服务器框架集成以用于规则的后续部署的模块。
  5. 用于测试整个系统运行状况的规则脚本,以及用于最终演示的传入应用程序分析的聚合(做出的决定)。

让我们按顺序开始。

我们的前端是使用银行UI工具包以Angular 7编写的。 管理面板的最终版本如下:


由于时间不多,因此我们尝试仅实现关键功能。 要在Kubernetes集群中部署功能,必须选择一个事件(您需要在云中为其部署规则的服务)并编码实现决策逻辑的功能代码。 对于所选服务规则的每次部署,我们都编写了此事件的日志。 在管理面板中,您可以查看所有事件的日志。

所有功能代码都存储在远程Git存储库中,该存储库也必须在管理面板中进行设置。 为了对代码进行版本控制,所有功能都存储在存储库的不同分支中。 管理面板还提供了对书面脚本进行调整的功能,以便在将功能部署到生产环境之前,您不仅可以检查书面代码,还可以进行必要的更改。


除了规则的功能外,我们还意识到了使用扩展功能逐步丰富源数据的可能性,该功能的代码还包括脚本,您可以在脚本中访问数据仓库,调用第三方服务并执行初步计算。 为了演示我们的解决方案,我们计算了离开应用程序的客户端的星座,并使用第三方REST服务确定了其移动运营商。

平台后端是用Java编写的,并作为Spring Boot应用程序实现。 为了存储管理数据,我们最初计划使用Postgres,但作为黑客马拉松的一部分,我们决定将自己限制为简单的H2,以节省时间。 在后端,实现了与Bitbucket的集成,以对查询增强功能和规则脚本进行版本控制。 为了与远程Git存储库集成,使用了JGit库 ,它是CLI命令的一种包装,允许您使用方便的程序界面执行任何git指令。 因此,我们有两个单独的存储库,分别用于扩充功能和规则,所有脚本都布置在目录中。 通过UI,可以选择任意存储库分支的最后一个提交脚本。 通过管理面板更改代码时,会在远程存储库中创建修改后的代码的提交。

为了实现我们的想法,我们需要合适的基础架构。 我们决定在云中部署我们的Kubernetes集群。 我们的选择是Google Cloud Platform。 Fless无服务器框架已安装在Kubernetes集群上,我们将其部署到了Gcloud。 最初,源数据扩展服务是由包装在k8s集群内Pod中的单独Java应用程序实现的。 但是,在黑客马拉松中期对我​​们的项目进行了初步演示之后,建议我们使Enrichment服务更加灵活,以便有机会选择如何丰富传入应用程序的原始数据。 我们别无选择,只能使扩充服务也变得无服务器。

要与Fission一起使用,我们使用了Fission CLI,该CLI必须安装在Kubernetes CLI的顶部。 在k8s集群中部署功能非常简单,如果需要在集群外部进行访问,则只需为该功能分配内部路由和入口即可允许传入流量。 部署一项功能通常不会超过10秒。

项目的最终展示并总结


为了演示我们系统的操作,我们在远程服务器上放置了一个简单的表格,您可以在该表格上申请银行的一种产品。 对于该请求,您必须输入姓名缩写,出生日期和电话号码。

来自客户端表单的数据进入控制器,控制器同时发送所有可用规则的​​应用程序,根据给定条件预丰富数据,并将其存储在公共存储中。 总体而言,我们为传入的应用程序部署了三个决策功能,并为4个数据丰富服务部署了功能。 发送申请后,客户收到了我们的解决方案:


除了拒绝或批准外,客户还收到了我们同时发送要求的其他产品清单。 因此,我们在平台上展示了​​交叉销售的可能性。

总共提供了3种发明的银行产品:
  • 信用额
  • 玩具类
  • 按揭

在每个演示过程中,我们为每个服务部署了准备好的功能和扩充脚本。

每个规则都需要自己的一组输入数据。 因此,为批准抵押,我们计算了客户的十二生肖,并将其与农历的逻辑相关联。 为了批准该玩具,我们检查了客户是否已达到法定年龄,并发放了一笔贷款,然后向外部开放服务部门发送了一个请求,以确定移动运营商,并对此做出了决定。

我们试图使我们的演示变得有趣和互动,在场的每个人都可以进入我们的表格,并向我们检查我们提供的虚构服务。 在演示的最后,我们演示了收到的应用程序的分析,并显示了有多少人使用我们的服务,批准次数,拒绝次数。

为了在线收集分析数据,我们还部署了Metabase开源BI工具并将其固定在我们的存储库中。 Metabase允许您基于我们感兴趣的数据来构建带有分析的屏幕,您只需要注册一个数据库连接,选择表(在我们的例子中为数据收集,因为我们使用的是MongoDB),并指明我们感兴趣的字段。

结果,我们获得了一个好的决策平台原型,在演示中,每个听众都可以亲自测试其性能。 尽管其他团队面对激烈的竞争,但有趣的解决方案,现成的原型和成功的演示使我们获胜。 我确信在每个团队的项目上,您也可以写一篇有趣的文章。

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


All Articles