Kafka生产者的数据分发策略

1、Kafka随机分发策略

示例代码:

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
    )

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

    # 表示当底层每一批数据发送成功后,都会调用此函数: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)
    # 2.2 异步有返回值方案
    for i in range(10):
        future = producer.send('kafka_test', f'num:{i+1},我爱python'.encode('utf-8'))  # 默认是异步
        future.add_callback(on_send_success).add_errback(on_send_error)

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

运行结果:

2、Kafka指定分区策略

示例代码:   【指定分区0】

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
    )

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

    # 表示当底层每一批数据发送成功后,都会调用此函数: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)
    # 2.2 异步有返回值方案
    for i in range(10):
        # 指定分区0
        future = producer.send('kafka_test', f'num:{i+1},我爱python'.encode('utf-8'), partition=0)  # 默认是异步
        future.add_callback(on_send_success).add_errback(on_send_error)

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

运行结果:

3、kafka hash取模策略

示例代码:   【执行多次,每个分区每次得到的数据都是一样的】

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
    )

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

    # 表示当底层每一批数据发送成功后,都会调用此函数: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)
    # 2.2 异步有返回值方案
    for i in range(10):
        # hash取模策略
        future = producer.send('kafka_test', f'num:{i+1},我爱python'.encode('utf-8'), key=f"{i+1}".encode('utf-8'))  # 默认是异步
        future.add_callback(on_send_success).add_errback(on_send_error)

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

运行结果:

4、 自定义分发策略

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值