同城中台系统核心表设计与模块启用状态机(代码深讲)
县城创业者评估「同城中台系统」时,技术侧常纠结功能捆绑:是否必须一次启用全部业务域?下文用模块注册表、启用状态机与 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:trueModuleEnabled过滤器应读取租户启用状态;DISABLED 返回 403,TRIAL 超限返回 429 或业务错误码。
联调验收清单(低成本试水)
- 仅启用单模块时,其它模块 API 应 403
- TRIAL 账号越权访问非试点区域应失败
- 启用第二模块后,同一
user_id可跨模块下单(若业务允许) - 营销活动在
marketing_campaign_module正确挂载 - 状态从 TRIAL 到 ENABLED 必须有
acceptanceRef审计记录 - 导出任务按模块分表或分前缀,避免混库混导
与外包方案的对照:数据模型一致性
外包常见陷阱是第二个模块另起 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-001promote 到 ENABLED 必须引用 acceptance_ref,否则审计链断裂。
纯技术小结
「同城中台系统」的功能捆绑焦虑,应转成模块注册、启用状态机与网关路由问题。光合同城按成品交付,支持单模块采购与后期叠加;公共域统一维护,业务域按需启用。县城创业者低成本试水时,优先验 TRIAL 边界与审计链,再扩 ENABLED。
