[消息中间件]python+kafka(实战2,使用kafka-python客户端)

208 阅读3分钟

以下是一个完整的Kafka生产消费示例代码,包含数据生产、消费和处理的完整流程。我们使用kafka-python库实现:

以下代码亲测可用

# 先安装依赖库:pip install kafka-python

# ============== 生产者 producer.py ==============
from kafka import KafkaProducer
import json
import time
from datetime import datetime
import random

# 配置Kafka服务器地址
BOOTSTRAP_SERVERS = ['localhost:9092']  # 本地, 端口号
TOPIC_NAME = 'user_actions'  # 主题名称

def create_producer():
    """创建Kafka生产者"""
    return KafkaProducer(
        bootstrap_servers=BOOTSTRAP_SERVERS,
        # 在定义生产者的时候,要记性数据的序列化, 因为在kafka中存储的是type字节类型
        value_serializer=lambda v: json.dumps(v).encode('utf-8') 
    )

def generate_mock_data():
    """生成模拟用户行为数据"""
    user_ids = ['user_001', 'user_002', 'user_003', 'user_004']
    actions = ['click', 'view', 'purchase', 'logout', 'login']
    
    return {
        "user_id": random.choice(user_ids), # 随机选择1个
        "action": random.choice(actions), # 随机选择1个
        "timestamp": datetime.now().isoformat(),
        "value": random.randint(1, 100) # 在1-100之间, 随机生成一个整数
    }

def produce_data(producer, topic):
    """持续生产测试数据"""
    try:
        while True:
            # 生成数据
            data = generate_mock_data()
            # 发送消息
            producer.send(topic, value=data) # 生产者会把data进行序列化处理
            print(f"Produced message: {data}")
            time.sleep(1)  # 每秒发送一条
    except KeyboardInterrupt:
        print("Stopping producer...")
    finally:
        producer.close()

if __name__ == "__main__":
    producer = create_producer()
    produce_data(producer, TOPIC_NAME)
from kafka import KafkaProducer,KafkaConsumer
import json
import time
from datetime import datetime
import random
# 创建消费者实例并配置参数
consumer = KafkaConsumer(
    'topic_1_test',  # 订阅的主题名
    bootstrap_servers=['localhost:9092'],  # Kafka服务器地址列表
    group_id='mygroup',  # 消费者组ID
    auto_offset_reset='earliest' # 当没有初始偏移量或当前偏移量无效时,自动重置偏移量到最早的记录
)

# 消费消息循环
for message in consumer:
    # 解码并打印消息内容
    print("Received message: {}".format(message.value.decode('utf-8')))  

============== 使用说明 ==============

"""

  1. 启动Zookeeper和Kafka服务器

  2. 创建Topic: kafka-topics.sh --create --bootstrap-server localhost:9092
    --replication-factor 1 --partitions 1 --topic user_actions

  3. 运行生产者(一个终端): python producer.py

  4. 运行消费者(另一个终端): python consumer.py

  5. 观察控制台输出,可以看到生产消费的全流程 """


代码结构说明:

1.  **生产者部分***   使用`KafkaProducer`创建生产者
*   生成模拟用户行为数据(包含用户ID、操作类型、时间戳等)
*   每秒发送一条JSON格式消息到Kafka

2.  **消费者部分***   使用`KafkaConsumer`创建消费者
*   订阅指定主题持续消费消息
*   `process_data`函数处理消息(可扩展添加业务逻辑)

3.  **数据处理***   示例处理逻辑添加了处理时间和状态字段
*   实际业务中可以添加:
    *   数据清洗验证
    *   数据存储(数据库、文件等)
    *   实时分析计算
    *   异常数据处理
    *   数据转发

扩展建议:

1.  **配置增强**```python
# 生产端可添加以下配置
KafkaProducer(
    acks='all',  # 消息确认机制
    retries=3,   # 重试次数
    compression_type='gzip'  # 压缩类型
)

# 消费端可添加以下配置
KafkaConsumer(
    max_poll_records=100,  # 单次拉取最大记录数
    session_timeout_ms=30000,
    heartbeat_interval_ms=10000
)
  1. 异常处理增强
# 生产端发送消息时添加回调
producer.send(topic, value=data).add_callback(
    lambda metadata: print(f"Message sent to {metadata.topic}[{metadata.partition}]")
).add_errback(
    lambda exc: print(f"Message failed: {exc}")
)

# 消费端添加异常捕获
try:
    process_data(message)
except Exception as e:
    print(f"Process message failed: {e}")
    # 可以将错误消息保存到死信队列
  1. 性能优化
  • 生产者使用批量发送(linger_ms参数)
  • 消费者调整fetch参数
  • 使用异步处理(如结合asyncio)
  1. 数据验证
from jsonschema import validate

schema = {
    "type": "object",
    "properties": {
        "user_id": {"type": "string"},
        "action": {"type": "string"},
        "timestamp": {"type": "string", "format": "date-time"},
        "value": {"type": "number"}
    },
    "required": ["user_id", "action"]
}

def process_data(message):
    try:
        validate(message.value, schema)
        # 处理有效数据...
    except ValidationError as e:
        print(f"Invalid data: {e}")

根据实际需求,可以扩展以下功能:

  • 使用Avro格式进行序列化
  • 添加监控指标(Prometheus指标)
  • 实现Exactly-Once语义
  • 集成到数据流水线(如Spark Streaming、Flink)