腾讯云 AI 视觉产品基于流计算 Oceanus(Flink)的计费数据去重尝试

| 导语: 介绍下最近使用 Flink 来对计费数据进行去重的具体做法

一. 背景

AI 视觉产品在我们腾讯云-人工智能的产品目录下,包括人脸识别、人脸特效、人脸核身、图像识别、文字识别等。
流计算 Oceanus 在腾讯云-大数据的产品目录下,是基于 Apache Flink 构建的企业级实时大数据分析平台。
AI 视觉产品是按调用量计费,毕竟涉及到钱,用户对计量数据准确是非常敏感的; 另外调用量本身也比较大,如何保证数据的准确一致也是一个比较大的挑战。
数据不准: 主要包括数据丢失和数据重复(当然可能有其他问题比如上报的数据本身错误等,暂不属于本次讨论范围)。
数据丢失: 相当于调用量少算,会影响我们的收入。一方面我们通常重试、持久化等方式尽量减少数据的丢失,目标当然是完全不丢,但很难做到100%不丢。另一方面很少量的数据丢失对于实际收入影响很小,对用户基本没有影响。
数据重复: 相当于调用量多算就会多收用户钱,用户一旦发现肯定会投诉过来。所以是必须要去解决的,但是数据量很大,要做到精确去重比较难。

整体的背景和处理逻辑可以参考如下业务流程图, 本次主要介绍下我们在数据去重方面的一些尝试。

在这里插入图片描述

系统架构图:

在这里插入图片描述

二. 思路与调研

去重的触发时机: 数据重复的原因主要是各种重试:包括上游传输环节的超时重试和下游计算环节的系统重启导致的数据重算。因为我们通常使用的是最终的数据,只要保证最终数据不重复即可,所以只要在最后的计算环节进行一次去重就可以,前面的环节不用处理。

去重的技术手段: 保证数据处理中不重复、不丢失(数据一致),通常有 2 个技术手段:事务和幂等可重入(幂等重入可能出现部分数据插入了的时间段,没有事务还能保证过程中的精确,但如上所述我们只要最终数据一致,所以幂等也是可以的)。

事务的实现难度高,尤其在分布式或多个组件要用到 2PC 之类的事务,更加复杂;所以通常事务都是组件本身成熟的实现,很少从头开发的; 而幂等通常是使用数据的唯一键来保证去重,但是在我们数据累计这里不适用,因为聚合时的数据的顺序和数量在每次计算时不是固定的,所以如果出现重启要重新计算时并不能生成和上次一样的唯一键,就难以使用键去重。

经过调研发现 Flink 本身是支持 2PC 事务和内部的状态存储,可以做到 exactly-once,当然使用起来会有成本(包括学习成本、问题排查等,Flink 的开发入门和资料可以参见 Flink 入门 1-零基础用户实现简单 Flink 任务[2] 和 Flink 入门9-Jar 作业开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值