以下是一个完整的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')))
============== 使用说明 ==============
"""
-
启动Zookeeper和Kafka服务器
-
创建Topic: kafka-topics.sh --create --bootstrap-server localhost:9092
--replication-factor 1 --partitions 1 --topic user_actions -
运行生产者(一个终端): python producer.py
-
运行消费者(另一个终端): python consumer.py
-
观察控制台输出,可以看到生产消费的全流程 """
代码结构说明:
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
)
- 异常处理增强:
# 生产端发送消息时添加回调
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}")
# 可以将错误消息保存到死信队列
- 性能优化:
- 生产者使用批量发送(linger_ms参数)
- 消费者调整fetch参数
- 使用异步处理(如结合asyncio)
- 数据验证:
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)