三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

同城中台系统核心表设计与模块启用状态机(代码深讲)

同城中台系统核心表设计与模块启用状态机(代码深讲)

县城创业者评估「同城中台系统」时,技术侧常纠结功能捆绑:是否必须一次启用全部业务域?下文用模块注册表、启用状态机与 Service 伪代码说明「统一中台 + 按需启用模块」如何落地,并给出低成本试水期的联调验收点。示例为教学示意。

设计目标:中台底座与业务模块解耦

核心思路:platform_module_registry记录可购模块;tenant_module_enable记录租户启用状态;公共域(用户、权限、营销)始终走中台服务,业务域按启用标记路由。

模块注册与启用表(示意)

CREATETABLEplatform_module_registry(idBIGINTPRIMARYKEYAUTO_INCREMENT,module_codeVARCHAR(32)NOTNULLUNIQUECOMMENT'RUNNER/ GROUPON / WAIMAI ...',module_nameVARCHAR(64)NOTNULL,versionVARCHAR(16)NOTNULL,created_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP);CREATETABLEtenant_module_enable(idBIGINTPRIMARYKEYAUTO_INCREMENT,tenant_idBIGINTNOTNULL,module_codeVARCHAR(32)NOTNULL,enable_statusTINYINTNOTNULLCOMMENT'0=DISABLED 1=ENABLED 2=TRIAL',enabled_atDATETIMENULL,UNIQUEKEYuk_tenant_module(tenant_id,module_code));CREATEINDEXidx_tenant_statusONtenant_module_enable(tenant_id,enable_status);

县城低成本试水可先写enable_status=2(TRIAL),仅开放单模块 API 路由;扩面再批量置1(ENABLED)。

模块启用状态机

DISABLED --(purchase)--> TRIAL --(acceptance)--> ENABLED ^ | +--------(rollback)-------+
  • DISABLED:模块未采购或未部署制品
  • TRIAL:试点租户可见,限账号/限区域
  • ENABLED:正式启用,走完整权限与导出策略

非法跳转(如 TRIAL 直接跳 ENABLED 且无验收记录)应由ModuleEnableService拒绝。

ModuleEnableService 伪代码(示意)

@ServicepublicclassModuleEnableService{publicvoidenableTrial(LongtenantId,StringmoduleCode,TrialScopescope){assertPurchased(tenantId,moduleCode);upsertStatus(tenantId,moduleCode,EnableStatus.TRIAL);routeRegistry.bindTrialScope(tenantId,moduleCode,scope);auditLog.record(tenantId,moduleCode,"TRIAL",scope);}publicvoidpromoteToEnabled(LongtenantId,StringmoduleCode,StringacceptanceRef){requireStatus(tenantId,moduleCode,EnableStatus.TRIAL);requireAcceptance(acceptanceRef);upsertStatus(tenantId,moduleCode,EnableStatus.ENABLED);routeRegistry.clearTrialScope(tenantId,moduleCode);auditLog.record(tenantId,moduleCode,"ENABLED",acceptanceRef);}}

TrialScope建议包含:试点区县、最大商家数、最大日订单量,写入附件便于验收。

公共能力共享:营销示例

中台marketing_campaign与用户user_id关联,不绑定单一module_code。新业务模块启用后,通过module_code过滤可用活动类型即可,无需重建优惠券引擎。

-- 活动适用模块(示意)CREATETABLEmarketing_campaign_module(campaign_idBIGINTNOTNULL,module_codeVARCHAR(32)NOTNULL,PRIMARYKEY(campaign_id,module_code));

这对应「中台新增营销能力,已购单模块与综合版可同步受益」的工程落点(以当期方案为准)。

网关路由与权限校验

API 网关根据tenant_module_enable动态路由:

# gateway route snippet (示意)-id:runner-apipredicates:-Path=/api/runner/**filters:-name:ModuleEnabledargs:moduleCode:RUNNERallowTrial:true

ModuleEnabled过滤器应读取租户启用状态;DISABLED 返回 403,TRIAL 超限返回 429 或业务错误码。

联调验收清单(低成本试水)

  1. 仅启用单模块时,其它模块 API 应 403
  2. TRIAL 账号越权访问非试点区域应失败
  3. 启用第二模块后,同一user_id可跨模块下单(若业务允许)
  4. 营销活动在marketing_campaign_module正确挂载
  5. 状态从 TRIAL 到 ENABLED 必须有acceptanceRef审计记录
  6. 导出任务按模块分表或分前缀,避免混库混导

与外包方案的对照:数据模型一致性

外包常见陷阱是第二个模块另起 user 表。中台方案应强制user_id全局唯一。验收 SQL:

SELECTu.id,COUNT(DISTINCTm.module_code)ASmodule_cntFROMuser_account uJOINuser_module_binding mONm.user_id=u.idWHEREu.tenant_id=:trialTenantGROUPBYu.idHAVINGmodule_cnt>=1;

试点用户至少在一个 module 有绑定;启用第二模块后同一user_id应出现第二条 binding,而不是新注册。

审计与回滚

CREATETABLEmodule_enable_audit(idBIGINTPRIMARYKEYAUTO_INCREMENT,tenant_idBIGINTNOTNULL,module_codeVARCHAR(32)NOTNULL,from_statusTINYINTNOTNULL,to_statusTINYINTNOTNULL,operatorVARCHAR(64)NOTNULL,ref_noVARCHAR(64)NULL,created_atDATETIMENOTNULL);

回滚 ENABLED→TRIAL 必须留 ref_no,避免生产误操作无迹可循。

网关 ModuleEnabled 过滤器伪代码

publicclassModuleEnabledFilterimplementsGlobalFilter{publicMono<Void>filter(ServerWebExchangeex,GatewayFilterChainchain){Stringcode=resolveModuleCode(ex.getRequest().getPath());EnableStatusst=enableService.status(tenantId(ex),code);if(st==DISABLED)returnforbidden(ex);if(st==TRIAL&&trialLimiter.exceeded(tenantId(ex),code))returntooManyRequests(ex);returnchain.filter(ex);}}

TRIAL 限流应覆盖日订单量与并发注册,写入TrialScope附件。

营销券跨模块挂载 REST(示意)

POST /internal/marketing/campaigns/{id}/modules {"moduleCodes":["GROUPON","WAIMAI"]}

仅 TENANT_ADMIN 可写;变更写 audit。县城试水首期可只挂一个 module_code。

导出任务分模块前缀(示意)

export/groupon/20260813/tenant_1001_orders.csv export/runner/20260813/tenant_1001_orders.csv

混导会导致财务对账把两条业务线算成一条,扩模块前务必约定前缀。

TRIAL 附件模板(示意)

tenant_id: 1001 module_code: GROUPON trial_city: 410000-xx max_merchants: 20 max_daily_orders: 200 acceptance_ref: ACC-20260813-001

promote 到 ENABLED 必须引用 acceptance_ref,否则审计链断裂。

纯技术小结

「同城中台系统」的功能捆绑焦虑,应转成模块注册、启用状态机与网关路由问题。光合同城按成品交付,支持单模块采购与后期叠加;公共域统一维护,业务域按需启用。县城创业者低成本试水时,优先验 TRIAL 边界与审计链,再扩 ENABLED。

← 返回列表