使用函数计算,数禾如何实现高效的数据处理?

作者:邱鑫鑫,王彬,牟柏旭

公司背景和业务

数禾科技以大数据和技术为驱动,为金融机构提供高效的智能零售金融解决方案,服务银行、信托、消费金融公司、保险、小贷公司等持牌金融机构,业务涵盖消费信贷、小微企业信贷、场景分期等多个领域,提供营销获客、风险防控、运营管理等服务。数禾科技通过自主开发的消费信贷产品,连接金融机构与普罗大众,赋能金融机构数字化转型,迎接中国消费升级的大潮。

数禾当前有三款主要产品,还呗,还享花,小店邦。每款产品都有大量的受众,每天会产生大量的应用日志,数据通过压缩后归档到阿里云 OSS 存储,以达到最优的存储成本。

低效的数据处理

应用日志通过 SLS 收集,压缩并归档到 OSS,整个链路都非常顺滑。但日常有些业务需要查看详细的应用日志,由于日志收集会将 APP 上不同应用的日志都打到一起。因此,获取某个应用的日志,需要从 OSS 解压大量的文件,并从中过滤出特定的应用,才可以进一步分析排查。这个过程在实效性和数据处理效率上都存在很大的问题,为此,数禾运维团队计划从源头重构整个任务处理链路,以求以最低的开发成本,最高的处理效率,最优的资源费用,最好的扩展性打造高可用,易升级,低维护的解决方案。

首先想到的采用容器自建的方案。自建的处理程序从 Kafka 获取数据,并负责数据的处理,K8s 集群保证任务的弹缩,配合自建的发布平台,初步能够满足设计的需求。

该方案的优势在于,对于 K8s 的使用和任务发布平台,数禾运维团队都有了不少的积累,整体实施起来难度会比较小。但对比设想的链路目标,却还有些欠缺,主要表现在:

1. 任务开发成本较高: 从 Kafka 获取数据,数据的业务处理、异步压缩上传,任务的发布更新系统对接,K8s 的弹缩策略,都需要研发人员全新开发。

2. 链路弹性有限: 一是 K8s 通过指标弹出资源速度需要 10+s,对于突发的日志流量,可能会出现资源弹出不及时的情况;二是 Kafka Topic 数据处理的并发度受限于 Topic Partition,当消费程序达到 Partition 数目时,消费程序没法继续水平扩大并发度。

3. 资源利用率不够极致: 在业务低峰期,特别是夜间,存在流量很小甚至是无流量的时段,但处理程序还是得最小保持 1 个实例的运行,造成了一定的资源浪费。

4. 升级维护工作依然很多: 业务处理逻辑的修改,发布平台的更新对接,K8s 平台的弹缩规则等,都需要持续的维护。

就在数禾运维团队陷入选型沉思的时候,阿里云函数计算(后面简称 FC)团队的交流让数禾运维团队眼前一亮,阿里云函数计算在 Kafka->FC 的链路已经打磨多时,对于数禾的业务需求,正可以使用到函数计算很多的已有功能,数禾的研发团队只需要专注在自身的业务处理逻辑,就能快速的搭建一套高可用,易升级,低维护的任务处理链路。

函数计算的出现恰逢其时

函数计算是事件驱动的全托管计算服务。使用函数计算,客户无需采购与管理服务器等基础设施,只需编写并上传代码或镜像。函数计算会准备好计算资源,弹性地、可靠地运行任务,并提供日志查询、性能监控和报警等功能。

通过函数计算自带的 Kafka 触发器和定时触发器,数禾运维团队架构出了一套理想的解决方案。架构图如下:

图片

函数的处理逻辑如下:

  • 数据拆分函数

    通过 Kafka 触发器触发,触发器会将 Kafka 数据攒批,以 batch 的形式发送到函数计算,函数计算处理逻辑负责将数据块通过标识字段拆分,同一个应用的数据汇聚到一起,在 NAS 目录形成独立的文件。属于 io 密集型操作。

  • 数据压缩函数

    在一批数据到达函数计算拆分汇聚之后,先对数据进行压缩,然后将压缩后的数据追加到 NAS 目录对应的文件,在写 NAS 前,借助 Redis 处理并发锁的问题,大大减少了小文件的数量,属于算力密集型操作。

  • 数据上传函数通过定时触发器触发,将第二步压缩完成的数据上传到 OSS 对应目录,然后清理本地目录。属于 io 密集型操作。

通过将处理逻辑拆分,将对资源要求不同的操作拆分到不同函数,实现了每个函数资源利用率的最大化,降低了总体实现的费用成本。

相比通过 ECS/K8s 自建的方案,优势还是十分明显的:

图片

从对比可以看出,采用函数计算的方式,在开发效率,弹性,升级部署,费用成本方面,相对 ECS/K8s 自建方案,都有明显的优势。

落地中的问题

Serverless 理念跟整个任务的架构十分的契合,但在落地中还是可以看到有些处理不够优雅的地方,总结起来主要有两处:

  1. 函数计算同步调用的攒批大小是 16M,异步调用的攒批大小是 128K,为了降低调用函数的计算频率,达到更好的攒批效果,从而在成本和性能上都达到好的效果,使得触发器配置时只能配置同步调用,同步调用时,函数计算侧的并行度取决于调用方,这就要求触发器任务配置多任务分片,造成了一定的资源浪费。

  2. 在第一个函数中,主要处理逻辑是根据 Kafka 消息的应用 id 信息,拆分数据,将同一个 id 应用的数据聚合在一起,由于本身 NAS 和 OSS 都没有提供文件锁,所以当多个函数并发写同一个 id 应用文件时,如果程序层面不处理文件锁的问题,会导致写数据相互覆盖。对于每个函数实例拆分小文件的方案,由于 Kafka 消息中应用的种类很多,拆分数据总是会形成很多小文件,数据合并需要很长的时间。经过多种方案的检验比较,最终选择了通过 Redis 处理文件锁,每个应用全局最多产生 10 个并发写文件,函数计算运行实例写 NAS 文件时,先去 Redis 获取文件锁,获取成功才能真正开始写入。这种方案在写数据性能上有很好的表现,代码复杂度得到了一定的增加,但总体可控。

最终,这些问题没有成为数禾方案的卡点,通过交流和方案验证,最终都得到了一定程度的解决。

出色的效果和进一步的期待

在全链路角度看,整条链路非常的 Serverless,资源使用效率也非常高,再配合函数计算 2023 云栖大会推出的梯度计价,整个方案在资源成本上也达到了非常好的控制。

在期望方面,针对本次场景落地中遇到的问题,还是希望可以得到更好的优化。异步调用放宽消息体大小,可以以最少的触发器资源,达到函数计算的大并发处理。通过 NAS/OSS 原生支持文件锁的能力,可以减少文件的数量,同时也减少业务层代码在这方面的处理复杂度。

任务从 10 月份上线以来,数禾运维团队在该任务的运维投入上得到了人力释放,几乎达到了 0 运维; 在功能迭代上,通过函数计算控制台提供的多版本和灰度能力,快速的完成了升级的灰度。

后续数禾运维团队会将更多适合 Serverless 的业务采用函数计算方案,最大限度将精力专注在公司业务,逐渐剥离运维和底层资源的简单维护。数禾运维团队也十分开放的与函数计算团队探讨更多的场景,希望将公司的业务架构在新一代的 Serverless 架构上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

菜鸟关于做前、后端的整理(html、js),以及疑问

涉及到后端的接口py&#xff0c;前端html和js 这三部分就按照如下格式放到server项目主路径下&#xff0c;这样后端机可以作为一个前端server main.pystaticmain.jsmain.htmlhtml 首先是html要设定网页的显示 <!DOCTYPE html> <html> <head><title>…

电力能源实景三维可视化合集,智慧电网数字孪生

电力能源是现代社会发展和运行的基石&#xff0c;渗透于工业、商业、农业、家庭生活等方方面面&#xff0c;它为经济、生活质量、环境保护和社会发展提供了巨大的机会和潜力。图扑软件应用自研 HT for Web 强大的渲染引擎&#xff0c;助力现代化的电力能源数字孪生场景&#xf…

【Vue】vue项目中Uncaught runtime errors:怎样关闭

vue项目中Uncaught runtime errors:怎样关闭 一、背景描述二、报错原因三、解决方案3.1 只显示错误信息不全屏覆盖3.2 取消全屏覆盖 四、参考资料 一、背景描述 项目本来运行的好好&#xff0c;换了个新的浏览器&#xff0c;新的Chrome浏览器版本号是116.0.5845.97&#xff08…

视频增强修复Topaz Video AI

Topaz Video AI是一款强大的视频增强软件&#xff0c;利用人工智能技术对数千个视频进行训练&#xff0c;结合多个输入视频的帧信息来提高素材的分辨率。该软件可将视频的分辨率提高到最高8K&#xff0c;并保持真实的细节和运动一致性。同时&#xff0c;它还能自动修复视频中的…

HCIA-HarmonyOS设备开发认证-序

序 最近涉及到HarmonyOS鸿蒙系统设备开发&#xff0c;在网络上已经有很多相关资料&#xff0c;视频教程&#xff0c;我也移植了公司的一个stm32G474板卡&#xff0c;运行LiteOS-m L0系统。 一面看资料一面移植&#xff0c;遇到不少坑&#xff0c;当看到运行的LOGO时&#xff0…

protobuf学习日记 | 认识protobuf中的类型

目录 前言 一、标量数据类型 二、protobuf中的 “数组” 三、特殊类型 1、枚举类型 &#xff08;1&#xff09;类型讲解 &#xff08;2&#xff09;升级通讯录 2、Any类型 &#xff08;1&#xff09;类型讲解 &#xff08;2&#xff09;升级通讯录 3、oneof类型 …

LeetCode、2300. 咒语和药水的成功对数【中等,排序+二分】

文章目录 前言LeetCode、2300. 咒语和药水的成功对数【中等&#xff0c;排序二分】题目及类型思路及代码 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域…

elementUI+el-upload 上传、下载、删除文件以及文件展示列表自定义为表格展示

Upload 上传组件的使用 官方文档链接使用el-upload组件上传文件 具体参数说明&#xff0c;如何实现上传、下载、删除等功能获取文件列表进行file-list格式匹配代码 文件展示列表自定义为表格展示 使用的具体参数说明文件大小展示问题&#xff08;KB/MB&#xff09;文件下载代码…

【GitHub项目推荐--微软开源的可视化工具】【转载】

说到数据可视化&#xff0c;大家都很熟悉了&#xff0c;设计师、数据分析师、数据科学家等&#xff0c;都需要用各种方式各种途径做着数据可视化的工作.....当然许多程序员在工作中有时也需要用到一些数据可视化工具&#xff0c;如果工具用得好&#xff0c;就可以把原本枯燥凌乱…

svg矢量图标在wpf中的使用

在wpf应用程序开发中&#xff0c;为支持图标的矢量缩放&#xff0c;及在不同分辨率下界面中图标元素的矢量无损缩放&#xff0c;所以常常用到svg图标&#xff0c;那么如果完 美的将svg图标运用到wpf日常的项目开发中呢&#xff0c;这里分享一下我的个人使用经验和详细步骤。 步…

二叉树的基础概念及遍历

二叉树(Binary Tree)的基础 1、树的概念 1、树的概念 树是一种非线性的数据结构&#xff0c;是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合&#xff0c;将它称为树&#xff0c;是因为在形状上像一颗倒着的树&#xff0c;如下图所示就是一颗二叉…

electron-vite中的ipc通信

1. 概述 再electron中&#xff0c;进程间的通信通过ipcMain和ipcRenderer模块&#xff0c;这些通道是任意和双向的 1.1. 什么是上下文隔离进程 ipc通道是通过预加载脚本绑定到window对象的electron对象属性上的 2. 通信方式 2.1. ipcMain&#xff08;也就是渲染进程向主进…

R303 指纹识别模块硬件接口说明

1.外部接口尺寸图 2.USB通讯 3.串行通讯

VUE组件--动态组件、组件保持存活、异步组件

动态组件 有些场景可能会需要在多个组件之间进行来回切换&#xff0c;在vue中则使用<component :is"..."> 来实现组件间的来回切换 // App.vue <template><component :is"tabComponent"></component><button click"change…

【JavaEE进阶】 SpringBoot配置⽂件

文章目录 &#x1f340;配置⽂件的作⽤&#x1f334;SpringBoot配置⽂件&#x1f38b;配置⽂件的格式&#x1f384;properties配置⽂件&#x1f6a9;properties基本语法&#x1f6a9;读取配置⽂件&#x1f6a9;properties的缺点 &#x1f333;yml配置⽂件yml基本语法&#x1f6…

TestCaseAssiant使用说明

目录 说明 工具界面 功能描述 Xmind转测试用例 测试组件 测试用例 用例优先级 用例前提 用例操作步骤 用例期望结果 Excel测试用例转Testlink xml 用例模板 使用技巧: TestLink Xml转Excel测试用例 说明 本文为小编之前博文中介绍的工具使用说明 Xmind转Excel测…

python tkinter 最简洁的计算器按钮排列

代码如下&#xff0c;只要再加上按键绑定事件函数&#xff0c;计算器既可使用了。 import tkinter as tk from tkinter.ttk import Separator,Buttonif __name__ __main__:Buttons [[%,CE,C,←],[1/x,x,√x,],[7, 8, 9, x],[4, 5, 6, -],[1, 2, 3, ],[, 0, ., ]]root tk.T…

2024年阿里云优惠券和代金券领取,活动整理服务器价格表

2024阿里云优惠活动&#xff0c;免费领取阿里云优惠代金券&#xff0c;阿里云优惠活动大全和云服务器优惠价格表&#xff0c;阿里云ECS服务器优惠价99元一年起&#xff0c;轻量服务器优惠价61元一年&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云优惠券免费领取、优惠活…

GCC 内联汇编

LINUX下的汇编入门 AT&T风格 汇编 和GCC风格汇编 汇编代码的调试 前面写了三篇,是自我摸索三篇,摸着石头过河,有些或许是错误的细节,不必在意! 今天我们直接用GCC编译C语言代码,且在C语言里面内嵌AT&T风格的汇编! 前三篇大家了解即可,我们重点放在内嵌汇编里,简单快…

Java设计模式-单例模式(2)

大家好&#xff0c;我是馆长&#xff01;从今天开始馆长开始对java设计模式的创建型模式中的单例、原型、工厂方法、抽象工厂、建造者的单例模式进行讲解和说明。 单例模式&#xff08;Singleton&#xff09; 定义 某个类只能生成一个实例&#xff0c;该类提供了一个全局访问…