作者:杨磊

青团社是国内领先的一站式灵敏用工招聘服务企业,灵敏用工职业的 Top1。青团社于 2013 年在杭州建立,事务已经掩盖全国,在职业深耕 10年。我的共享将分为以下三部分:

  • 青团社架构演进的进程
  • 青团社怎样完成云原生
  • 总结与展望

云原生架构的演进进程

2020年,咱们的技能架构比较单薄,存在较多问题。面对这些问题,团队开端了架构演进,存在的问题首要是以下多个方面。

青团社:亿级灵敏用工渠道的云原生架构实践

第一,运维才能和可观测性比较差,由于公司大部分都是事务研制人员,专业的 DBA 和运维都没有。

第二,在事务刚刚开端起步时,事务迭代速度十分快,每天都会有很频频的发布,线上常常由于发布导致一些稳定性的问题,作为渠道型公司连接 B 端和 C 端两端,对线上可用性要求十分高,但早期的架构规划也不太合理,所以许多时分运用是无法支撑高可用的。

第三,由于线上的资源布置不太合理,比较浪费资源,资源本钱较高。

第四,布置形式比较粗豪,日志、告警都没有,所以出了问题之后排查十分困难,研制人员一般需求很长时刻才能把这些问题弄清楚,呼应时刻比较长,信任大部分草创型公司在事务早期开展的阶段都存在这种问题。

那咱们怎样去应对这些挑战呢?答案便是运用云原生架构来重塑架构体系, 不断地对架构进行演进,选择适宜的技能栈,配合运用云的基础设施,来构建事务渠道,让体系抵达好的水准。

从下图中能够看到,青团社的事务架构演变遵从从单体架构到 SOA 架构再到微服务。基础架构物理机是没有的,团队从 2014 年开端就直接运用阿里云 ECS,在 2021 年开端容器化,终究抵达希望的云原生架构形状。

青团社:亿级灵敏用工渠道的云原生架构实践

云原生基金会官方对云原生的定义是 5 部分,第一是容器化,第二是不可变基础设施,第三个是声明式 API,然后是服务网格和微服务,其中微服务作为承载事务运用的核心,环绕这个,会有像调度编列、流量办理、可观测、DevOps 这些范畴的一些才能,这是技能架构要做的作业。

从技能角度看,云原生架构是根据云原生技能的一组架构原则和一些规划形式的组合,将运用中的非核心的事务逻辑剥离出去,然后下沉到云原生基础设施这一层来统一处理,这样事务开发人员只需求关心自己的事务开发,让咱们的事务运用变得更加轻量,高效。

青团社:亿级灵敏用工渠道的云原生架构实践

由于公司是 2013 年建立的,早期的事务十分简单,运维才能也比较差,所以单体架构是优选。经过四五年的开展,事务有了长足的前进,渠道的功用和模块都已经比较多了,因此,就升级到 Spring Cloud 微服务架构。其时用的是一套标准的用法,比方服务注册中心、装备中心用的是 Eureka,网关用的是 Spring Cloud Gateway。

青团社:亿级灵敏用工渠道的云原生架构实践

此刻,尽管完成了微服务架构,但也存在诸多问题,例如服务不稳定、排查功率低下、资源运用率低等。根据这些问题,开端做事务容器化改造。

首要,选用成熟的 K8s 渠道去做事务容器渠道,先处理布置与排查问题。一开端咱们选型的是阿里云容器服务 ACK Serverless 版,首要是看中了它开箱即用,不需求额定去保护,比较简单的长处。在运用的过程中,首要是先在开发侧去验证它,用了一段时刻到 2021 年的时分,就完成了线上的迁移。

之后选用阿里云 ACK 的技能底座去完成线上容器化改造的原因是,其时在用 Serverless 过程中呈现一些问题,比方调度比较慢等,在其时咱们是没有这些才能去处理的。改造之后,大概是 300多个微服务。此外,还涉及到一些基础架构的改造,比方服务注册中心,咱们原先用的是 Eureka,后来迁移到 MSE 的 Nacos 里,装备中心运用了 MSE Nacos,来提高功用和稳定性。

在可观测性和运用性的架构上,开端用阿里云运用实时监控服务 ARMS 的运用监控才能和 MSE 产品来对运用服务进行功用观测与流量管理,这些都是在 2021 年这一年去完成的。

2021 年 8 月,咱们将 Spring Cloud Gateway 进行了迁移,由于其时 Spring Cloud Gateway 的问题比较多,功用也比较差,所以就根据开源做了自己的 API 网关,再结合 MSE 的微服务套件,完成了流量办理。2022 年之后,开端做事务目标监控和稳定性建设这方面的作业。

青团社云原生架构实践

接下来是实践的部分,这张图是线上的布置图。

青团社:亿级灵敏用工渠道的云原生架构实践

前面这 4 个部分都是技能接入层,如 BGP 高防、WAF、BFF 等,首要供给基础的安全防护和路由转发功用。到了虚线这一部分是 K8s 集群,是根据 ACK 构建的容器运转渠道,咱们一切的事务容器都运转在 ACK 里边。

咱们能够看到,咱们运用了许多阿里云的中间件服务,比方 Kafka、RocketMQ。这些都是在运用 MSE 微服务引擎之后最新的一版架构,由于咱们人手有限,所以为了线上的服务稳定性和下降运维本钱,会直接用阿里云的这些云产品。 网关方面,微服务内部的东西向流量首要由微服务引擎 MSE 来做流量办理,它给咱们供给了一些才能,比方服务高雅上线下线,流量灰度,还有同可用区域这些布置才能。

接下来,咱们将从调度编列、流量办理、可观测3 个维度打开咱们的实践。

1. 云原生架构实践调度编列

青团社:亿级灵敏用工渠道的云原生架构实践

第一部分是调度编列方面,咱们有三个手段。首要是运用阿里云 ACK 作为技能底座来构建容器渠道,再配合资源阻隔的布置形式,确保多条事务线互不影响,由于咱们有两条不同的事务线,所以无论是在本钱核算仍是服务稳定性,都会做到资源阻隔。弹性弹性方面是经过一些弹性弹性战略获得本钱和稳定性之间的平衡,降本钱的一起不能损失稳定性。

接下来,经过两个事例阐述一下,第一是咱们怎样样用 ACK 来完成高效弹性布置。

青团社:亿级灵敏用工渠道的云原生架构实践

首要,在布置的时分是多可用区的,有杭州 H 区和 K 区,这是两个主可用区,一切的服务在布置的时分,在 K8s 的节点分隔上和调度战略上加一些符号,让它能够把事务负载给打散,这样一个服务有两个实例的话便是 K 区和 H 区各一个,一个挂了另一个仍是好的。

在发布阶段,由于翻滚更新是 K8s 内置的机制,能够经过简单的配一些健康检查的机制来得到好的发布体会,确保服务在发布的过程中不会呈现事务受损。经过资源监控和事务容器监控,能够灵敏弹性事务容器的规划。节点池规划是 ACK 独有的,它适当于能为不同的事务线配专属节点,这样就能够抵达物理阻隔,有了节点池,要去做集群的弹性弹性容的时分就十分便利,集群资源不行时能够经过简单的经过节点池的扩容操作,瞬间把节点池资源才能提高上去。

CSI 插件首要是用在开发测验环境。咱们为了节省本钱,许多开发测验环境,像中间件都是用容器自建的,容器自建属于有状况运用,有状况运用需求存储来支撑它。CSI 插件,阿里云供给了许多对应的对接,比方阿里云的云盘 OSS、NAS 等。咱们首要是用云盘插件来对接,把云盘挂到容器里,这样像数据库、Redis 等就能够得到稳定高效的存储。

VPC 方面,由于 ACK 里 VPC 网络是直通的,咱们用的是阿里云的 Terway 插件,这个插件能够把容器内部的网络和咱们的 VPC 互相打通,这个才能咱们觉得比较重要,是由于没有上容器渠道之前,咱们的服务都是布置在 ECS 机器上的,现在假如要迁进去,咱们的服务发现组件它在集群之外,就必然要让网络能够互通,否则它发现不了也就无法迁移了,所以 VPC 直通功用对咱们是十分有用的。

其他还有集群监控,首要是体现在 ACK 供给了开箱即用的集群,借助与 ACK 深度集成的可观测监控 Prometheus 版,对 K8s 集群和事务容器轻松构建资源监控体系。一方面,能够及时了解容器运转状况和集群运转状况,另一方面,这些集群监控的技能目标能够作为咱们判断体系是否需求扩容缩容的数据依据。经过布置根据目标或者是工作的弹性深度机制,能够快速对容器进行扩容。

以上这些运用场景,大部分公司应该都是类似的,能够总结一点:经过容器化来布置,充沛运用云的才能,下降运用本钱,保证运用高可用。 这是第一个事例。

第二个事例是怎样运用云来完成事务弹性。

青团社:亿级灵敏用工渠道的云原生架构实践

这里有三个小的事务场景,第一是埋点,第二个是广告投进,第三个是热门活动。

埋点咱们应该都不生疏,每个互联网公司都会需求埋点,经过埋点数据来了解用户,剖析用户。埋点数据作为剖析用户行为的数据资源,在整个产品的生命周期里边都十分重要。可是埋点数据的量一般都是十分巨大的,用户每一次点击,页面的曝光,还有用户的交互都会产生许多埋点数据。这些数据能够上传到后台去剖析产品的运用状况,剖析用户的行为和运用习惯,还能够延伸出做用户画像,用户偏好及用户转化路径这一系列数据产品。

咱们的埋点有很显着的潮汐特征,流量一般是早上七八点钟开端逐渐上升,到了正午十一点、下午两点抵达一天的高峰,然后再开端逐渐下降,到夜晚四五点钟的时分就抵达一天中最低,埋点数据量的规划也遵从这样的规矩。

埋点数据,咱们一般是先把数据发到后台,后台有埋点接纳数据的处理程序,先简单的把它处理一下,然后给它丢到 Kafka 里,再由大数据的一个渠道的组件去消费,消费完之后存储进去。

咱们的大数据团队会经过埋点数据来构建不同的数据层,供不同的事务场景运用,在布置埋点接纳程序的时分,就会充沛考虑埋点流量的潮汐特征,去把它做一些守时扩容缩容的机制,比方能够加一些守时使命,早上九点、十点开端扩容扩一倍,就能够应对一天的流量高峰,到晚上再把它缩回去。

广告投进方面也很重要。咱们渠道也和许多互联网渠道有广告投进的合作。在他们渠道里边去投进广告招引新用户。作为一项日常的运营作业,投进的时刻点或许不太固定,它的效果也纷歧定能按照预期来,有时分呈现爆点,流量就或许会被打爆。一起,随同流量而来的一些点击数据或埋点数据都会剧增。

为了做好日常广告投进的作业,咱们做了根据目标和工作的动态扩缩容机制。假如是由于运用容器资源,比方 CPU 内存爆了或者是抵达了警戒线,又或者是处理数据的程序,有 MQ 音讯积压的工作呈现了之后,就去对工作进行监控,然后动态的去扩容。

咱们用开源的 KEDA 东西装备事务目标进行监听,KEDA 东西经过监听 Prometheus 里边的目标 (咱们一切的目标都存在 Prometheus 里边) ,假如触发条件了之后会向 K8s 的 API server 建议一个 Pod 的扩容恳求,这样就完成了扩容操作,整个过程都是自动化的。

最后的热门活动,类似于电商里边的促销活动,这个场景的特点是它的开端时刻和完毕时刻都是已经提早知道的,这样只需求配备提早扩容的程序就能够了,比方到体会活动开端前的半小时先把容器给扩上去,完毕之后就缩回去,咱们首要是根据目标和工作这两点来做弹性扩容。

2.流量办理

这部分首要共享一下怎样去对流量进行办理。咱们首要分三个部分:网关、流量服务管理引擎 MSE、音讯行列。

这里有两个事例,由于作为头部的灵敏用工企业,咱们有许多端,比方有 C 端,B端,有安卓渠道,有 iOS 渠道。各大互联网渠道,像支付宝、抖音、快手、百度、QQ 等都有对应的投进、产品和小程序在上面。

青团社:亿级灵敏用工渠道的云原生架构实践

职业上也首要聚焦于 8 大职业,像餐饮、物流、商超这些。在这种在多端口,多职业的场景下,咱们的报名岗位在类目上,或者是端口上都有许多差异,无论展示逻辑仍是流量分发的规矩都是有差异的。咱们经过 API 网关和 BFF 来完成流量编列和不同端口的差异化处理。

网关这块首要是把流量引进来,BFF 首要是适配各端,它自己或许需求独有的一些数据格式,然后再调用后端的数据返回去。在网关里, BFF 自身是作为后端服务存在的,流量先经过网关,再经过 BFF 后经过后端把数据返回去。BFF 详细的实践架构不再赘述,但在青团社是用这个形式来做多端口的适配。

青团社:亿级灵敏用工渠道的云原生架构实践

第二个事例是根据工作驱动构建灵敏呼应体系,事例是咱们灵工管家这个产品,该产品首要是供给一系列的办理服务,比方考勤、发薪,还有排班等服务,这些服务是企业用到的一些企业级服务。渠道用户能够做到薪资日结,像许多兼职岗位,商家都是供给兼职日,你早上去上班打卡,然后下班打完卡,还没到你回家,薪酬就到账了,这个上任体会是十分好的。

这便是根据工作来驱动,下班打卡之后会触发下班打卡的工作,触发算工时、算薪资的逻辑,再到提早到账,整个流程是悉数工作驱动的,快的话或许几秒钟你的薪资就能到账,这也是灵工管家的比较好的一个产品卖点。

当然音讯 MQ 的场景是很常见的音讯解耦,但咱们还有其他场景,咱们把 MQ 用在数据同步和音讯分发上。数据同步用了一些插件和组件做一些数据同步的作业, MQ能够给它做一个缓冲,防止数据许多,一会儿把对端给打爆了。

音讯分发的话,咱们音讯渠道会有一些守时需求触发的守时音讯,比方给用户发推送短信,咱们会运用 MQ 的推迟音讯才能去做,适当于到点之后,你就去触发这一音讯,然后给用户发短信,发 push,这是一个详细的事例。

青团社:亿级灵敏用工渠道的云原生架构实践

下面的事例介绍一下怎样完成灰度。早期咱们没有灰度,一切的服务只要一上线,就适当于是全量状况,没法去验证服务究竟对用户有多大影响。在 2021 年完成事务容器化改造之后,咱们就引入了 MSE 微服务引擎来协助咱们完成全链路的灰度。

所谓全链路,指的是在流量链路这一层,网关进来之后到服务再到数据库,或者到经过音讯中间件的这个链路。还有一个便是音讯方面,要对流量的特征进行打标,然后链路的下一跳或许也需求打标,标识一下它要去到哪里。网关要担任南北流量的分发,在外部,咱们经过开源的 APISIX 网关,它是有流量分拆插件的,能够在发布的时分,经过布置多个版别,在发布的时分,布置两个版别或者或多个版别,叫 deployment。布置完了之后,再给它打标,然后网关上面会有个流量分拆插件,你能够配一些特征,然后让流量进到指定的版别。

进来之后,这里边东西向的流量就属于 MSE 微服务引擎来做的作业。它经过 agent 插装的方法,把整个链路给串起来,完成了整个链路的灰度。

比方说像 HTTP 恳求,它能够在恳求头上加 gray 标识,然后依次透传究竟层去。到音讯中间件这一块,它对 MQ 这块做一些增强,适当于是埋点相同,把这些流量的灰度符号埋进去。然后在消费端做一下操控,这样就能够确保你的流量能按照你预定的规矩顺畅的进来。

重要的线上服务要发布的时分,先走一下灰度,能够显着的增强咱们的信心。原先没有灰度的状况下,发布的时分都是很忐忑的,一般白天不敢发,都是夜晚才发,便是为了防止故障,由于你假如有问题的话,或许会影响许多用户。现在咱们已经有 7300万用户了,尽管说日活不是很高,但月活也有 1000多万,所以说白天的流量仍是十分大的。经过灰度发布,有问题的话在灰度阶段就能发现把它处理掉。

青团社:亿级灵敏用工渠道的云原生架构实践

下面的事例是运用微服务引擎完成高雅上下线,这个才能也比较重要。由于早期许多线上故障都是由于发布导致的,常常在发布中发现许多服务调不通了,是由于它在下线过程中,但调用方这边不知道还去恳求,就会报错。因此,在 2021 年,咱们用微服务引擎 MSE 把服务期间不滑润的问题处理了。

高雅下线的原理其实十分简单,比方说服务供给者,咱们称为 provider,他假如发了新的实例,当然流程还跟以前 K8s 翻滚更新机制是相同的。他先翻滚更新一个新版别的过程中,会触发老版别的下线动作,老版别下线动作就会履行 pre stop 钩子函数,这个函数是 K8s 供给了内置的机制,这个函数里 MSE 会供给一个接口,经过调用这个接口,让 MSE 的 agent 感知到服务要下线了,赶忙触发下线的工作。

工作触发之后,它的调用方能够感受到工作,然后在自己本地的 ribbon 服务列表缓存里边把 IP 给摘掉,摘掉之后,后面的恳求就不再调用了,适当于我知道你要下线就把你提早摘掉,不调用就不会报错了。

服务上线的原理也差不多,上线之前先推迟一会儿,先不那么快到注册中心,而是放一点点流量进来,这个节奏是经过 K8s 健康检查机制来完成的。MSE 供给健康检查的接口,它会经过接口去向 K8s 露出服务究竟有没有准备安排妥当。现在没有准备安排妥当,流量就不能悉数放进,能够放一点点,比方百分之零点几的流量进来,我先把服务预热一下,该建立的链接先建立起来,等到服务彻底安排妥当之后,再把流量放进来,这样无论是下线仍是上线,服务都是处于相对平稳的状况,下线调用端提早知道的话就不会再调用了。上线是先给你一段时刻,让你先准备好,准备好之后,我再把流量放进来,这是高雅上线的原理。

3.可观测和监控

接下来我讲一下可观测的实践,可观测首要用到阿里云 ARMS 运用监控 Prometheus Grafana 以及云监控这个组合。

青团社:亿级灵敏用工渠道的云原生架构实践

这个图便是用阿里云的云监控进行基础资源监控,如 ECS、云数据库 PolarDB、云音讯行列,这些基础监控都有些对应的目标。

那假如要进行更精细、全面的目标监控,阿里云也供给 Prometheus 目标监控才能,它会把你的目标放到 Prometheus 里边,运用预置模板快速构建告警体系的一起,也能够经过自己的事务需求去装备相应的自定义告警规矩。

第二个是运用实时监控服务 ARMS,作为一个具有诸多监控模块的云原生可观测渠道,咱们用其中的运用监控来处理 Java 运用功用的监控问题,咱们的运用在线上跑的时分或许会突然发现有几个恳求报错,或者是呼应极慢,那研制人员要要怎样去排查呢?

经过 ARMS 运用监控去观测整个调用链路,及时发现整个链路究竟哪一环节履行的比较慢。经过耗时数看得到,看得到之后定位一下的问题,比方说像这个实例里边,这是高德的三方接口比较慢,由于三方接口耗时确实是不可控的,这种问题咱们能够提早知道,还有一些超时、反常问题,这些都能够经过 ARMS 运用监控发现,当然也能够配相应的一些告警规矩。

青团社:亿级灵敏用工渠道的云原生架构实践

除了云基础设施以及运用功用,咱们希望进一步对事务目标进行监控,完成全栈可观测。针对事务目标监控,咱们首要是用 Prometheus 和 Grafana 来进行加工与呈现。这里有两个事例,一个事例是根据事务目标,也便是音讯中心的监控大盘,这里边的一切的数据都是经过 Java 端用 Prometheus 的客户端把目标数据露出出来,然后 Prometheus 服务端把这些数据收集上来,再给它配成这种图表。

青团社:亿级灵敏用工渠道的云原生架构实践

配成图表之后就能够可视化了,能看到现在的事务运转状况,这个曲线和两个图例应该都是实践的事务运营状况,有了这些数据,就有了监控告警的条件,没有这些东西就不知道事务究竟运转怎样样。

青团社:亿级灵敏用工渠道的云原生架构实践

然后日志告警中心这部分,像一些严峻的日志报错,Error 日志这些比较重要的日志报错,咱们会配对应的一些告警规矩,在呈现问题的时分进行及时告警。

经过这么多年事务开展,咱们的事务一直是在云上不断的开展和壮大,充沛用了云的各项才能来构建渠道。咱们首要考虑的是本钱,稳定性和研制功率这三块,希望能抵达平衡。由于咱们团队自身也比较小,所以用云的优势是十分显着的,能够运用云的弹性有效应对日益剧增的事务增加规划。云原生之路咱们还将持续,在此先报告咱们的效果。

青团社:亿级灵敏用工渠道的云原生架构实践

经过容器化布置,提高布置密度的方法,把原先的 ECS 本钱下降了 50%, 由于原先 ECS 布置的比较粗豪,或许一台机器上只布置一两个或者两三个服务。经过容器化的布置,能够提高布置密度。

第二个是运用完成了高可用和弹性调度,使咱们能够从容的应对未来的事务增加。

第三个是经过全面施行基础资源、运用服务及事务监控,快速了解体系运转状况。过去,体系运转状况对咱们来说是一个黑盒。即使有一部分数据,也无法有效的对不同类型数据进行加工与运用,一切都是未知。经过这些才能,从无到有的建设,咱们现在能够十分快速的去了解、观测体系的状况。

第四个效果是运维本钱大幅下降,把机器给省下去了,像一些人工需求做的作业,现在经过高度的自动化能够完成大规划的集群办理。

总结与展望

展望未来,或许会更多的考虑这以下三个方向,这些也是咱们未来要做的作业。

  • 咱们现在比较关心的服务网格,由于以后也会有更多语言,像一些运用比方说 Java、PythonGo 这些,MSE 目前或许对 Java 的支撑十分好,后面咱们也会探索根据服务网格的通用的流量管理才能。
  • 由于 Java 占咱们整个运用的体量大概是 80%,后续会考虑用一些新的技能,比方用 GraaLVM native 来完成原生镜像布置,这样能够进一步下降运用的资源占用状况,提高运用的呼应峰值功用。
  • 经过混沌工程的施行,进一步提高线上的稳定性。目前咱们的稳定性或许还没有抵达抱负的目标,这是后面的努力方向。