Comparthing Logo
去重云基础设施数据处理实时系统批量处理

请求级去重与批处理级去重

请求级去重会单独处理每个传入请求,实时消除重复数据;而批处理级去重则会将多个请求分组,并在累积后删除冗余数据。两种方法都能减少数据冗余,但在延迟、资源占用和理想应用场景方面存在显著差异。

亮点

  • 请求级去重能够实时捕获重复项,并将延迟开销降至最低。
  • 批量级去重通过与完整累积数据集进行比较,可以实现更高的准确率。
  • 请求级系统需要快速的内存存储,而批处理系统则使用更便宜的磁盘存储。
  • 批量级去重提供更好的故障恢复能力,因为原始数据会保留在存储中。

请求级重复数据删除是什么?

一种实时方法,可在处理之前检查并删除重复请求。

  • 系统一收到请求,请求就会立即得到处理,从而实现即时重复检测。
  • 通常使用内存中的数据结构,例如哈希集或布隆过滤器,以实现快速查找。
  • 由于决策与请求处理同步进行,因此延迟极低。
  • 常用于 API 网关、Web 服务器和实时欺诈检测系统
  • 通过防止重复工作开始,减少计算资源浪费。

批量级去重是什么?

一种延迟处理方法,它会随着时间的推移收集请求,并在预定的处理窗口期间删除重复项。

  • 处理按预定时间间隔(从几分钟到几小时不等)累积的请求。
  • 依赖于数据库或分布式文件系统等持久存储来保存待处理的记录。
  • 通过与更大的历史数据集进行比较,实现更高的去重准确率。
  • 常用于数据管道、ETL作业和分析数据采集工作流
  • 引入有意延迟,但最大限度地提高吞吐量和存储效率

比较表

功能 请求级重复数据删除 批量级去重
处理模型 实时、按需 按批次定时
延迟影响 几乎零额外延迟 延误时间从几分钟到几小时不等
存储要求 内存占用极小 需要持久存储来保存排队的数据
去重准确率 仅限于最近的内存窗口 在整个批次历史记录中具有很高的准确率
吞吐量效率 较低的单次请求吞吐量 更高的总吞吐量
实现复杂度 中等,需要快速查找结构 更高,需要队列管理和调度
最适合 API、Webhook、实时系统 数据管道、分析、ETL
故障恢复 崩溃时丢失内存状态 可以从存储中重放批处理作业

详细对比

核心机制

请求级去重会在每个请求的入口点拦截该请求,并将其与最近出现的标识符记录进行比对。如果找到匹配项,则立即丢弃或合并该请求。批处理级去重则采用相反的方法,它允许请求累积在队列或暂存区中,然后在批处理窗口关闭时对整个集合执行去重操作。

延迟与吞吐量之间的权衡

这两种方法之间的根本矛盾在于速度与规模的权衡。请求级系统每次调用仅增加几微秒的开销,因此非常适合需要即时响应的用户。批处理级系统牺牲了这种即时性,但换取了单位计算资源下处理更多记录的能力,因为去重逻辑可以针对批量操作而非单条记录查找进行优化。

准确度和检测窗口

由于请求级去重通常依赖于有限的内存,因此它只能捕获在该时间窗口内出现的重复项。几个小时后出现的重复项则会被漏掉。而批处理级去重会与整个累积数据集进行比较,因此无论重复项最初出现的时间如何,它都能捕获到它们。这对于上游系统长时间重试或重放请求至关重要。

基础设施和成本

大规模运行请求级去重需要像 Redis 或 Memcached 这样快速的分布式内存存储,在高请求量下成本会很高。批处理级去重则依赖于成本更低的磁盘存储和调度计算,通常运行在竞价型实例上或非高峰时段。这种成本优势使得批处理更适合处理高容量、低紧急程度的工作负载。

故障处理

当请求级系统崩溃时,其内存中的去重状态会丢失,这意味着重启后,已经过滤掉的重复数据可能会漏掉。批处理级系统在这方面更具弹性,因为原始请求存储在持久存储中,可以简单地重新处理。因此,对于那些重复处理会带来显著成本或风险的工作负载而言,批处理去重是更安全的选择。

优点与缺点

请求级重复数据删除

优点

  • + 实时重复检测
  • + 增加的延迟极小
  • + 很容易理解
  • + 防止过早浪费计算资源。

继续

  • 内存窗口有限
  • 更高的基础设施成本
  • 州在车祸中损失
  • 水平方向更难扩展

批量级去重

优点

  • + 高检测精度
  • + 更便宜的存储方案
  • + 能够抵御失败
  • + 规模化吞吐量更高

继续

  • 引入处理延迟
  • 需要队列管理
  • 更复杂的日程安排
  • 不适用于实时需求

常见误解

神话

请求级去重可以捕获所有重复项,无论它何时到达。

现实

实际上,请求级系统只能检测内存窗口内的重复项。一旦记录过期,重新发送的请求将被视为新记录,因此大多数生产系统会将其与二次批处理流程结合使用,以确保完整性。

神话

批量级去重速度总是较慢,因此效果也较差。

现实

延迟并非唯一重要的指标。批量级去重通常能带来更高的成本效益、更高的准确率和更强的容错能力,因此对于许多大规模数据工作流程而言,它是更佳的选择。

神话

你的整个系统必须采用一种方法。

现实

大多数成熟的云架构都结合了这两种机制。请求级去重用于快速过滤,而批处理级去重则作为安全网,用于捕获任何漏网之鱼。

神话

布隆过滤器能够实现请求级去重,而且精度非常高。

现实

布隆过滤器可能会产生误报,这意味着一些合法的请求会被丢弃。由于其设计上基于概率,因此使用布隆过滤器的系统通常会为关键操作添加二次验证步骤。

神话

批量级去重无法扩展到实时工作负载。

现实

借助 Apache Flink 或 Spark Structured Streaming 等现代流处理框架,批处理式去重可以在微批处理上运行,延迟仅为几秒钟,模糊了两种方法之间的界限。

常见问题解答

请求级去重和批处理级去重的主要区别是什么?
关键区别在于时机。请求级去重会在每个请求到达时立即检查并删除重复项,而批处理级去重则会在一定时间窗口内收集请求,然后再删除重复项。前者优先考虑低延迟,后者优先考虑彻底性和成本效益。
哪种去重方法更适合 API 网关?
请求级去重通常最适合 API 网关,因为用户期望同步响应,而重复的 API 调用往往意味着重试或错误,这些都需要立即捕获。添加批处理级去重作为辅助层可以进一步减少下游资源浪费。
批量级去重可以实时进行吗?
是的,现代流处理引擎可以对微批次数据进行去重,延迟低至一到五秒。这种方法既能提供接近实时的处理效果,又能兼具批处理效率的优势。
请求级去重使用哪些数据结构?
常见的选择包括用于精确匹配的哈希集、用于内存高效概率匹配的布隆过滤器以及用于有限内存窗口的LRU缓存。Redis和Memcached是分布式部署中常用的后端存储。
批量级去重如何处理超大型数据集?
大规模批量去重通常使用分布式处理框架,例如 Apache Spark 或 Hadoop。记录按去重键的哈希值进行分区,在每个分区内进行排序,然后通过比较相邻条目进行合并,从而保持内存使用量在可控范围内。
请求级去重比批处理级去重成本更高吗?
是的,每次请求都需要进行内存查询,因为每次调用都需要快速的内存查找。规模化后,低延迟数据存储的基础设施成本会迅速累积。批量级去重可以将这部分成本转移到调度计算和更便宜的磁盘存储上。
如果请求级去重系统崩溃会发生什么?
内存中已查看请求的状态会丢失,因此之前已过滤的重复请求在重启后可能会再次被处理。为了缓解这个问题,许多系统会将去重状态持久化到磁盘,或者使用预写式日志,以便在系统恢复时重放。
能否将这两种方法结合到一个架构中?
没错,这在生产系统中很常见。请求级去重处理用于立即过滤的热路径,而批处理作业会定期运行,以捕获任何漏过内存窗口或在系统中断期间到达的重复项。
哪种方法更适合日志摄取管道?
对于日志摄取,通常首选批量级去重,因为日志数量庞大,可以容忍一定的延迟,并且通常需要在较长的时间窗口内进行去重。Logstash、Flink 和 Spark 等工具都原生支持这种模式。
如何选择批量处理的去重窗口大小?
窗口大小取决于重复数据实际到达所需的时间。对于 webhook 重试,几个小时可能就足够了。而对于几天后才重放的分析数据,则可能需要 24 小时或更长的窗口。这始终需要在延迟和完整性之间进行权衡。

裁决

当您的系统需要实时响应,且重复请求会浪费昂贵的计算资源或造成用户可见的问题时,例如在支付 API 或 Webhook 接收器中,请选择请求级去重。当您处理大量数据,允许一定的延迟,并且需要在较长的时间窗口内进行彻底的重复检测时,例如在分析数据采集或日志处理管道中,请选择批处理级去重。

相关比较