我使用Kafka维护一个Python服务,该服务应该并行处理以有效处理每条消息的慢速API请求。
我在Python上使用了多处理模块,为消费者使用了kafka-python。
ZooKeeper和Kafka 2.11在同一个Ubuntu服务器上运行,其中大部分是defult配置。
该主题是使用另一个kafka-python生成器自动创建的,并设置为包含10个分区,以便同时使用多达10个消费者。
当我检查时,我发现队列真的很长,所以生产者发送了很多请求:
$ bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic usrReq --time -1
usrReq:8:1157
usrReq:2:1185
usrReq:5:1167
usrReq:4:1115
usrReq:7:1164
usrReq:10:1150
usrReq:1:1149
usrReq:9:1138
usrReq:3:1186
usrReq:6:1220
usrReq:0:6264
然而;虽然并行工作10个核心,但消费者需要很长时间(在下面的样本日志上117秒)才能从队列中获取下一条消息。
thread 7, consumer: 117.485 sec
api1:0.412 sec
api2:0.752 sec
db_insert:0.132 sec
这是每个进程创建自己的使用者,获取消息并对代码运行分析的方式:
consumer = KafkaConsumer(group_id='my-group',
bootstrap_servers='localhost',
value_deserializer=lambda m: json.loads(m.decode('ascii'))
consumer.subscribe(topics='usrReq')
while True:
msg = next(consumer).value['id']
method(msg)
此设置中可能出现问题?