我正在开发一种在一分钟内处理极少数记录的应用程序。请求率约为每分钟2次。这些请求是为一组数据创建和更新的。要求是交付保证,可靠的交付,订购保证和防止任何消息丢失。
我们的团队决定使用Kafka,我认为它不适合用例,因为Kafka最适合流数据。相反,我们可以更好地使用传统的消息模型。虽然Kafka确实为每个分区提供排序,但如果消息数量较少且数据源也较低,则可以在传统的消息传递系统上实现相同的排序。这是一个公平的陈述吗?
我们正在使用Kafka流处理数据,处理要求我们对外部系统进行查找。如果外部系统不可用,那么当外部查找系统可用时,我们将停止处理并自动将消息传递到目标系统。 目前,我们通过在处理过程中不断循环并检查系统是否可用来停止处理。 a)这是在处理过程中中途停止流的最佳方法,以便它不再接收任何消息吗? b)数据流框架是否设计为在中途停止或暂停,以便它们在一段时间内完全停止使用流?
答案 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)