renatuly/LogiTrack
GitHub: renatuly/LogiTrack
一个基于 Java 和 Kafka 的异步微服务 pipeline 项目,模拟 BPM 风格流程编排并内置重试与死信队列的容错处理实践。
Stars: 0 | Forks: 0
# LogiTrack
模拟 BPM 风格流程工作流并内置事件处理实践的异步微服务 pipeline —— 包含 REST API、消息队列、异步 worker 和数据库状态协调。
客户端通过流程管理器服务提交一个流程,请求被持久化到 PostgreSQL 并发布到 Kafka,worker 服务消费该事件并通过第二个 Kafka topic 报告结果,随后流程管理器服务相应地更新数据库。
## 技术栈
Java 17 · Spring Boot 3 · Apache Kafka (KRaft) · PostgreSQL 16 · Docker / Docker Compose · JUnit 5 + Mockito
## 架构
```
Client
│ POST /api/v1/processes
▼
process-manager-service ──► PostgreSQL (persist, status=PENDING)
│
│ publish
▼
Kafka: process-events
│
│ consume
▼
worker-service (simulates ~2s of work)
│
│ publish result
▼
Kafka: process-results
│
│ consume
▼
process-manager-service ──► PostgreSQL (update status: COMPLETED / FAILED)
```
在多次失败时,消息将被路由到死信 topic (`process-events-dlt`),而不是无限重试。
## 前置条件
- 带有 Docker Compose v2 的 Docker Desktop,**或者**
- Java 17、Maven 以及本地 PostgreSQL + Kafka 实例
## 使用 Docker Compose 运行
1. 在项目根目录下,复制示例环境文件:
cp .env.example .env
2. 启动技术栈:
docker compose up --build
3. process-manager-service 可在 `http://localhost:8081` 访问
4. worker-service 没有 HTTP 端口 —— 它仅在后台作为 Kafka consumer 运行
## 示例请求
创建流程:
```
curl -X POST http://localhost:8081/api/v1/processes \
-H "Content-Type: application/json" \
-d '{"processType":"invoice"}'
```
获取所有流程:
```
curl http://localhost:8081/api/v1/processes
```
按状态过滤获取流程:
```
curl http://localhost:8081/api/v1/processes?status=PENDING
```
按 ID 获取单个流程:
```
curl http://localhost:8081/api/v1/processes/{id}
```
触发失败路径(用于测试重试/DLT 流程):
```
curl -X POST http://localhost:8081/api/v1/processes \
-H "Content-Type: application/json" \
-d '{"processType":"FAIL_TEST"}'
```
## 如何阅读日志
```
docker compose logs -f process-manager-service worker-service
```
**正常流程 (Happy path)** —— 在 POST 之后,查找:
- `process-manager-service`:确认事件已发布到 `process-events` 的日志行
- `worker-service`:`[WORKER] Received process event for ID: ...`,大约 2 秒后,结果会发布到 `process-results`
- 再次查看 `process-manager-service`:`ProcessResultListener` 获取结果并更新该行
通过后续的 `GET /api/v1/processes/{id}` 确认状态确实已更改 —— 它应该从 `PENDING` 变为 `COMPLETED`。
**失败路径** —— 设置 `processType: "FAIL_TEST"` 时,worker 在发布 `FAILED` 结果后抛出异常。观察重复的重试尝试(带有退避机制的 3 次重试),一旦耗尽,将出现一条日志行,指示消息已发送到死信 topic `process-events-dlt`。
## 测试
```
cd process-manager-service && mvn test
cd worker-service && mvn test
```
标签:Kafka, PostgreSQL, SonarQube插件, Spring Boot, 域名枚举, 异步任务编排, 版权保护, 请求拦截, 软件成分分析