批处理 vs. 流处理:有什么区别?

导航到

如果您读过 DevRel Katy Farmer 的精彩文章,Kapacitor 和连续查询:如何决定您需要哪个工具,那么您就会知道,当我们的社区发声时,我们会倾听。因此,为了与这种观点保持一致,并为了纪念我们自己的 Kapacitor 考拉,让我们解决另一个引起我们注意的常见社区问题:在 Kapacitor 任务中,我们应该何时使用批处理与流处理?

Image of InfluxData's Kapacitor Koala mascot<figcaption> 我们著名的 Kapacitor 考拉</figcaption>

现在,如果您对 Kapacitor 毫无概念,我建议您稍微阅读一下 此处此处,以便您快速了解情况。Kapacitor 是我们 TICK Stack 的最后一个组件,提供多种功能,例如数据转换、降采样和警报。Kapacitor 使用其自己的 DSL,称为 TICKscript,它允许您定义某些任务,然后可以在您的数据上执行这些任务——本质上,它是为您处理数据。

但问题在于:您如何选择是将数据作为批处理任务还是流任务来处理?

批处理任务

让我们首先讨论批处理任务。批处理是在特定时间间隔内分组在一起的数据点集合。另一个经常用于此的术语是数据窗口。当运行批处理任务时,Kapacitor 会定期查询 InfluxDB,从而避免在 RAM 中缓冲大量数据。在以下几种情况下,批处理是最佳选择

  • 执行聚合函数,例如查找一组数据间隔的平均值、最大值或最小值。
  • 不需要在每个数据点上运行警报的情况(因为状态更改可能不会经常发生)。您不希望被警报淹没!
  • 数据降采样采用大量数据点,仅保留最重要的数据(因此您仍然可以查看数据中的总体趋势)。
  • 对延迟要求不高的情况,延迟不会严重影响您的操作。
  • 具有超高吞吐量 InfluxDB 实例的情况,因为 Kapacitor 无法像数据写入 InfluxDB 那样快速地处理数据(这种情况在 InfluxDB Enterprise 集群中更频繁地发生)。

流任务

另一方面,我们有流任务。流任务创建对 InfluxDB 的订阅,以便写入 InfluxDB 的每个数据点也写入 Kapacitor。但应注意,流任务使用高百分比的可用内存,因此内存可用性是需要考虑的关键因素。以下是流处理最理想的情况

  • 如果您想实时转换每个单独的数据点(从技术上讲,这也可以通过批处理运行,但需要考虑延迟)。
  • 最低可能延迟对操作至关重要的情况。例如,如果需要立即触发警报,则运行流任务将确保尽可能小的延迟。
  • InfluxDB 正在处理高容量查询负载的情况,您可能希望减轻 InfluxDB 的一些查询压力。
  • 流任务通过数据的时间戳来理解时间;对于给定点何时精确进入窗口,没有竞争条件。另一方面,对于批处理任务,数据点可能会延迟到达并被排除在其相关窗口之外。

编写流任务的另一个优势是易于使用,只需使用 Kapacitor 的 TICKscript 定义任务,而无需深入研究为 InfluxDB 编写查询。但是,如果您对两者都感到满意,那么大多数情况下最好选择批处理,因为它使用的内存少得多。需要考虑的另一个因素是 Kapacitor 不仅限于与 InfluxDB 一起使用。例如,如果您想将数据直接从 Telegraf 发送到 Kapacitor,则必须作为流任务完成。

主要要点

  • 批处理任务定期查询 InfluxDB,使用有限的内存,但可能会给 InfluxDB 增加额外的查询负载。
  • 批处理任务最适合用于对数据执行聚合函数、降采样和处理大型时间窗口数据。
  • 流任务订阅来自 InfluxDB 的写入,给 Kapacitor 增加额外的写入负载,但可以减少 InfluxDB 的查询负载。
  • 流任务最适合用于低延迟对操作至关重要的情况。
当我们的社区发声时,我们会倾听。

我们很乐意听取您关于批处理和流任务的进展!请在我们的 社区站点 上向我们发送您的评论、问题、疑问和博客想法,并随时在 Twitter 上与我们联系

@InfluxDB @mschae16