探索流式应用的性能指标:延迟和吞吐量解析
批处理应用和流式应用在性能需求上有所区别。对于批处理应用而言,我们通常关心作业的总执行时间,即从处理引擎读取输入、执行计算、写回结果所需的时间。但在数据流处理中,由于流式应用会持续执行且输入可能是无限的,所以没有总执行时间的概念。相反,流式应用需要尽可能快地计算结果,并能处理高速的事件接入。因此,我们用延迟和吞吐来表示这两方面的性能需求。
延迟
延迟是指处理一个事件所需的时间,从接收事件到在输出中观察到事件处理效果的时间间隔。为了更直观地理解延迟,我们可以以去咖啡店喝咖啡为例。当你进门时,可能已经有其他顾客在里面了,需要排队等候。收银员收到你的付款后,将订单交给咖啡师准备饮品。饮品制作完成后,咖啡师会叫你的名字,你才能从吧台取走咖啡。在这个过程中,你在店内买咖啡的时间就是服务延迟,即从进门到喝到第一口咖啡的时间。
在流处理中,我们用时间片(如毫秒)来测量延迟。根据应用的不同,我们可能关注平均延迟、最大延迟或特定百分位数的延迟。例如,平均延迟为 10 毫秒表示平均每条数据在 10 毫秒内处理完毕,而第 95 百分位延迟在 10 毫秒内处理完毕意味着 95% 的事件都在 10 毫秒内处理。平均延迟可能掩盖了延迟分布的真实情况,使问题难以发现。举个例子,如果咖啡师在给你准备卡布奇诺前用光了牛奶,你就必须等待他再去补充。虽然这可能让你不太高兴,但对大多数顾客来说并不会有太大影响。
对于许多流式应用(如诈骗识别、系统告警、网络监测等)来说,保证低延迟至关重要。低延迟是流处理的一个关键特性,它衍生出了所谓的实时应用。现代流处理引擎如 Apache Flink 可以提供低至几毫秒的延迟。相比之下,传统批处理的延迟可能从几分钟到几小时不等。在批处理中,需要先批量收集事件,然后才能处理它们,因此处理延迟受制于每个批次中最迟事件的时间,并受到批次大小的影响。真正的流处理不会引入人为延迟等因素,只有这样才能将延迟降至极低,每个事件即时进入系统进行处理,延迟更加真实地反映了实际处理工作。
吞吐是衡量系统处理能力(处理速率)的指标,它告诉我们系统每单位时间可以处理多少事件。回到咖啡店的例子,如果营业时间是早上 10 点到晚上 10 点,一天服务了 600 名顾客,那么平均吞吐量就是 50人/小时。通常情况下,我们希望延迟尽可能低,而吞吐量则尽可能高。
吞吐量
吞吐量是计算每个单位时间的事件或操作数。但要注意,处理速率取决于数据到达速率,因此吞吐量低不一定意味着性能差。在流处理系统中,我们通常希望系统有能力处理以最大期望速率到达的事件,也就是关注峰值吞吐量,即系统负载时的性能上限。为了更好地理解峰值吞吐量的概念,我们假设一个流处理应用没有接收任何数据时,也不占用系统资源。当第一个事件进入时,系统会立即以尽可能低的延迟进行处理,就像早晨咖啡店开门后的第一位顾客立即享受服务一样。理想情况下,我们希望延迟保持平稳,不受事件到达速率的影响。但现实中,一旦事件到达速率过高,使系统没有空闲资源,系统就会开始缓冲事件。以咖啡店为例,你很可能在午餐时间看到这种情况:突然涌入大量顾客,导致排队点单。此时系统的吞吐量已经达到极限,提高事件到达速率只会使延迟更糟。如果系统持续以过高速率接收数据,缓冲区可能会耗尽,甚至造成数据丢失。这种情况通常被称为背压(backpressure),我们有多种策略来处理它。
延迟和吞吐量并不是相互独立的指标。如果事件在数据处理管道中传输时间过长,很难确保高吞吐量;同样,如果系统性能不足,事件容易积压缓冲区,需要一段时间才能处理。我们再通过咖啡店的例子来解释延迟和吞吐量如何相互影响。首先,需要明确的是,在无负载的情况下,延迟会达到最优。也就是说,如果咖啡店只有你一个顾客,你会得到最快的服务。然而,在高峰时段,顾客必须排队等候,这就增加了延迟。另一个影响延迟和吞吐量的因素是处理单个事件的时间,即每位顾客在店里花费的时间。假设现在是圣诞假期,咖啡师要在每杯咖啡上画圣诞老人,这会延长制作单杯咖啡的时间,导致每位顾客在店里的时间增加,整体吞吐量会降低。
那么,能否以某种方式同时获得低延迟和高吞吐量呢?或许这听起来不切实际,但在咖啡店的例子中,为了降低延迟,店主可以雇佣更熟练的咖啡师,他们会更快地制作咖啡。这样在高峰时段,店铺可以服务更多的顾客,自然吞吐量也会提高。另一种方法是雇佣更多的咖啡师,利用并行化解决问题。关键在于降低延迟实际上可以提高吞吐量。事实上,在流处理管道中使用并行化就是这种效果。通过并行处理多个数据流,可以降低延迟同时处理更多的事件。
小结
本文主要讨论了批处理应用和流式应用在性能需求上的区别,以及延迟和吞吐量在流处理中的重要性。延迟表示处理一个事件所需的时间,而吞吐量则是系统每单位时间内能处理的事件数量。对于流处理应用来说,低延迟是至关重要的特性,能够实现实时处理。同时,高吞吐量也是流处理系统的目标,代表着系统的处理能力。延迟和吞吐量是相互影响的,通过降低延迟可以提高吞吐量,而并行化是实现这一目标的关键方法。
(END)