Files
juwan-backend/docs/email-kafka-consumer-test-guide.md
T

267 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Email Consumer Kafka 投递与日志验证实验手册
## 1. 实验目标
验证 `email-task` consumer 是否能正常消费 Kafka 消息,并在日志中打印消费内容。
本实验同时给出两种验证方式:
1. `kubectl logs` 直接查看 Pod 日志
2. Grafana + Loki 查看聚合日志
---
## 2. 实验前提
### 2.1 需要满足的运行状态
```bash
kubectl -n juwan get pods -l app=email-task
kubectl -n kafka get pods
kubectl -n monitoring get pods
```
预期:
- `email-task` 至少 1 个 Pod 为 `Running`
- Kafka 集群有可用 broker(如 `my-cluster-kafka-pool-0`
- `loki/promtail/grafana``Running`(若需要 Loki 验证)
### 2.2 本次实验使用的关键配置
来自 `app/email/mq/etc/email.yaml`
- Broker: `my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9092`
- Topic: `email-task`
- Group: `email-consumer-group`
---
## 3. 实验步骤(详细)
## 步骤 1:确认 Topic 存在
### 目的
避免消息投递到不存在的 Topic,导致消费端无数据。
### 指令
```bash
kubectl -n kafka exec my-cluster-kafka-pool-0 -- \
/opt/kafka/bin/kafka-topics.sh \
--bootstrap-server my-cluster-kafka-bootstrap:9092 \
--list
```
### 预期结果
输出中包含:
- `email-task`
---
## 步骤 2:投递一条最小测试消息(纯文本)
### 目的
先验证链路通路(producer -> kafka -> consumer)是否正常,不引入 JSON 转义复杂度。
### 指令
```bash
kubectl -n kafka exec my-cluster-kafka-pool-0 -- /bin/bash -lc \
"printf 'test-email-message\\n' | \
/opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server my-cluster-kafka-bootstrap:9092 \
--topic email-task"
```
### 预期结果
命令正常返回(通常无额外输出)。
---
## 步骤 3:查看 consumer 日志(kubectl 直查)
### 目的
确认 consumer 实际收到消息并执行日志打印。
### 指令(回看最近日志)
```bash
kubectl -n juwan logs -l app=email-task --tail=120
```
### 指令(实时追踪)
```bash
kubectl -n juwan logs -l app=email-task -f --since=10m
```
### 预期日志示例
```text
Consume get message key: , value: test-email-message
```
说明:
- key 为空是正常的(本次 producer 未设置 key
- value 为投递内容,说明消费链路正常
---
## 步骤 4:投递业务消息(验证码 JSON)
### 目的
模拟真实业务 payload,验证 consumer 对业务消息格式的处理。
### 指令
```bash
kubectl -n kafka exec my-cluster-kafka-pool-0 -- /bin/bash -lc "cat <<'EOF' | \
/opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server my-cluster-kafka-bootstrap:9092 \
--topic email-task
{\"type\":\"verification_code\",\"email\":\"test@example.com\",\"code\":\"123456\",\"scene\":\"login\",\"expired_minutes\":5}
EOF"
```
### 预期结果
- producer 正常返回
- `email-task` 日志可看到包含 JSON 的消费日志
---
## 步骤 5:投递业务消息(活动通知 JSON)
### 目的
验证另一类业务消息(活动通知)通路。
### 指令
```bash
kubectl -n kafka exec my-cluster-kafka-pool-0 -- /bin/bash -lc "cat <<'EOF' | \
/opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server my-cluster-kafka-bootstrap:9092 \
--topic email-task
{\"type\":\"activity_notice\",\"email\":\"test@example.com\",\"title\":\"春季活动\",\"content\":\"满100减20\",\"activity_id\":\"A20260225\"}
EOF"
```
### 预期结果
- producer 正常返回
- consumer 日志出现活动消息内容
---
## 步骤 6:使用 Loki/Grafana 验证(可选)
### 目的
确认日志采集链路(Promtail -> Loki -> Grafana)正常,便于后续线上排查。
### 6.1 打开 Grafana
```bash
kubectl port-forward -n monitoring svc/grafana 3000:3000
```
浏览器:`http://localhost:3000`
### 6.2 在 Explore 中查询
使用 Loki 数据源,输入:
```logql
{job="kubernetes-pods", namespace="juwan", app="email-task"} |= "Consume get message"
```
若没有结果:
1. 把时间范围调大到 `Last 6 hours`/`Last 24 hours`
2. 放宽查询条件:
```logql
{job="kubernetes-pods", namespace="juwan", pod=~"email-task-.*"}
```
---
## 4. 一键复现实验命令(顺序执行)
```bash
# 1) 查看 topic
kubectl -n kafka exec my-cluster-kafka-pool-0 -- /opt/kafka/bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --list
# 2) 发测试消息
kubectl -n kafka exec my-cluster-kafka-pool-0 -- /bin/bash -lc "printf 'test-email-message\\n' | /opt/kafka/bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic email-task"
# 3) 看 consumer 日志
kubectl -n juwan logs -l app=email-task --tail=120
```
---
## 5. 常见问题与处理
### 问题 1:发消息命令报引号/EOF错误
现象:`unexpected EOF while looking for matching`
原因:Shell 引号转义不正确。
处理:
- 先用纯文本消息验证链路
- JSON 使用 here-doc`cat <<'EOF'`)方式,避免转义混乱
### 问题 2:发了消息但 consumer 无日志
排查顺序:
1. `email-task` 是否 Running
2. Topic 是否正确(`email-task`
3. consumer group 是否一致(`email-consumer-group`
4. 查看 Pod 实时日志(`-f`
5. 若只看 Loki,请放大时间窗口并放宽标签条件
### 问题 3Loki 查不到但 kubectl logs 能看到
说明业务正常,问题在日志采集查询链路:
- 检查 Promtail target 是否 ready
- 检查 Loki 查询标签/时间范围
- 参考 `docs/loki-log-troubleshooting.md`
---
## 6. 实验结论判定标准
满足以下任一即可判定消费链路可用:
1. `kubectl logs` 出现:`Consume get message ...`
2. Grafana Loki 查询出现对应消费日志
若两者都出现,说明:
- Kafka 投递正常
- Consumer 消费正常
- 日志采集与检索链路正常
---
## 7. 关联文档
- Loki 使用:`docs/loki-usage-guide.md`
- Loki 排错:`docs/loki-log-troubleshooting.md`
- Email 部署排错:`docs/email-task-deployment-troubleshooting.md`