我厌倦了链接
https://cwiki.apache.org/confluence/display/KAFKA/0.8.0+SimpleConsumer+Example
使用SimpleConsumer消费消息但在使用消息时我发现了一些突然的行为如下:
消费者正在使用来自特定分区的消息。但问题是当我的消费者正在运行并且我使用生产者将消息推送到主题时它会消耗来自该分区的消息。但是如果我的消费者目前没有运行并且我将一些消息推送到该主题并再次启动消费者,则它不会消耗由生产者推送的消息,但是它又准备消耗将被推送的消息。我正在使用LatestTime()而不是EarliestTime(),因为我只想使用未经处理的消息。
例如
案例-1
消费者正在运行:
制作人将M1,M2,M3消息推送到主题1的分区1
结果:消费者将消费所有三条消息。
案例 - 2
消费者未运行
制作人现在将m4,m5 m6 messgae推送到主题1的分区1
现在调用消费者
结果:消费者不会消费消费者m4,m5,m6但是如果我将检查偏移量然后将其设置为7.这意味着生产者已将偏移量提前到7,同时产生消息,因此消费者将消费来自现在偏移7
请理想的是,当消费者再次出现时,它应该从m4读取消息。
答案 0 :(得分:0)
你做错了。
首先,我不确定SimpleConsumer
是您正在寻找的。它会强迫您自己管理偏移量(例如,它根本不会向Zookeeper提供偏移量,每次再次启动SimpleConsumer
时它将再次获取相同的消息)。 SimpleConsumer
无法理解“已处理的消息”。它所能做的只是从一些偏移量开始取出并继续取出,直到你说“停止”。
无论如何,如果您打算自己提交已处理的偏移量,则应使用EarliestTime
(auto.offset.reset=smallest
配置条目)。 auto.offset.reset
表示如果您的消费者使用错误的偏移进行了初始化(如果我没记错,则SimpleConsumer
初始化为-1
偏移,这显然是错误的)它会重置为{{1} }可用(smallest
)或EarliestTime
可用(largest
)偏移量。
为了更清楚这里的例子:
您的LatestTime
:
您创建一个使用者并将其指向主题1分区1.由于它最初使用错误的偏移进行初始化,它会向代理询问一些适当的偏移量(这里是Case-1
或smallest
的位置偏移重置进来)。如果您尚未生成任何消息,则largest
和smallest
偏移量均为largest
,因此当您生成某些消息时,您的消费者将获取这些消息。
0
:
你产生N条消息(比如7)。然后你开始Case-2
。同样,它使用错误的偏移进行初始化,并要求代理进行适当的偏移。 SimpleConsumer
重置偏移量为smallest
,0
偏移量为largest
。在您的示例中使用7
,您的消费者将使用偏移LargestOffsets
重新初始化并开始使用它。
一般来说,看看高级消费者,在大多数情况下,这就是你要找的东西。 这是link