揭秘|每秒千万级的实时数据处理是怎么实现的?

PHP接单涨薪系列(八十二):如何集成AI模型实现实时预测分析?——揭秘Flink与TensorFlow Serving融合构建智能风控系统 本文提出了一种基于Flink与TensorFlow Serving的金融风控实时预测系统,解决了传统方案在实时性、吞吐量和模型更新方面的痛点。系统采用五层架构:Kafka数据接入、Flink实时计算、TensorFlow Serving模型服务、Redis缓存和PHP决策层,实现200ms内的风险判定。方案包含完整技术实现细节,支持50K TPS高并发,并提供三种商业化版本(基础版1.2M、企业版3.5M、SaaS按量付费)。 阅读详情

1、设计背景

闲鱼目前实际生产部署环境越来越复杂,横向依赖各种服务盘宗错节,纵向依赖的运行环境也越来越复杂。当服务出现问题的时候,能否及时在海量的数据中定位到问题根因,成为考验闲鱼服务能力的一个严峻挑战。

线上出现问题时常常需要十多分钟,甚至更长时间才能找到问题原因,因此一个能够快速进行自动诊断的系统需求就应用而生,而快速诊断的基础是一个高性能的实时数据处理系统。

这个实时数据处理系统需要具备如下的能力:

1、数据实时采集、实时分析、复杂计算、分析结果持久化。
2、可以处理多种多样的数据。包含应用日志、主机性能监控指标、调用链路图。
3、高可靠性。系统不出问题且数据不能丢。
4、高性能,底延时。数据处理的延时不超过3秒,支持每秒千万级的数据处理。

本文不涉及问题自动诊断的具体分析模型,只讨论整体实时数据处理链路的设计。

2、输入输出定义

为了便于理解系统的运转,我们定义该系统整体输入和输出如下:

输入:

服务请求日志(包含traceid、时间戳、客户端ip、服务端ip、耗时、返回码、服务名、方法名)

环境监控数据(指标名称、ip、时间戳、指标值)。比如cpu、 jvm gc次数、jvm gc耗时、数据库指标。

输出:

一段时间内的某个服务出现错误的根因,每个服务的错误分析结果用一张有向无环图表达。(根节点即是被分析的错误节点,叶子节点即是错误根因节点。叶子节点可能是一个外部依赖的服务错误也可能是jvm异常等等)。

3、架构设计

在实际的系统运行过程中,随着时间的推移,日志数据以及监控数据是源源不断的在产生的。每条产生的数据都有一个自己的时间戳。而实时传输这些带有时间戳的数据就像水在不同的管道中流动一样。

2509688-8da4e318c75fdbea.png

如果把源源不断的实时数据比作流水,那数据处理过程和自来水生产的过程也是类似的:

2509688-256a359ac4f786a0.png

自然地,我们也将实时数据的处理过程分解成采集、传输、预处理、计算、存储几个阶段。

整体的系统架构设计如下:

2509688-33f22f79c7596932.png
采集

采用阿里自研的sls日志服务产品(包含logtail+loghub组件),logtail是采集客户端,之所以选择logtail是因为其优秀的性能、高可靠性以及其灵活插件扩展机制,闲鱼可以定制自己的采集插件实现各种各样数据的实时采集。

传输

loghub可以理解为一个数据发布订阅组件,和kafka的功能类似,作为一个数据传输通道其更稳定、更安全,详细对比文章参考:https://yq.aliyun.com/articles/35979?spm=5176.10695662.1996646101.searchclickresult.6f2c7fbe6g3xgP

预处理

实时数据预处理部分采用blink流计算处理组件(开源版本叫做flink,blink是阿里在flink基础上的内部增强版本)。目前常用的实时流计算开源产品有Jstorm、SparkStream、Flink。Jstorm由于没有中间计算状态的,其计算过程中需要的中间结果必然依赖于外部存储,这样会导致频繁的io影响其性能;SparkStream本质上是用微小的批处理来模拟实时计算,实际上还是有一定延时;Flink由于其出色的状态管理机制保证其计算的性能以及实时性,同时提供了完备SQL表达,使得流计算更容易。

计算与持久化

数据经过预处理后最终生成调用链路聚合日志和主机监控数据,其中主机监控数据会独立存储在tsdb时序数据库中,供后续统计分析。tsdb由于其针对时间指标数据的特别存储结构设计,非常适合做时序数据的存储与查询。调用链路日志聚合数据,提供给cep/graph service做诊断模型分析。cep/graph service是闲鱼自研的一个应用,实现模型分析、复杂的数据处理以及外部服务进行交互,同时借助rdb实现图数据的实时聚合。

最后cep/graph service分析的结果作为一个图数据,实时转储在lindorm中提供在线查询。lindorm可以看作是增强版的hbase,在系统中充当持久化存储的角色。

4、设计细节与性能优化

采集

日志和指标数据采集使用logtail,整个数据采集过程如图:

2509688-ffe53ae4bc2222f2.png

其提供了非常灵活的插件机制,共有四种类型的插件:

  • inputs: 输入插件,获取数据。
  • processors: 处理插件,对得到的数据进行处理。
  • aggregators: 聚合插件,对数据进行聚合。
  • flushers: 输出插件,将数据输出到指定 sink。

由于指标数据(比如cpu、内存、jvm指标)的获取需要调用本地机器上的服务接口获取,因此应尽量减少请求次数,在logtail中,一个input占用一个goroutine。闲鱼通过定制input插件和processors插件,将多个指标数据(比如cpu、内存、jvm指标)在一个input插件中通过一次服务请求获取(指标获取接口由基础监控团队提供),并将其格式化成一个json数组对象,在processors插件中再拆分成多条数据,以减少系统的io次数同时提升性能。

传输

数据传输使用LogHub,logtail写入数据后直接由blink消费其中的数据,只需设置合理的分区数量即可。分区数要大于等于bink读取任务的并发数,避免blink中的任务空转。

预处理

预处理主要采用bink实现,主要的设计和优化点:

1:编写高效的计算流程

blink是一个有状态的流计算框架,非常适合做实时聚合、join等操作。
在我们的应用中只需要关注出现错误的的请求上相关服务链路的调用情况,因此整个日志处理流分成两个流:
a、服务的请求入口日志作为一个单独的流来处理,筛选出请求出错的数据。
b、其他中间链路的调用日志作为另一个独立的流来处理,通过和上面的流join on traceid实现出错服务依赖的请求数据塞选。

2509688-e2f33abf624082a6.png

如上图所示通过双流join后,输出的就是所有发生请求错误相关链路的完整数据。

2:设置合理的state生存周期

blink在做join的时候本质上是通过state缓存中间数据状态,然后做数据的匹配。而如果state的生命周期太长会导致数据膨胀影响性能,如果state的生命周期太短就会无法正常关联出部分延迟到来的数据,所以需要合理的配置state生存周期,对于该应用允许最大数据延迟为1分钟。

使用niagara作为statebackend,以及设定state数据生命周期,单位毫秒
state.backend.type=niagara
state.backend.niagara.ttl.ms=60000
3:开启 MicroBatch/MiniBatch

MicroBatch 和 MiniBatch 都是微批处理,只是微批的触发机制上略有不同。原理上都是缓存一定的数据后再触发处理,以减少对 state 的访问从而显著提升吞吐,以及减少输出数据量。

开启join
blink.miniBatch.join.enabled=true
使用 microbatch 时需要保留以下两个 minibatch 配置
blink.miniBatch.allowLatencyMs=5000
防止OOM,每个批次最多缓存多少条数据
blink.miniBatch.size=20000
4:动态负载使用 Dynamic-Rebalance 替代 Rebalance

blink任务在运行是最忌讳的就是存在计算热点,为保证数据均匀使用Dynamic Rebalance,它可以根据当前各subpartition中堆积的buffer的数量,选择负载较轻的subpartition进行写入,从而实现动态的负载均衡。相比于静态的rebalance策略,在下游各任务计算能力不均衡时,可以使各任务相对负载更加均衡,从而提高整个作业的性能。

开启动态负载
task.dynamic.rebalance.enabled=true
5:自定义输出插件

数据关联后需要将统一请求链路上的数据作为一个数据包通知下游图分析节点,传统的方式的是通过消息服务来投递数据。但是通过消息服务有两个缺点:
1、其吞吐量和rdb这种内存数据库相比比还是较大差距(大概差一个数量级)。
2、在接受端还需要根据traceid做数据关联。

我们通过自定义插件的方式将数据通过异步的方式写入RDB,同时设定数据过期时间。在RDB中以数据结构存储。写入的同时只将traceid做为消息内容通过metaQ通知下游计算服务,极大的减少了metaQ的数据传输压力。

图聚合计算

cep/graph计算服务节点在接收到metaQ的通知后,综合根据请求的链路数据以及依赖的环境监控数据,会实时生成诊断结果。诊断结果简化为如下形式:

2509688-994b3af7fd16ce32.png

说明本次请求是由于下游jvm的线程池满导致的,但是一次调用并不能说明该服务不可用的根本原因,需要分析整体的错误情况,那就需要对图数据做实时聚合。

聚合设计如下(为了说明基本思路,做了简化处理):

1、首先利用redis的zrank能力为根据服务名或ip信息为每个节点分配一个全局唯一排序序号。
2、为图中的每个节点生成对应图节点编码,编码格式:
对于头节点:头节点序号|归整时间戳|节点编码
对于普通节点:|归整时间戳|节点编码
3、由于每个节点在一个时间周期内都有唯一的key,因此可以将节点编码作为key利用redis为每个节点做计数。同时消除了并发读写的问题。
4、利用redis中的set集合可以很方便的叠加图的边。
5、记录根节点,即可通过遍历还原聚合后的图结构。

聚合后的结果大致如下:

2509688-a0db30b44d4635b1.png

这样最终生成了服务不可用的整体原因,并且通过叶子节点的计数可以实现根因的排序。

5、收益

系统上线后,整个实时处理数据链路的延迟不超过三秒。闲鱼服务端问题的定位时间从十多分钟甚至更长时间下降到五秒内。大大的提升了问题定位的效率。

6、未来展望

目前的系统可以支持闲鱼每秒千万的数据处理能力。后续自动定位问题的服务可能会推广到阿里内部更多的业务场景,随之而来的是数据量的成倍增加,因此对于效率和成本提出了更好的要求。

未来我们可能做的改进:

1、能够自动的减少或者压缩处理的数据。
2、复杂的模型分析计算也可以在blink中完成,减少io,提升性能。
3、支持多租户的数据隔离。



本文作者:闲鱼技术-靖杨

阅读原文

本文为云栖社区原创内容,未经允许不得转载。

GIS海量数据前端加载优化策略 前端来讲,浏览器的性能其实是最差的,不说GIS业务,传统的前后端业务数据量庞大都会导致崩溃。屏幕范围之外的数据是否可以不加载?云GIS和云计算的概念早已渗透到当今GIS前言,早在空间分析采用GIS云计算的方式以后,GIS大数据也必然依赖于云计算,将大量的响应,数据计算与返回放在云端,甚至可以直接将数据在云端渲染好,前端直接负责加载都可。实际上对于一个以地图为核心的应用来讲,出现海量数据还是挺常见的,比如一幅地图上成千上万个POI(兴趣点),一个省乃至全国的所有道路,包含羊肠小道等,大批量的数据要如何展示?. 阅读详情

相关推荐

哨兵一号数据下载

哨兵1号数据的下载过程

weixin_59617499的博客 5138

如何在前端实现上万行大量数据的秒级响应?

使用更高效的数据绑定方法,例如,使用Object.observe()或Proxy来替代使用setInterval()或setTimeout()来检查数据的变化。使用 WebAssembly 和 WebGL 来加速图形渲染,如使用canvas 或 WebGL来渲染表格数据。总之,要实现十万行数据的表格秒级响应,需要一系列技术和优化的结合,并需要根据具体情况进行调整。使用高性能的数据结构来存储数据,例如哈希表或二叉堆来提高查询和排序的性能。对于大量数据的表格,使用更高级的排序和筛选功能来减少需要渲染的数据量。

风清扬的专栏 1077

4万字一文带你看懂车载摄像头技术、市场、发展前景

1、小孔成像 在战国初期,我国学者墨子(公元前468年-公元前376年)和弟子们完成了世界上第一个小孔成像的实验,并记录在《墨经》中:“景到,在午有端,与景长。说在端。”“景。光之人,煦若射,下者之人也高;高者之人也下。足蔽下光,故成景于上;首蔽上光,故成景于下。在远近有端,与于光,故景库内也。” 此文解释了小孔成倒像的原因,指出了光沿直线传播的性质。这是对光直线传播的第一次科学解释。 而西方世界直到公元前350年,古希腊学者亚里士多德提出光学法则,西方人从此了解小孔成像的光学原理。

m0_58838529的博客 1495

JS前端千万级弹幕数据循环优化示例

本文涉及的知识点可能并不是很重要,在这里我要跟大家说的是,我们平时在写代码的时候,要善于发现代码的可优化空间,如果你发现了并且实事求是的去做了,你的能力就会有更大的提高,而且这个发现的过程你可以找同事,找leader去给你review代码,在业务中沉淀出来的代码比你自己平时写个小demo写的代码更能让你成长。我们这里不再使用slice的方案,设置一个游标,记录循环的初始位置,下次循环直接从游标记录的位置开始循环,然后满足查找的条件就break,这样既不破坏原来的数组,也能有效的减少循环的次数。...

zl5186888的博客 496

Anylabeling与SAM协同:从智能标注到YOLO数据集构建的完整实践

本文详细介绍了Anylabeling与SAM协同标注的完整实践,从智能标注到YOLO数据集构建的全流程。通过结合SAM的自动分割能力和Anylabeling的交互式标注,显著提升标注效率,特别适合小样本、复杂形状和多类别标注场景。文章还提供了环境搭建、标注优化技巧以及YOLO格式转换的实用指南。

weixin_26873711的博客 461

YOLO26 从零到工业落地全实战:自定义训练+多场景测试+边缘部署预备,踩坑实测100%可复现

很多人觉得训练是核心,其实不是——数据集的质量,直接决定了你模型的上限。我见过太多人,标注不规范、格式错误、数据集划分混乱,然后疯狂调参,训了几百轮还是不收敛,纯属白费功夫。我这次用的是工业零件缺陷检测自定义数据集,共3个类别:划痕、毛刺、变形,总计1200张图片,给大家讲一套标准的、可复现的数据集制作流程,不管你是做工业检测、安防、交通,都能直接套用。很多人拿到数据集,直接用默认命令训练,然后抱怨精度上不去。默认参数是给COCO数据集用的,你的自定义数据集,必须针对性调参,不然根本达不到最优效果。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 569

简述--高并发解决方案--01

https://blog.youkuaiyun.com/happydecai/article/details/80366986

时光里的博客 1885

地统计插值学习心得(一)

(创建地统计图层工具用于根据现有的地统计图层或者地统计模型来创建包含新要素数据集的地统计图层,也就是使用构建好的地统计模型用到新的数据集中)这表明,远离极值的区域预测不受极值的影响,并且还表明,包括极值会导致钼元素浓度高的区域周围的预测明显变高。通常,我们使用同一个数据集进行建模和预测,但是在实际插值过程中,这两步的数据可以是不同的,这就是处理极值的诀窍。如果你的数据集有无法忽略的极值时(比如这些钼元素浓度),一种常见的方法是首先显式移除极值进行建模,然后在预测中使用整个数据集(包括极值)。

JData_Engineer的博客 287

怎么实现数据的实时更新_揭秘|每秒千万级的实时数据处理是怎么实现的?

01背景闲鱼目前实际生产部署环境越来越复杂,横向依赖各种服务盘宗错节,纵向依赖的运行环境也越来越复杂。当服务出现问题的时候,能否及时在海量的数据中定位到问题根因,成为考验闲鱼服务能力的一个严峻挑战。线上出现问题时常常需要十多分钟,甚至更长时间才能找到问题原因,因此一个能够快速进行自动诊断的系统需求就应用而生,而快速诊断的基础是一个高性能的实时数据处理系统。这个实时数据处理系统需要具备如下...

weixin_39617484的博客 2175

OpenClaw对接本地大模型:Llama3/Qwen/ChatGLM全适配,完全私有化部署

OpenClaw对接本地大模型,是企业级AI智能体落地的必经之路——它不仅解决了数据隐私和合规问题,还能大幅降低成本、提升响应速度、实现定制化。这篇文章我给大家完整拆解了两套部署方案:Ollama(新手首选,5分钟搞定)和vLLM(生产环境首选,高性能),覆盖了Llama3/Qwen/ChatGLM三大主流模型,还有真实的落地案例、高级优化、踩坑避坑指南,看完你就能零代码完成完全私有化的部署。从零开发自定义工具,给OpenClaw添加专属业务能力;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 808

Jetson Nano 实战指南:深度学习环境配置与 YOLOv5 边缘端部署解析

Jetson Nano是NVIDIA推出的嵌入式AI开发板,凭借其强大的GPU计算能力和完善的软件生态系统,成为边缘AI部署的理想平台。本教程源于作者团队参加2024中国机器人大赛暨RoboCup机器人世界杯中国赛机器人先进视觉3D识别赛道的实战经验,是一份经过验证的环境部署指南。

FJN110的博客 152

千万数据怎么加索引_揭秘|每秒千万级的实时数据处理是怎么实现的?

作者:闲鱼技术-靖杨1、设计背景闲鱼目前实际生产部署环境越来越复杂,横向依赖各种服务盘宗错节,纵向依赖的运行环境也越来越复杂。当服务出现问题的时候,能否及时在海量的数据中定位到问题根因,成为考验闲鱼服务能力的一个严峻挑战。 线上出现问题时常常需要十多分钟,甚至更长时间才能找到问题原因,因此一个能够快速进行自动诊断的系统需求就应用而生,而快速诊断的基础是一个高性能的实时数据处理系统。 ...

weixin_39924573的博客 203

试读源码在这里下载

试读文章的源码在这里下载。源码不做任何修改,重点重点重点:为了代码运行不报错,安装matlab 版本为 2021 及以上版本。matlab安装教程大家可以参考这个教程:手把手教你安装matlab软件。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 4303

百万级数据处理和定位错误_揭秘|每秒千万级的实时数据处理是怎么实现的?...

作者:闲鱼技术-靖杨1、设计背景 闲鱼目前实际生产部署环境越来越复杂,横向依赖各种服务盘宗错节,纵向依赖的运行环境也越来越复杂。当服务出现问题的时候,能否及时在海量的数据中定位到问题根因,成为考验闲鱼服务能力的一个严峻挑战。 线上出现问题时常常需要十多分钟,甚至更长时间才能找到问题原因,因此一个能够快速进行自动诊断的系统需求就应用而生,而快速诊断的基础是一个高性能的实时数据处理系统。 这个实时数据...

weixin_39620151的博客 258

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

揭秘现代C++流水线架构:如何实现每秒千万级数据吞吐?

掌握高性能并行数据处理核心技术,解析C++流水线架构设计精髓。结合2025全球C++及系统软件技术大会“并行数据处理的C++流水线”专题,深入探讨多线程调度、零拷贝传输与流水线优化策略,适用于高频交易、实时日志处理等场景,实现每秒千万级数据吞吐。值得收藏

FuncFun的博客 968

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Enso数据可视化引擎揭秘:WebGL驱动的千万级数据实时渲染技术

在数据爆炸的时代,当你面对千万级用户行为日志或实时数据流时,是否曾因图表加载缓慢而错失关键决策时机?是否经历过拖拽交互时画面撕裂的尴尬?Enso可视化引擎凭借WebGL底层加速与创新的数据处理架构,实现了每秒60帧的千万级数据渲染能力,彻底改变了大数据可视化的性能边界。本文将深入解析其核心技术架构,带您掌握从数据预处理到像素渲染的全链路优化方案。 ## 引擎架构:数据可视化的"高速公路系统" ...

gitblog_00760的博客 1126

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

QuestDB高性能揭秘:SIMD向量化引擎如何实现千万级数据写入

QuestDB是一款高性能的分布式时间序列数据库,支持SQL查询和实时数据分析,适用于IoT、金融、网络和运营监控等场景。其核心优势在于高吞吐量、低延迟以及支持多种数据写入方式,这些特性很大程度上归功于其内部的SIMD向量化引擎技术。 ## 什么是SIMD向量化技术? SIMD(Single Instruction Multiple Data)即单指令多数据,是一种并行处理技术,能够在一条指令

gitblog_00898的博客 496

深度解析:Flink+Kafka+ClickHouse构建深圳地铁实时客流分析系统架构揭秘与实战指南

在城市轨道交通数字化浪潮中,海量客流数据的实时处理与智能分析已成为提升运营效率的关键。面对日均百万级交易记录的深圳地铁,传统数据处理架构在实时监控、客流预测和应急调度方面面临严峻挑战。本文深入剖析深圳地铁大数据客流分析系统(SZT-bigdata)的技术架构,这是一套基于Flink流处理、Kafka消息队列、ClickHouse实时分析引擎的现代化大数据解决方案,为城市交通管理者提供从数据采集到智

gitblog_00473的博客 364

终极指南:Aim如何轻松处理千万实验数据?揭秘高性能实验追踪器的核心能力

Aim是一款超级强大的开源实验追踪工具,能帮助开发者轻松管理和分析大量实验数据。本文将深入探讨Aim的性能基准测试结果,展示其处理千万级实验数据的卓越能力,为你的机器学习项目提供高效的数据管理解决方案。 ## 为什么选择Aim进行实验追踪? 在机器学习和深度学习领域,实验数据的管理和分析是至关重要的环节。随着实验数量的不断增加,如何高效地存储、查询和可视化这些数据成为了一个巨大的挑战。Aim作

gitblog_00751的博客 945

基于Java的同城道路救援系统源码架构与功能揭秘

Java同城道路救援系统采用微服务架构,整合SpringCloudAlibaba生态实现高并发处理。系统核心功能包括:亚米级定位引擎(室内外精度0.3-0.8米)、量子级调度算法(47ms决策)、全息化服务协同(AR故障识别)。关键技术亮点:Netty框架支持10万+并发,Redis分布式锁防止超卖,Flink实时处理12,000+数据流/秒。系统已覆盖42国837城,日均服务35万车主,响应时间7秒,满意度99.1%。未来将向数字孪生、自动驾驶救援等方向发展。

小马总的博客 874
上一篇: Spark的数据本地化和延迟调度策略
下一篇: Spring Boot2 集成 Elasticsearch、PostgreSQL 遇到的问题
叫我不矜持
博客等级 码龄8年 29粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值