Kafka生产者同步或者异步发送消息(保证数据不丢失)

本文档介绍了如何使用`kafka-python`库在Python中实现Kafka生产者的同步和异步发送消息。同步模式下,通过`future.get()`等待发送结果,确保消息成功送达;异步模式则无须等待,可以设置回调函数处理发送成功或失败的情况。示例代码详细展示了两种模式的实现方式。
摘要由CSDN通过智能技术生成

参考文档:Usage — kafka-python 2.0.2-dev documentation

同步方式

示例代码:

from kafka import KafkaProducer
from kafka.errors import kafka_errors


if __name__ == '__main__':
    print('演示python的kafka API:生产者的同步发送模式')

    # 创建kafkaProducer对象
    producer = KafkaProducer(
        bootstrap_servers=['node1:9092', 'node2:9093', 'node3:9094'],
        acks=-1
    )

    # 执行生产者同步方案
    future = producer.send('test_kafka', '我爱python'.encode('utf-8'))  # 默认是异步

    try:
        record_metadata = future.get()  # 同步发送模式,当发送失败(已经重试完成)后
        # 如果发送成功
        print(record_metadata.topic)
        print(record_metadata.partition)
        print(record_metadata.offset)
    except kafka_errors:
        print(kafka_errors)
    finally:
        producer.close()

运行结果:

异步方式

示例代码:

from kafka import KafkaProducer


if __name__ == '__main__':
    print('演示python的kafka API:生产者的异步发送模式')

    # 1.创建kafkaProducer对象
    producer = KafkaProducer(
        bootstrap_servers=['node1:9092', 'node2:9093', 'node3:9094'],
        acks=-1,
        linger_ms=5000
    )

    # 2.执行生产者异步方案
    # 2.1 异步无返回值方案
    # producer.send('test_kafka', '我爱python'.encode('utf-8'))  # 默认是异步
    # producer.flush()

    # 2.2 异步有返回值方案
    future = producer.send('test_kafka', '我爱python'.encode('utf-8'))  # 默认是异步

    # 表示当底层每一批数据发送成功后,都会调用此函数:add_callback
    def on_send_success(record_metadata):
        print(record_metadata.topic)
        print(record_metadata.partition)
        print(record_metadata.offset)

    # 表示当底层发送一批数据失败时,就会调用此函数:add_errback
    def on_send_error(excp):
        print(excp)

    future.add_callback(on_send_success).add_errback(on_send_error)

    # 为了演示效果,不使用flush,而是采用休眠的方式
    # 注意:2.2时,如果此时程序运行结束,数据是没法发送到Kafka的
    import time
    time.sleep(100)

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值