我有一个带有多个(24)主题的kafka流应用程序(Kafka v1.1.0)。这些主题中的四个是源主题,其余是目标主题。他们似乎已经重新处理了将系统时间更改为先前日期的数据。我有默认的代理配置,即:
before_validation :validate_email, on: :create
...
def validate_email
if (email_is_invalid)
errors.add(:base, error_message)
throw(:abort)
end
end
我详细研究了以下链接以及答案中发布的子链接:
1)Kafka Stream reprocessing old messages on rebalancing
2)How does an offset expire for an Apache Kafka consumer group?
以下JIRA讨论也阐明了此问题:
https://issues.apache.org/jira/browse/KAFKA-3806
在阅读了这篇文章之后,我对流使用者可能重新处理数据的情况有了一个了解。
但是,使用上述默认配置(用于我的设置的默认配置),如果偏移量丢失,即auto.offset.reset = latest
offsets.retention.minutes = 1440 #1 day
log.retention.hours = 168 #7 days
已过期,则使用者将重新平衡并从最新的已提交偏移量开始(不会任何内容),任何新的传入数据都将按原样处理。在这种情况下,不应进行任何数据重新处理,因此不会重复。
但是,在系统时间更改的情况下,偏移可能会不一致,即,源主题的偏移可能有offsets.retention.minutes
之后的更早日期的CommitTime
以后的日期。在这种情况下,如果某个主题的流量较低,并且没有收到超过CommitTime
的数据,则其偏移量将不再可用,而另一个流量较高的主题的偏移量将为offsets.retention.minutes
主题。
在这种情况下,流使用者的行为如何?在这种情况下是否有重复的机会。我真的很困惑。任何帮助将不胜感激。