Streaming 暂停流消耗

Streaming 暂停流消耗,streaming,integration,apache-kafka,messaging,confluent-platform,Streaming,Integration,Apache Kafka,Messaging,Confluent Platform,我正在开发一个在一分钟内处理很少记录的应用程序。请求速率大约为每分钟2次呼叫。这些请求是为一组数据创建和更新的。要求是交付保证、可靠交付、订购保证和防止任何消息丢失 我们的团队已经决定使用Kafka,我认为它不适合这个用例,因为Kafka最适合流式数据。相反,使用传统的消息模型,我们本可以过得更好。尽管Kafka确实提供了每个分区的排序,但如果消息数量少,数据源也少,那么在传统的消息传递系统上也可以实现相同的排序。这是一个公平的声明吗 我们使用Kafka streams来处理数据,处理要求我们查

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

  • 我们的团队已经决定使用Kafka,我认为它不适合这个用例,因为Kafka最适合流式数据。相反,使用传统的消息模型,我们本可以过得更好。尽管Kafka确实提供了每个分区的排序,但如果消息数量少,数据源也少,那么在传统的消息传递系统上也可以实现相同的排序。这是一个公平的声明吗

  • 我们使用Kafka streams来处理数据,处理要求我们查找外部系统。如果外部系统不可用,则当外部查找系统可用时,我们停止处理并自动向目标系统传递消息。 目前,我们通过在处理过程中连续循环来停止处理,并检查系统是否可用。 a) 这是在处理过程中中途停止流的最佳方法吗,这样它就不会拾取更多的消息了? b) 数据流框架是否设计为中途停止或暂停,以便在一段时间内完全停止使用数据流

  • 对于传统的消息代理来说,只有一个消费者(即排他队列)时,这才是公平的。一旦队列由多个消费者共享,就有可能出现无序传递消息的情况。这是因为任何一个使用者都可能无法处理和确认消息,从而导致消息被放回共享队列的头部,并随后被传递(无序)给另一个使用者。Kafka保证使用主题分区(在传统消息代理中不存在)跨多个使用者进行有序并行消费
  • 对于传统的消息代理来说,只有一个消费者(即排他队列)时,这才是公平的。一旦队列由多个消费者共享,就有可能出现无序传递消息的情况。这是因为任何一个使用者都可能无法处理和确认消息,从而导致消息被放回共享队列的头部,并随后被传递(无序)给另一个使用者。Kafka保证使用主题分区(在传统消息代理中不存在)跨多个使用者进行有序并行消费

  • 关于你的第2点:

    a) 这是在处理过程中中途停止流的最佳方法吗,这样它就不会拾取更多的消息了

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

    在Kafka Streams中,实现这种行为的首选API是处理器API,正如您所暗示的,这并不是真正推荐的模式

    尽管如此,您仍需要回答几个重要问题,例如:

    • 如果外部系统长时间停机,流处理应用程序的期望/要求行为是什么
    • 传入的数据速率是否会在某个时候增加,这可能意味着您需要放弃上面的暂停方法
    但同样,如果暂停是你想要或需要做的,那么你可以尝试一下

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

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


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

    关于第2点:

    a) 这是在处理过程中中途停止流的最佳方法吗,这样它就不会拾取更多的消息了

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

    在Kafka Streams中,实现这种行为的首选API是处理器API,正如您所暗示的,这并不是真正推荐的模式

    尽管如此,您仍需要回答几个重要问题,例如:

    • 如果外部系统长时间停机,流处理应用程序的期望/要求行为是什么
    • 传入的数据速率是否会在某个时候增加,这可能意味着您需要放弃上面的暂停方法
    但同样,如果暂停是你想要或需要做的,那么你可以尝试一下

    b) 数据流框架是否设计为停止或暂停