【发布时间】:2019-01-18 19:28:21
【问题描述】:
我正在尝试使用 kafka-python 构建一个应用程序,其中消费者从一系列主题中读取数据。消费者永远不会两次阅读同一条消息,但也永远不会错过任何一条消息,这一点非常重要。
一切似乎都工作正常,除非我关闭消费者(例如失败)并尝试从偏移量开始读取。我只能读取主题中的所有消息(这会创建双重读取)或仅收听新消息(并错过在故障期间发出的消息)。暂停消费者时我没有遇到这个问题。
我创建了一个孤立的模拟来尝试解决问题。
这里是通用生产者:
from time import sleep
from json import dumps
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers=['localhost:9092'])
x=0 # set manually to avoid duplicates
for e in range(1000):
if e <= x:
pass
else:
data = dumps(
{
'number' : e
}
).encode('utf-8')
producer.send('numtest', value=data)
print(e, ' send.')
sleep(5)
还有消费者。如果将auto_offset_reset 设置为'earliest',则将再次读取所有消息。如果auto_offset_reset 设置为'latest',则不会读取停机期间的任何消息。
from kafka import KafkaConsumer
from pymongo import MongoClient
from json import loads
## Retrieve data from kafka (WHAT ABOUT MISSED MESSAGES?)
consumer = KafkaConsumer('numtest', bootstrap_servers=['localhost:9092'],
auto_offset_reset='earliest', enable_auto_commit=True,
auto_commit_interval_ms=1000)
## Connect to database
client = MongoClient('localhost:27017')
collection = client.counttest.counttest
# Send data
for message in consumer:
message = loads(message.value.decode('utf-8'))
collection.insert_one(message)
print('{} added to {}'.format(message, collection))
我觉得自动提交无法正常工作。
我知道这个问题类似于this one,但我想要一个具体的解决方案。
感谢您帮助我。
【问题讨论】:
标签: python-3.x apache-kafka offset kafka-consumer-api kafka-python