想象一下 kafka 主题中的消息是操作系统中 MDB 文件(MS Access)的存档路径(类似这样:path/to/folder/archive_name.zip
)。消费者采用该存档路径,将它们解压为临时文件,然后将解压文件转换为临时 CSV,然后加载到 Pandas 数据帧并进行一些处理。正如您所猜测的那样,这可能需要花费大量时间。让我们花 1 秒钟完成所有这些。
目标是快速处理它们。
据我所知,如果将消息路由到几个分区并使用相同数量的消费者来处理它们,则可以存档。
这是我现在用 aiokafka 做的事情:
import asyncio
import aiokafka
async def consume(consumer: aiokafka.AIOKafkaConsumer):
consumer.subscribe(['topic_name'])
async for msg in consumer:
# processing
await asyncio.sleep(1)
async def main():
consumer = aiokafka.AIOKafkaConsumer(
bootstrap_servers='localhost:9092',
group_id='MY_GROUP_ID',
)
await consumer.start()
try:
coros = []
for _ in consumer.partitions_for_topic('topic_name'): # f.e. 4 partitions
coros.append(consume(consumer))
await asyncio.gather(*coros)
finally:
await consumer.stop()
asyncio.run(main())
好吧,它似乎有效。但也许已经有针对此类任务的解决方案?
附言创建额外的 k8s-pods 会有所帮助。这里我们不需要 asyncio。只需指定消费者组即可。