暂停流消费

Pausing Stream Consumption

我正在开发一个在一分钟内处理很少记录的应用程序。请求率约为每分钟 2 次调用。这些请求是针对一组数据创建和更新的。要求是交付保证、可靠交付、订购保证和防止任何消息丢失。

  1. 我们的团队决定使用 Kafka,我认为它不适合用例,因为 Kafka 最适合流式数据。相反,我们也可以使用传统的消息模型。尽管 Kafka 确实提供按分区排序,但如果消息数量少且数据源也少,则可以在传统消息系统上实现同样的功能。这样的说法公平吗?

  2. 我们正在使用 Kafka 流处理数据,处理过程需要我们查找外部系统。如果外部系统不可用,那么我们将停止处理并在外部查找系统可用时自动将消息传递到目标系统。 目前,我们通过在处理过程中不断循环并检查系统是否可用来停止处理。 a)这是在处理过程中停止流的最佳方式,这样它就不会再接收任何消息了吗? b) 数据流框架是否设计为中途停止或暂停,以便它们在一段时间内完全停止使用流?

  1. 对于只有一个消费者(即独占队列)的传统消息代理来说,这只是一个公平的说法。一旦队列被多个消费者共享,就会有消息乱序传递的可能。这是因为任何一个消费者都可能无法处理和确认一条消息,导致消息被放回共享队列的头部,随后(无序)传递给另一个消费者。 Kafka 使用主题分区(传统消息代理中不存在)保证多个消费者按顺序并行消费。

关于你的第 2 点:

a) Is that the best way to stop stream midway while processing so that it doesn't pick up any more messages ?

如果像您的情况一样,您的传入数据速率非常低(每分钟几条记录),那么当所需的依赖系统当前不可用时暂停处理输入流可能没问题。

在 Kafka Streams 中,实现这种行为的首选 API 是处理器 API。

即便如此,您还是需要自己回答几个重要的问题,例如:

  • 如果外部系统长时间停机,您的流处理应用程序的 desired/required 行为是什么?
  • 传入数据速率是否会在某个时候增加,这可能意味着您需要放弃上述暂停方法?

但同样,如果暂停是您想要或需要做的,那么您可以尝试一下。

b) Are data stream frameworks even designed to be stopped or paused midway so they stop consuming the stream completely for some time ?

一些流处理工具允许您这样做。使用它们是否是最佳模式是另一个问题。

例如,您还可以考虑以下替代方案:您也可以自动将外部系统的数据提取到 Kafka 中,例如通过 Kafka 的内置 Kafka Connect 框架。然后,在 Kafka Streams 中,您可以将导出的数据读入 KTable (think of this KTable as a continuously updated cache of the latest data from your external system), and then perform a stream-table join between your original, low-rate input stream and this KTable. Such stream-table joins are a common (and recommended) pattern to enrich an incoming data stream with side data(免责声明:我写了这篇文章);例如,使用最新的用户配置文件信息丰富用户点击事件流。这种方法的优点之一——与您当前的查询外部系统结合暂停行为的设置相比——是您的流处理应用程序将与外部系统的可用性(和可伸缩性)分离。