Kafka Python的生产者和消费者

Kafka Python的生产者和消费者

在本教程中,我们将使用Python构建Kafka Producer和Consumer。除此之外,我们还将学习如何在Kafka中设置配置以及如何使用组和偏移量概念。

建立

对于本教程,我们应该在计算机上安装python。另外,我们需要访问在我们的设备或某些服务器上运行的Apache Kafka。您可以检查如何在Windows上安装Apache Kafka。除此之外,我们需要python的_kafka_ 库来运行我们的代码。要解决此问题,请在系统上运行以下命令

pip install kafka

卡夫卡生产者

===

让我们开始创建自己的Kafka Producer。我们必须从kafka库导入KafkaProducer。我们还需要将Kafka服务器的代理列表提供给Producer,以便它可以连接到Kafka服务器。我们还需要提供要向其发布消息的主题名称。这是创建生产者所需的最小配置。

from kafka import KafkaProducer

bootstrap_servers = ['localhost:9092']
topicName = 'myTopic'

producer = KafkaProducer(bootstrap_servers = bootstrap_servers)
producer = KafkaProducer()

我们可以使用以下代码开始向该主题发送消息。

ack = producer.send(topicName, b'Hello World!!!!!!!!')

metadata = ack.get()
print(metadata.topic)
print(metadata.partition)

上面的代码将消息发送到Kafka服务器中名为“ myTopic”的主题。但是,如果该主题尚未出现在Kafka服务器中怎么办?在这种情况下,Kafka会使用该名称创建一个新主题并向其发布消息。方便吗?但是您应该记住要检查主题名称中是否存在拼写错误。

如果要为Producer设置更多属性或更改其序列化格式,则可以使用以下代码行。

producer = KafkaProducer(bootstrap_servers = bootstrap_servers, retries = 5,value_serializer=lambda m: json.dumps(m).encode('ascii'))

卡夫卡消费者

完成创建Producer的工作后,现在让我们开始使用python构建Consumer,看看这是否同样容易。导入KafkaConsumer后,我们需要设置提供引导服务器ID和主题名称,以与Kafka服务器建立连接。

from kafka import KafkaConsumer
import sys

bootstrap_servers = ['localhost:9092']
topicName = 'myTopic'

consumer = KafkaConsumer (topicName, group_id = 'group1',bootstrap_servers = bootstrap_servers,
auto_offset_reset = 'earliest')

如我们所见,我们需要设置哪个组消费者属于。另外,我们需要指定偏移量,此使用者应该从该偏移量读取主题中的消息。在上述情况下,我们最早指定了auto_offset_reset,这意味着此使用者将从主题的开头开始读取消息。

之后,我们可以开始阅读主题中的消息。与每条消息一起,我们还获得了一些其他信息,例如消息所属的分区,在该分区中的偏移量和键。

try:
    for message in consumer:
        print ("%s:%d:%d: key=%s value=%s" % (message.topic, message.partition,message.offset, message.key,message.value))

except KeyboardInterrupt:
    sys.exit()

这将以以下格式打印输出。

就是这个。我们已经在python中创建了第一个Kafka使用者。我们可以看到该使用者已经阅读了该主题的消息并将其打印在控制台上。

Docker 运行Kafka

使用的是 zerocode 提供的docker-compose配置文件。

---
version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:5.0.1
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    # -----------------------------------------------------------------------------
    # For connections _internal_ to the docker network, such as from other services
    # and components, use kafka:29092.
    #
    # See https://rmoff.net/2018/08/02/kafka-listeners-explained/ for details
    # -----------------------------------------------------------------------------
    image: confluentinc/cp-kafka:5.0.1
    depends_on:
      - zookeeper
    ports:
      - 9092:9092
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

注意这里的 PLAINTEXT_HOST://localhost:9092 使用的是localhost, 所以在容器外部访问是没有问题,如果需要的是容器之间的访问,即生产才和消费者也在容器里运行,则需要改成hostname(如 kafka).

结论

我们已经学习了如何在python中创建Kafka生产者和消费者。

你可能感兴趣的:(kafka,docker-compose)