我们如何在 Kubernetes 中打造云 FaaS 并赢得 Tinkoff 黑客马拉松

我们如何在 Kubernetes 中打造云 FaaS 并赢得 Tinkoff 黑客马拉松
从去年开始,我们公司开始组织黑客马拉松。 第一届这样的比赛非常成功,我们在 文章。 第二届黑客马拉松于 2019 年 XNUMX 月举行,同样取得了成功。 关于不久前举办后者的目标 组织者。

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

这项任务并不简单,可以通过多种方式解决,正如我们在演示参与者项目的最终演示时所确信的那样。 这次黑客马拉松有6个团队,每组5人,所有参与者都有很好的项目,但我们的平台是最具竞争力的。 我们有一个非常有趣的项目,我想在这篇文章中讨论它。

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

什么是得分

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

例如,客户向我们请求向他发放贷款,或在我们这里开设个人企业家账户。 如果我们打算向他发放贷款,那么我们需要评估他的偿付能力,如果该账户是个体工商户,那么我们需要确保客户不会进行欺诈交易。

做出此类决策的基础是数学模型,该模型可以分析应用程序本身的数据和我们存储中的数据。 除了评分之外,类似的统计方法也可以用于为我们的客户生成新产品的个性化推荐。

这种评估方法可以接受多种输入数据。 在某些时候,我们可以在输入中添加一个新参数,根据历史数据的分析结果,这将提高使用服务的转化率。

我们拥有大量有关客户关系的数据,并且这些信息的数量正在不断增长。 为了进行评分,数据处理还需要规则(或数学模型),使您能够快速决定谁批准申请、拒绝谁以及向谁提供更多产品,从而评估他们的潜在兴趣。

对于手头的任务,我们已经使用了专门的决策系统 IBM WebSphere ILOG JRules BRMS,根据分析师、技术人员和开发人员制定的规则,决定是否批准或拒绝向客户提供特定的银行产品。

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

任务

黑客马拉松于 23 月 XNUMX 日举行。 参与者面临一项战斗任务:开发一个必须满足许多条件的决策系统。

我们被告知现有的系统如何运作,运行过程中会遇到哪些困难,以及开发的平台应该追求什么业务目标。 该系统必须具有快速的上市时间来开发规则,以便分析师的工作代码尽快投入生产。 而对于应用程序的传入流量,决策时间应该趋于最短。 此外,正在开发的系统必须具有交叉销售功能,以便客户有机会购买其他公司的产品(如果这些产品得到我们的批准并且客户有潜在兴趣)。

显然,不可能在一夜之间写出一个可以立即发布并投入生产的项目,并且覆盖整个系统也相当困难,因此我们被要求至少实现其中的一部分。 制定了原型必须满足的许多要求。 可以尝试既全面涵盖所有要求,又详细研究正在开发的平台的各个部分。

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

我们的方案

经过一番集思广益后,我们认为 FaaS 解决方案是完成该任务的理想选择。

对于这个解决方案,需要找到一个合适的Serverless框架来实现正在开发的决策系统的规则。 由于 Tinkoff 积极使用 Kubernetes 进行基础设施管理,因此我们研究了几个基于它的现成解决方案;稍后我将向您详细介绍。

为了找到最有效的解决方案,我们从用户的角度审视正在开发的产品。 我们系统的主要用户是参与规则开发的分析师。 规则必须部署到服务器,或者像我们的例子一样,部署在云端,以供后续决策。 从分析师的角度来看,工作流程如下所示:

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

来自客户端的初始数据必须通过专门的丰富服务,该服务旨在使用仓库中的数据丰富初始请求。 以这样的方式实现该服务非常重要,即它可以与单个存储库(分析师在开发规则时从中获取数据)一起工作以维护统一的数据结构。

甚至在黑客马拉松之前,我们就决定了要使用的无服务器框架。 如今,市场上有很多技术都实现了这种方法。 Kubernetes 架构中最流行的解决方案是 Fission、Open FaaS 和 Kubeless。 甚至还有 很好的文章,有描述和比较分析.

权衡了所有的利弊后,我们选择了 分裂。 这个无服务器框架非常易于管理并且满足任务的要求。

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

Fission 还能够执行分为多个文件的功能,并预先打包到存档中。 Fission 在 Kubernetes 集群中的运行是由专门的 Pod 来保证的,这些 Pod 由框架本身管理。 要与集群 Pod 交互,必须为每个函数分配自己的路由,并且您可以向其传递 GET 参数或请求正文(如果是 POST 请求)。

因此,我们计划获得一种解决方案,允许分析师在没有工程师和开发人员参与的情况下部署开发的规则脚本。 所描述的方法还消除了开发人员将分析代码重写为另一种语言的需要。 例如,我们现在使用的决策系统,需要用高度专业化的技术和语言来编写规则,其范围极其有限,而且对应用服务器也有很强的依赖性,因为所有汇票银行规则部署在单一环境中。 因此,要部署新规则就必须发布整个系统。

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

我们得到了什么

由于我们带着现成的解决方案(在我们的幻想中)来到黑客马拉松,我们所要做的就是将所有想法转化为代码行。

任何黑客马拉松成功的关键是准备和精心编写的计划。 因此,我们做的第一件事就是决定我们的系统架构将包含哪些模块以及我们将使用哪些技术。

我们项目的架构如下:

我们如何在 Kubernetes 中打造云 FaaS 并赢得 Tinkoff 黑客马拉松
该图显示了两个入口点:分析师(我们系统的主要用户)和客户。

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

  1. 客户在网站上填写表格并将其请求发送给控制者。 需要做出决策的应用程序进入系统输入并以其原始形式记录在数据库中。
  2. 接下来,如有必要,将发送原始请求以进行丰富。 您可以使用来自外部服务和存储的数据来补充初始请求。 生成的丰富查询也存储在数据库中。
  3. 分析函数启动,它将丰富的查询作为输入并生成解决方案,该解决方案也写入存储。

我们决定使用 MongoDB 作为我们系统中的存储,因为数据以 JSON 文档的形式面向文档存储,因为丰富服务(包括原始请求)通过 REST 控制器聚合了所有数据。

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

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

让我们开始为了。

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

我们如何在 Kubernetes 中打造云 FaaS 并赢得 Tinkoff 黑客马拉松
由于时间有限,我们尝试只实现关键功能。 在Kubernetes集群中部署某个功能,需要选择一个事件(需要在云端部署规则的服务)以及实现决策逻辑的功能代码。 对于所选服务的每次规则部署,我们都会编写此事件的日志。 在管理面板中您可以看到所有事件的日志。

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

我们如何在 Kubernetes 中打造云 FaaS 并赢得 Tinkoff 黑客马拉松
除了规则功能之外,我们还实现了使用Enrichment函数逐步丰富源数据的能力,其代码也是脚本,可以进入数据仓库,调用第三方服务并进行初步计算。 为了演示我们的解决方案,我们计算了留下请求的客户的星座,并使用第三方 REST 服务确定了他的移动运营商。

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

为了实现我们的想法,我们需要合适的基础设施。 我们决定在云中部署 Kubernetes 集群。 我们的选择是谷歌云平台。 Fission 无服务器框架安装在 Kubernetes 集群上,我们将其部署在 Gcloud 中。 最初,源数据丰富服务是作为包装在 k8s 集群内 Pod 中的单独 Java 应用程序实现的。 但在黑客马拉松中对我们的项目进行了初步演示后,建议我们使丰富服务更加灵活,以提供选择如何丰富传入应用程序的原始数据的机会。 我们别无选择,只能将丰富服务也变成无服务器。

为了使用 Fission,我们使用了 Fission CLI,它必须安装在 Kubernetes CLI 之上。 将功能部署到 k8s 集群非常简单;您只需为该功能分配一个内部路由和入口,以便在需要访问集群外部时允许传入流量。 部署一项功能通常不超过 10 秒。

项目的最终陈述和总结

为了演示我们的系统如何工作,我们在远程服务器上放置了一个简单的表格,您可以在其中提交银行产品之一的申请。 要提出请求,您必须输入姓名缩写、出生日期和电话号码。

来自客户端表单的数据发送到控制器,控制器同时发送对所有可用规则的​​请求,之前根据指定条件丰富了数据,并将它们保存在公共存储中。 总的来说,我们部署了三个对传入应用程序做出决策的功能和 4 个数据丰富服务。 提交申请后,客户收到了我们的决定:

我们如何在 Kubernetes 中打造云 FaaS 并赢得 Tinkoff 黑客马拉松
除了拒绝或批准之外,客户还收到了我们同时发送的其他产品和请求的清单。 这就是我们展示平台交叉销售可能性的方式。

总共有 3 种虚拟银行产品可用:

  • 信用。
  • 玩具
  • 按揭。

在演示过程中,我们为每个服务部署了准备好的函数和丰富脚本。

每个规则都需要自己的一组输入数据。 因此,为了批准抵押贷款,我们计算了客户的星座,并将其与农历的逻辑联系起来。 为了批准玩具,我们检查客户是否已达到成年年龄;为了发放贷款,我们向外部开放服务发送请求以确定蜂窝运营商,并做出决定。

我们试图让我们的演示变得有趣和互动,每个在场的人都可以进入我们的表格并检查我们虚构的服务对他们的可用性。 在演示的最后,我们演示了对收到的申请的分析,其中显示了有多少人使用我们的服务、批准和拒绝的数量。

为了在线收集分析结果,我们还部署了开源 BI 工具 元数据库 并将其拧到我们的存储单元上。 Metabase 允许您构建对我们感兴趣的数据进行分析的屏幕;您只需注册到数据库的连接,选择表(在我们的例子中,数据集合,因为我们使用 MongoDB),并指定我们感兴趣的字段。

这样我们就得到了一个很好的决策平台原型,并且在演示过程中,每个听众都可以亲自检查它的性能。 尽管来自其他团队的激烈竞争,有趣的解决方案、完成的原型和成功的演示使我们获胜。 我相信每个团队的项目也可以写一篇有趣的文章。

来源: habr.com

添加评论