Commit Graph

3 Commits

Author SHA1 Message Date
hailin 9e0152ca0d fix: RegexRouter 精确匹配 outbox 表,防止 heartbeat 事件污染消费者
问题根因 (rwadurian 生产环境发现):
  - transforms.route.regex=".*" 将所有 CDC 变更事件(包括 heartbeat 表)
    统一路由到 outbox topic,导致消费者收到非 outbox 格式的消息
  - 消费者无法解析 heartbeat 消息 → prisma:error + "Unknown event format" 告警
  - 每 10 秒一次 heartbeat × 5 个 connector = 持续的日志噪音

修复方案:
  - transforms.route.regex 从 ".*" 改为 ".*outbox"
  - 只有匹配 *outbox 的 topic(即真正的 outbox 表变更)才被路由到目标 topic
  - heartbeat/signal 表的变更走默认 topic 命名(无消费者监听,自动过期)
  - heartbeat 仍在 table.include.list 中,确保 Kafka offset 正常推进
    → confirmed_flush_lsn 持续前进 → WAL 不积压

验证 (rwadurian 生产环境):
  - 修复后 mining-admin-service "Unknown event format" 告警清零
  - WAL lag 从 540MB 降至 30-97MB 正常波动
  - 5 个 connector 全部 RUNNING,heartbeat 正常(5s 内更新)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 07:04:17 -08:00
hailin 127f2cdd81 feat: Debezium CDC 安全加固 + WAL 防护 (来自 rwadurian 生产事故经验)
## 背景
rwadurian 2.0 服务器发生 Debezium CDC 事故:
- DBZ-7316 bug: Debezium ≤2.4 的 searchWalPosition 循环不推进 confirmed_flush_lsn
- PostgreSQL WAL 从正常涨到 306GB, 磁盘占用 23% → 修复后降至 6%
- Kafka Connect REST API 暴露公网, 被注入 3 个恶意 SSRF connector
- pg_logical_emit_message 心跳无效: 写入 WAL 但不经过 publication

## 变更内容

### 1. Debezium 版本锁定 (docker-compose.yml)
- debezium/connect:2.5 → debezium/connect:2.5.4.Final
- 2.5.1 修复 DBZ-7316, 2.5.4 为该系列最终稳定版

### 2. PostgreSQL WAL 安全阀 (docker-compose.yml)
- 新增 max_slot_wal_keep_size=10GB
- 限制单个 replication slot 最多保留 10GB WAL
- 超限后 PostgreSQL 使 slot 失效, 防止磁盘被吃满

### 3. 端口安全加固 (docker-compose.yml)
绑定 127.0.0.1, 禁止公网访问:
- PostgreSQL 5432 (数据库直连)
- Redis 6379 (无密码保护)
- Kafka Connect 8083 (SSRF 注入风险)
- Kafka 29092 (外部访问端口)
- Kong Admin 8001 (路由篡改风险)
- MinIO Console 9001 (默认密码)

### 4. 基础设施可用性 (docker-compose.yml)
- 所有基础设施服务添加 restart: unless-stopped
- Kafka Connect 添加 OFFSET_FLUSH_INTERVAL_MS=10s (默认 60s)

### 5. Debezium 支持表 (040_create_debezium_support.sql)
- debezium_heartbeat: 心跳表, singleton 约束, INSERT...ON CONFLICT DO UPDATE
- debezium_signal: 信号表, 用于增量快照等运维操作
- debezium_outbox_publication: 包含 outbox + heartbeat + signal 三表

### 6. Connector 配置 (scripts/debezium/outbox-connector.json)
- heartbeat TABLE 方式 (非 pg_logical_emit_message)
- publication.autocreate.mode=disabled (使用预建 publication)
- signal.enabled.channels=source,kafka (支持增量快照重放)
- ExtractNewRecordState + RegexRouter transforms

### 7. 部署脚本 (scripts/debezium/register-connectors.sh)
- 等待 Kafka Connect 就绪
- 支持创建和更新 connector
- 验证 connector 状态

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 06:42:03 -08:00
hailin ad93bc728f feat: 完成全部后端微服务开发 (10服务/373文件/15586行代码)
## 架构概览
- 10个微服务: 7 NestJS + 3 Go/Gin
- DDD + Clean Architecture (Domain/Application/Infrastructure/Interface 四层)
- Kong API Gateway (8080) 统一入口
- PostgreSQL + Redis + Kafka(KRaft) + MinIO 基础设施

## 微服务清单
| 服务 | 技术 | 端口 | 职责 |
|------|------|------|------|
| auth-service | NestJS | 3010 | JWT双Token认证(15min+7d)、注册/登录/刷新/登出 |
| user-service | NestJS | 3001 | 用户Profile、KYC审核、钱包(充值/提现)、消息 |
| issuer-service | NestJS | 3002 | 发行方入驻、券CRUD/搜索/购买、定价引擎、信用评分 |
| trading-service | Go/Gin | 3003 | 撮合引擎(价格-时间优先)、订单簿、做市商API |
| clearing-service | NestJS | 3004 | 交易结算、退款、Breakage、ASC 606会计分录 |
| compliance-service | NestJS | 3005 | AML(5模式)、OFAC筛查、Travel Rule、SAR报告 |
| ai-service | NestJS | 3006 | ACL反腐败层→外部AI Agent集群(含本地降级) |
| translate-service | Go/Gin | 3007 | 区块链地址映射翻译 |
| notification-service | NestJS | 3008 | 推送/短信/邮件/站内通知、事件消费 |
| chain-indexer | Go/Gin | 3009 | 区块链索引器(Mock) |

## Admin API (18个管理模块)
覆盖admin-web全部18+页面:
Dashboard、用户管理、系统管理、用户分析、发行方管理、券管理、
券分析、商户核销、交易监控、做市商管理、财务管理、报表中心、
风控中心、合规审计、争议处理、保险理赔、AI Agent面板、通知管理

## 数据库
- 31个SQL迁移 (000-031) + 种子数据
- 乐观锁(@VersionColumn) + 悲观锁(SELECT FOR UPDATE) + Redis分布式锁
- Outbox Pattern保证消息可靠投递 + 24h幂等窗口

## 共享包
- @genex/common: Guards/Decorators/DTOs/Outbox/Health/Locking/AI-Client
- @genex/kafka-client: 生产者/消费者/Topic定义/KRaft集群支持

## 部署与测试
- docker-compose.yml: 全栈一键启动
- Swagger文档: 7个NestJS服务 /docs 端点
- E2E测试脚本: scripts/run-e2e.sh (Auth→Profile→Wallet→Trading→Admin)
- 迁移脚本: scripts/migrate.sh + scripts/test-setup.sh

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:09:12 -08:00