Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
12 KiB
12 KiB
产教招聘数据中台生产架构建议
1. 目标架构
商业招聘平台 / 公共就业平台 / 校内系统
│
▼
Connector Runtime 集群
┌──────────────┬──────────────┬──────────────┐
│ BOSS Adapter │ 智联 Adapter │ 公共源 Adapter│
└──────────────┴──────────────┴──────────────┘
│
任务、分片、租约、心跳、重试、限速
▼
原始数据层
页面 / JSON / 文件 / 元数据 / SHA-256
│
▼
解析、清洗与标准化流水线
去重 → 企业归一 → 岗位归一 → 技能抽取
│
▼
Schema Registry + Quality Engine
│
▼
版本化标准层与数据产品交付层
Manifest / Schema / Quality / Lineage / Hash
2. 推荐服务边界
| 服务 | 核心职责 | 推荐存储 |
|---|---|---|
| Source Registry | 数据源、连接器、责任人、目标契约、运行策略 | PostgreSQL |
| Scheduler | 调度计划、任务、分片、租约、心跳、暂停和恢复 | PostgreSQL + Redis |
| Connector Runtime | 源端访问、原始响应生成、增量水位 | Kubernetes Jobs/Workers |
| Raw Store | 原始页面、响应、文件、请求元数据和哈希 | S3/OSS 兼容对象存储 |
| Parser Service | 按来源解析原始快照,输出来源 Schema | 流式计算或批处理 |
| Normalization Service | 企业、岗位、技能、地区和薪资统一 | PostgreSQL + 检索引擎 |
| Schema Registry | JSON Schema、兼容性、版本和发布 | PostgreSQL + Git |
| Quality Engine | 结构、完整性、唯一性、时效和业务规则 | 分布式 SQL/计算引擎 |
| Data Product Service | 标准层版本、Manifest、租户范围和发布回滚 | Lakehouse + PostgreSQL |
| Data Query Service | 标准、源端、原始快照和隔离记录的分页检索、字段权限与证据追溯 | Lakehouse/OLAP + 检索引擎 |
| Audit Service | 统一 trace_id、事件签名、证据和留存 | WORM/Object Lock |
| Operations Service | 告警、问题、工单、SLA、指派、处置时间线和通知待办 | PostgreSQL + 事件总线 |
| Release Approval Service | 候选版本、质量门禁、职责分离审批、稳定别名发布与回滚 | PostgreSQL + 策略引擎 |
| Tenant Delivery Service | 逐租户发送状态、幂等重试、回执验签、记录数/SHA校验和单租户回滚 | PostgreSQL + 消息队列 |
3. 连接器 SPI
每个商业或公共平台实现同一接口:
describe() 返回来源、能力、代码版本和目标 Schema
plan(scope, watermark) 根据地域、岗位族和水位生成分片
probe(shard) 小样本连接和结构预检
collect(shard, lease) 执行一个具备租约的采集分片
checkpoint(result) 提交幂等水位和运行摘要
snapshot(response) 生成原始对象、元数据和 SHA-256
parse(snapshot) 解析为来源 Schema
health() 返回入口可达性、延迟和错误分类
连接器发布物必须包含:
- 代码仓库、语义版本、提交摘要和构建镜像摘要;
- 支持的数据范围与来源 Schema;
- 小样本、结构回归和历史快照回放结果;
- 默认分片、并发、超时、重试和熔断策略;
- 变更日志、回滚版本和技术责任人。
4. 任务状态机
DRAFT
→ PROBING
→ READY
→ QUEUED
→ RUNNING
→ RAW_COMMITTED
→ PARSING
→ NORMALIZING
→ QUALITY_CHECKING
→ AWAITING_APPROVAL
→ PUBLISHED
异常分支:
RUNNING → THROTTLED → RUNNING
任意执行态 → PARTIALLY_FAILED → RETRYING
任意执行态 → QUARANTINED
发布态 → ROLLED_BACK
任务必须持久化:
job_id、source_id、connector_version、target_contract;- 调度计划、业务范围、分片数量、租约和优先级;
- 上次成功水位、本次水位、开始/结束时间;
- 请求量、原始对象数、解析数、有效数、隔离数;
- 错误分类、重试次数、保护动作和 trace_id。
5. 数据分层
Raw
只追加,不覆盖。保存源端响应、页面、文件、请求元数据、采集时间、任务、分片、连接器版本和哈希。
Source
按来源解析,字段与源端页面或接口一一对应。来源 Schema 独立版本化,解析可通过 Raw 快照重放。
Standard
映射到 JOB-SIGNAL、SCHOOL-EMPLOYMENT 等统一契约。企业、岗位、地区、薪资和技能完成归一。
Product
按数据产品、业务截止日期和租户范围生成不可变版本。报告和分析只引用已发布产品版本。
查询与浏览
厂商控制台的“采集数据”页面统一访问 Data Query Service,不允许前端绕过服务直接连接存储:
- 标准岗位:默认查询当前稳定
JOB-SIGNAL版本,支持来源、地区、岗位、企业和记录编号分页检索; - 源端记录:保留来源业务字段、来源URL、采集任务、连接器和解析器版本;
- 原始快照:先查询对象元数据、SHA-256和留存策略,再按权限获取短期只读访问地址;
- 隔离记录:显示失败规则、任务、快照、处置状态和重放入口,不进入稳定数据版本;
- 每次查询和导出都执行 RBAC、租户范围、字段权限和审计记录,详情页通过
record_id → task_id → snapshot_id → content_hash → data_version完成追溯。
6. 去重与版本
岗位信号建议同时维护:
- 来源幂等键:
source_platform + source_record_id; - 内容键:规范化企业、岗位、地区、职责摘要的哈希;
first_seen_at、last_seen_at、published_at;- 来源状态和平台状态;
- 原始版本、解析版本、标准版本和数据产品版本。
跨来源相似岗位不能直接删除,应形成岗位信号簇:
JobSignalCluster
├─ BOSS source record
├─ 智联 source record
├─ 公共招聘 source record
└─ 企业正式确认需求
分析层可对信号簇去重计数,同时保留每个来源的独立证据。
7. 校内数据要求
- 每条记录必须携带
tenant_id; - 学生使用不可逆
student_token,不接收姓名、身份证和明文学号; - 学校专业代码映射到教育部专业目录;
source_record_id + source_updated_at支持增量和幂等;- 业务状态必须携带确认时间、确认角色和来源系统;
- 文件导入、API 和数据库视图使用同一目标契约;
- 单租户失败隔离,不影响其他学校生产任务;
- 原始明细和租户交付均按数据范围策略隔离。
8. 导入与导出
导入
- 病毒与文件类型检查;
- 文件哈希、大小、编码和分片登记;
- JSON Schema 结构检查;
- 字段映射和代码字典验证;
- 小样本质量干跑;
- 全量暂存导入;
- 质量报告、错误明细和业务复核;
- 发布不可变版本。
导出
每个交付包包含:
- 业务数据文件;
- 精确版本 JSON Schema;
- 字段说明和代码字典;
- 质量报告与失败规则摘要;
- 来源与血缘清单;
PACKAGE-MANIFEST;- 每个文件的 SHA-256;
- 租户范围、截止日期和上一稳定版本。
候选、审批与租户交付闭环
Manifest 生成与发布必须是两个不同事务:
ISSUE / WORK_ORDER
→ INVESTIGATING
→ QUALITY_DISPOSITION(不可变)
→ FIX_REPLAY_VERIFIED
→ RELEASE_CANDIDATE
→ CANDIDATE_MANIFEST_FROZEN
→ PENDING_APPROVAL
→ APPROVED(approver != applicant)
→ PUBLISHED
→ TENANT_DELIVERY
→ DELIVERED
→ ACKNOWLEDGED(record_count 与 SHA-256 同时通过)
FIX_REPLAY、WAIVE、DISCARD必须记录原因、复核人、操作者、时间、trace_id 和证据;动作只追加,不可覆盖。只有FIX_REPLAY同时满足重放记录数一致、质量规则全量通过和独立复核签名时,才可写入VERIFIED并解除候选版本质量门禁。WAIVE不等于质量验证通过,若产品允许风险放行,必须进入单独的风险豁免审批状态、风险接受人和到期时间;DISCARD必须先验证丢弃范围、完整性阈值和候选差异并重建候选。两者不得复用普通VERIFIED/PASS。PACKAGE-MANIFEST V1.2增加release_id与release_status。每个租户数据文件必须携带自身记录数和 SHA-256,tenant_scope、文件路径和租户授权清单必须一致。- 候选 Manifest 的
release_status必须为DRAFT,并在提交审批时冻结;驳回后旧候选失效。发布事务生成PUBLISHEDManifest,approval_reference固定引用真实APPROVED审批单。 - 候选 Manifest 生成接口必须接受幂等键或服务端输入指纹;相同产品、租户、截止日期、格式、质量处置和交付摘要不得重复产生候选或审计事件。
- 后端必须强制申请人与审批人不同,前端校验只能作为交互提示。批准后再以原子别名切换发布稳定版本。
- 每个学校是独立交付状态机:
PENDING → SENDING → DELIVERED → ACKNOWLEDGED;异常使用FAILED → RETRYING,并支持单租户ROLLED_BACK。成功租户的幂等键阻止重复发送。 - 只有回执记录数等于包记录数、回执 SHA-256 等于 Manifest 文件摘要且回执签名有效时,服务端才能写入
ACKNOWLEDGED。 - 全局版本回滚和单租户回滚是不同操作。全局回滚必须先创建独立回滚审批,审批人与申请人分离,再执行稳定别名切换;两类回滚均需目标上一稳定版本、范围锁与不可变审计事件。
原型中的 localStorage 只用于静态演示刷新持久化,不能作为跨端协议或生产事实源。
9. 安全与运维
- 源端凭据使用 Vault/KMS 管理,配置和日志只保存密钥引用;
- 采集节点使用独立网络出口策略与最小权限;
- 控制台操作采用 RBAC,并区分运营、开发、发布审批和审计;
- 原始对象启用版本、对象锁和生命周期;
- 审计事件使用统一 trace_id,关键事件每日生成签名摘要;
- 指标覆盖采集成功率、源端延迟、解析成功率、队列延迟、质量和交付 SLA;
- 生产发布采用双版本别名,支持秒级回滚到上一稳定版本。
- 所有问题、工单、质量处置、审批、发布、交付和回执写入统一事件模型,至少携带
id/status/actor/time/trace/evidence; - 状态迁移 API 使用乐观锁或版本号避免重复审批、重复发布与重复发送;租户交付以
tenant_id + package_id + data_version作为幂等边界; - 通知中心从服务端待办查询生成,不依赖前端硬编码。
10. 静态原型与正式 API 边界
厂商端和校园端静态页面没有直接连接。原型共享的 TENANT-HZVTC、EDU-PKG-20260823-01、V2026.08.23 仅用于人工对照,页面中的“发送”“回执”“重试”“回滚”不会访问学校。
正式环境至少提供:
POST /issues/{id}/acknowledge|assign|investigate|resolve|close与带版本条件的工单更新;POST /quality-dispositions、POST /quality-dispositions/{id}/verify,处置动作写不可变事件存储;POST /releases/{id}/manifest|submit|approve|reject|publish|rollback,服务端执行质量门禁和职责分离;POST /deliveries/{tenant_id}/send|retry|acknowledge|rollback,执行租户授权、幂等、签名和回执校验;GET /notifications与统一审计事件查询/导出 API;- OAuth/OIDC、RBAC/ABAC、审批人实时身份、请求签名、幂等键、乐观锁、限流和 WORM 审计。
11. 分阶段实施
第一阶段
- Source Registry、Scheduler、Raw Store;
- BOSS、智联、百日招聘、NCSS、中国公共招聘网五个连接器;
JOB-SIGNAL V3.0;- 基础质量、岗位归一和 Parquet 交付。
第二阶段
- 国聘、区域人才网、校内就业和实习连接器;
- 企业归一、技能词典和薪资标准化;
- 多租户发布、Manifest、审批和回滚。
第三阶段
- 全量连接器回归平台;
- 质量规则编排、自动血缘和版本影响分析;
- 供需报告、专业诊断和大屏使用统一数据产品版本。