暂停流消耗

时间:2016-08-11 08:03:56

标签: streaming integration apache-kafka messaging confluent

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

  1. 我们的团队决定使用Kafka,我认为它不适合用例,因为Kafka最适合流数据。相反,我们可以更好地使用传统的消息模型。虽然Kafka确实为每个分区提供排序,但如果消息数量较少且数据源也较低,则可以在传统的消息传递系统上实现相同的排序。这是一个公平的陈述吗?

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

2 个答案:

答案 0 :(得分:7)

关于你的观点2:

  

a)这是在处理时中途停止流的最佳方式,以便它不会再发送任何消息吗?

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

在Kafka Streams中,实现这种行为的首选API - 正如你暗指的那样,并不是真正推荐的模式 - 是处理器API。

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

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

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

  

b)数据流框架是否设计为在中途停止或暂停,以便它们在一段时间内完全停止使用流?

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

例如,您还可以考虑以下替代方案:您也可以自动将外部系统的数据摄取到Kafka中,例如通过Kafka的内置Kafka Connect框架。然后,在Kafka Streams中,您可以将此导出的数据读入KTable(将此KTable视为来自外部系统的最新数据的持续更新缓存),然后在原始数据之间执行流表连接,低速输入流和这个KTable。这种流表连接是enrich an incoming data stream with side data的常见(和推荐)模式(免责声明:我写过这篇文章);例如,使用最新的用户配置文件信息来丰富用户点击事件流。与您当前查询外部系统的设置相结合的暂停行为相比,这种方法的优点之一是您的流处理应用程序将与外部系统的可用性(和可伸缩性)分离。

答案 1 :(得分:3)

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