我目前正在探索kafka作为一个简单问题的初学者。
有一个 Producer 将消息推送到一个主题,但会有 是 n 火花应用程序消费者的数量按摩数据 kafka并插入数据库(每个消费者插入到不同的 表)。
消费者是否有可能会失去同步(比如消费者的某些部分会在相当长的一段时间内停电),然后 一个或多个使用者不会处理消息并插入表 ?
假设代码始终正确,则不会出现异常 按摩数据。处理每条消息都很重要 只有一次。
我的问题是Kafka是否为我们处理这部分内容,或者我们是否必须编写其他代码以确保不会发生这种情况。
答案 0 :(得分:0)
您可以对使用者进行分组(请参阅group.id
配置),并且分组的使用者可以分割主题的分区。一旦消费者下降,该组中的另一个消费者将接管被删除的分区读取的分区。
但是,可能存在一些问题:当消费者读取分区时,它会向Kafka提交偏移量,如果消费者在处理接收数据之后但在提交偏移量之前丢失,则其他消费者将从最新的可用偏移开始读取。幸运的是,您可以管理如何提交偏移的策略(请参阅消费者的设置enable.auto.commit
,auto.offset.reset
等)
Kafka and Spark Streaming guide提供了一些解释以及如何管理抵消的可能策略。
答案 1 :(得分:0)
通过设计,卡夫卡使生产者和消费者脱钩。消费者将尽可能快地阅读-消费者可以尽可能快地进行生产。
可以将消费者组织为“消费者组”,您可以进行设置,以便多个消费者可以从一个组中读取以及进行设置,以便单个消费者从其自己的组中读取。
如果您将1个消费者分为一组,则您(取决于您的确认策略)应该能够确保每条消息(每个消费者)仅被读取一次。
否则,如果您想从一个组中读取多个使用者-同样的事情-但消息会被n个使用者之一读取一次。