aiokafka:每个分区一个消费者

时间:2021-06-30 17:29:27

标签: python apache-kafka kafka-python

想象一下 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。只需指定消费者组即可。

0 个答案:

没有答案