技术博客

← 全部文章

· XingAI Notification Platform

XNP Phase 2:先跑起来、里面先什么也没有的模块化单体

为什么 Phase 2 故意无聊

Phase 1 交了架构包:系统设计、ADR 0001–0018、C4、契约。下一步的诱惑是还没搞懂如何拒绝坏 JWT,就先上 SMS、模板、活动。

Phase 2 停在这里:只做管道。没有 Twilio,没有 SendGrid,没有假装已经接通的提供商。

「Foundation 完成」指什么

部件选择
形态模块化单体(Xnp.Api + Xnp.Worker + SharedKernel + Infrastructure)
数据库PostgreSQL 16 + EF Core — 租户、订阅者、outbox/inbox、审计
鉴权JWT + 租户中间件 — 未签名请求失败
消息IMessageBus + 内存总线;进程内 outbox 派发(单写者)
运维/health/live、/health/ready、OTel 钩子
本地docker compose 起 Postgres;full profile 起 API + DB

各应用仍不得直连 Twilio / SendGrid / FCM。它们以后打 XNP。今天 XNP 必须先是一个能拒绝、接受并派发 outbox、又不假装有提供商的进程。

钉住 Phase 2 落地的 ADR

  • ADR-0019 — Phase 2 foundation 骨架(退出标准:构建、测试、compose、JWT、健康检查)。
  • ADR-0020 — Phase 2 保留进程内 outbox 派发;生产总线仍是 Azure Service Bus(ADR-0003),留给后续阶段。

没交付什么

订阅者 CRUD 竖切、模板、SMS、调度、活动、管理台、生产 Service Bus 消费者。

那是 Phase 3+。路线图已经写明:先一条竖切,再横向铺开。

要点

空而诚实,好过半接通道。有人喊「就接一下 Twilio」时,Phase 2 就是你有理由拒绝跳过的脚手架。

延伸阅读: docs/architecture/ · 同仓 ADR-0019 / ADR-0020。