ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

【A11】块同步与分布式消息架构

【A11】块同步与分布式消息架构 核心设计理念本系统的消息同步机制基于“写扩散”Fan-out策略即消息发送时由发送者将消息分解为每个接收者独立的消息块推送至创世节点或直接发送给接收者。核心思想借鉴了主流 IM 系统如 QQ、微信、钉钉的设计结合“类 Rust 变量模式”的所有权模型形成了一套去中心化的同步架构。数据有其主默认是只读修改走流程同步靠缓冲移交需审批归档仍可查销毁方终结。️ 核心数据模型1. 块Block同步的最小原子单元块是数据同步的最小原子单元内部保存无时间标识的裸数据所有数据项共享块的时间戳。/// 数据块同步的最小原子单元pubstructBlock{/// 块标识三元组pubid:BlockId,/// 块中的数据项裸数据无时间标识pubitems:VecBlockItem,}2. 块标识三元组 (TimeRange, Owner, Receiver)/// 块标识由时间范围、拥有者、接收者共同构成pubstructBlockId{pubtime_range:TimeRange,// 时间范围串联上下块pubowner_id:ContactId,// 拥有者发送方pubreceiver_id:ContactId,// 接收者单个接收者}接收者由授权对象Authority Target决定个人直接指定人员 ID群组系统根据群组成员关系展开为人员列表并据此推导每个成员的权限范围为每个人员生成独立的块岗位/角色系统根据岗位或角色定义展开为人员列表并据此推导权限一包一人每个块只对应一个接收者群组消息分解为多个独立块每人独立传输、独立确认、独立重试。TimeRange连续 单人单包每个接收者维护自己的块链顺序可控、重传精确、状态隔离。3. 消息缓冲区“邮箱”是比喻本质是创世节点的消息队列/存储区用于缓存和转发离线期间的数据变更。创世节点的备份和转发职责分开存储存储类型职责生命周期备份存储仓库完整数据块持久化长期保存转发队列邮局待投递任务块引用 路由信息投递完成即删除 同步流程拥有者推送块拥有者发送者 │ ├── 1. 创建数据内容 │ ├── 2. 确定授权目标个人/群组/角色 │ └── 系统展开为具体人员列表 │ ├── 3. 对每个接收者逐一处理 │ │ │ ├── 3.1 计算该接收者的权限范围 │ │ │ ├── 3.2 根据权限生成独立的块 │ │ └── BlockId: (TimeRange, OwnerId, ReceiverId) │ │ │ ├── 3.3 检查该接收者状态 │ │ ├── 在线 → 直接推送 │ │ └── 离线 → 存入创世节点缓冲 │ │ │ └── 3.4 同时发送至创世节点备份 │ └── 4. 所有接收者处理完成接收者同步块接收者用户 │ ├── 在线实时接收来自发送者或创世节点 │ ├── 离线创世节点缓冲 │ ├── 上线后创世节点优先通知发送者 │ ├── 发送者在线 → 发送者直接推送 │ └── 发送者离线 → 创世节点代为推送 │ └── 多端同步各端独立拉取 节点角色从全职到职业化分工系统演进的核心逻辑是“节点角色的专职化”——从早期每个节点都做所有事到后期不同节点各司其职。当前阶段全职节点所有节点平等在系统初期每个节点都是“全职”的——既是客户端也是潜在服务端。每个节点 发送者 接收者 轻量服务端 │ ├── 作为发送者创建块推送消息 ├── 作为接收者接收块拉取消息 └── 作为服务端缓存离线消息代为推送中间阶段分工萌芽部分节点专职化随着系统规模扩大部分节点开始承担更多服务职责节点类型职责创世节点全局目录、消息缓冲、离线代发活跃节点频繁发送承担更多推送任务普通节点日常使用依赖创世节点未来阶段职业化分工角色完全分离最终演变为成熟的“客户端-服务端”分离架构职业化分工未来阶段 服务端层专职服务 ├── 代理服务器 A ├── 代理服务器 B └── 代理服务器 C │ │ 提供服务 ▼ 客户端层专职使用 ├── 客户端 A1 ├── 客户端 B1 ├── 客户端 C1 ├── 客户端 A2 └── 客户端 B2演进对比维度全职节点当前职业化分工未来节点角色所有节点等同服务器/客户端分离职责范围每节点承担全部各司其职专人专职部署方式一键启动即可需分别部署服务端/客户端扩展性受限于单节点能力可独立扩展服务端容量运维成本无运维成本需要运维服务端集群适用规模小团队 100人大规模千人以上 离线状态分析1. 接收者离线接收者离线场景修正版 发送者在线 ├── 1. 创建块 → 准备发送给接收者 ├── 2. 检测到接收者离线 ├── 3. 将块存入创世节点缓冲区含上线通知注册 └── 4. 等待接收者上线通知 创世节点 ├── 5. 标记该块为“待投递” ├── 6. 注册上线通知接收者上线时通知发送者 └── 7. 等待接收者上线 接收者上线 ├── 8. 连接创世节点 ├── 9. 创世节点检测到接收者上线 │ ├── 10. 通知发送者接收者已上线 │ │ │ └── 11. 发送者在线→ 直接推送块给接收者 │ 或 │ └── 11. 发送者离线→ 创世节点代为推送 │ └── 12. 同步完成状态更新2. 拥有者离线创世节点轻量代理拥有者离线场景修正版 拥有者在线 ├── 1. 创建块准备发送 ├── 2. 将块上传至创世节点含接收者列表 └── 3. 拥有者离线关机/断网 创世节点轻量代理 ├── 4. 检测到拥有者离线 ├── 5. 接手推送任务 │ ├── 5.1 遍历该拥有者尚未送达的所有待推送块 │ ├── 5.2 检查每个接收者状态 │ │ ├── 在线 → 立即推送 │ │ └── 离线 → 存入缓冲区等待上线 │ └── 5.3 注册上线通知离线接收者上线时通知创世节点 └── 6. 确保所有消息送达 接收者上线 ├── 7. 连接创世节点 ├── 8. 创世节点检测到接收者上线 ├── 9. 推送离线期间积累的块 └── 10. 同步完成 拥有者重新上线 ├── 11. 自动通知创世节点已恢复 ├── 12. 创世节点取消代理 │ ├── 12.1 停止代为推送 │ └── 12.2 移交未完成的推送任务给拥有者 └── 13. 程序平滑切换无感知3. 双方离线双方离线场景修正版 发送者在线 ├── 1. 创建块 → 上传至创世节点 └── 2. 发送者离线 创世节点 ├── 3. 存储块到缓冲区 ├── 4. 标记状态发送者离线接收者离线 ├── 5. 注册上线通知等待发送者或接收者上线 └── 6. 等待任何一方上线 发送者先上线 ├── 7. 连接创世节点 ├── 8. 创世节点检测到发送者上线 ├── 9. 通知发送者有未完成的推送任务 ├── 10. 发送者接管推送任务 │ ├── 10.1 检查接收者状态 │ │ ├── 在线 → 直接推送 │ │ └── 离线 → 继续等待 │ └── 10.2 推送完成后通知创世节点 └── 11. 同步完成 接收者先上线 ├── 7. 连接创世节点 ├── 8. 创世节点检测到接收者上线 ├── 9. 检查发送者状态 │ ├── 在线 → 通知发送者推送 │ └── 离线 → 创世节点代为推送 └── 10. 接收者拉取离线块同步完成离线状态矩阵发送者状态接收者状态同步方式谁负责在线在线实时推送发送者 → 接收者在线离线上线后推送发送者优先创世节点兜底离线在线创世节点代发创世节点 → 接收者离线离线上线后推送发送者先上线优先创世节点兜底 数据与通信的职责分离模型核心原则系统分为两个层次各自承担不同职责创世节点在两个层面扮演不同角色层次职责创世节点角色核心机制数据层数据的备份、代理转发所有创建者的代理兜底备份数据创建者离线时代为推送通信层节点的寻址、连接、路由通信核心创建者身份指定代理人广播备用地址给所有客户端数据层创世节点作为所有创建者的代理兜底创世节点是数据的“保险箱”和“兜底代发员”——它备份所有数据但仅在创建者离线时才接管推送职责。数据层职责 ───────────────────────────────────────────────────────────────── 创建者拥有者在线 │ ├── 1. 创建数据推送数据 │ ├── 2. 同步数据到创世节点备份 │ └── 3. 创世节点保持静默仅存储 创建者离线 │ ▼ 创世节点代理模式 │ ├── 1. 检测到创建者离线 │ ├── 2. 接管数据推送职责兜底 │ ├── 检查接收者状态 │ ├── 在线 → 实时推送 │ └── 离线 → 存入缓冲区 │ └── 3. 暂存数据等待创建者上线 创建者再次上线 │ ├── 1. 自动通知创世节点已恢复 │ ├── 2. 创世节点取消代理 │ ├── 3. 创建者恢复数据推送 │ └── 4. 程序平滑切换无感知数据层职责表角色在线时离线时上线后创建者创建数据推送数据创世节点代理推送兜底恢复职责取消代理创世节点备份数据静默代理所有创建者推送兜底移交职责取消代理接收者直接接收数据从创世节点接收恢复正常接收通信层创世节点作为通信核心创世节点是通信的“总机”和“入口”——它以创建者身份管理整个通信网络并指定代理人作为自己的备份。通信层职责 ───────────────────────────────────────────────────────────────── 创世节点通信核心 │ ├── 1. 固定IP可达系统唯一入口 │ ├── 2. 客户端上下线管理 │ ├── 3. 节点身份认证 │ ├── 4. 全局用户目录 │ ├── 5. 消息路由核心 │ └── 6. 指定代理人广播备用地址二级保障代理人机制创世节点在线 │ ├── 1. 指定代理人第二把交椅 │ ├── 2. 主动推送代理人地址给所有客户端 │ └── 广播消息“备用地址为代理人IP” │ ├── 3. 持续与代理人同步状态 │ └── 4. 正常服务 创世节点离线 │ ▼ 代理人自动接管 │ ├── 1. 1秒内检测到离线 │ ├── 2. 立即切换为通信核心 │ ├── 3. 无需额外通知客户端已预置备用地址 │ └── 4. 提供服务引导、路由、缓冲 创世节点恢复 │ ├── 1. 重新加入系统 │ ├── 2. 自动降级为代理人 │ ├── 3. 广播消息“主节点已恢复” │ └── 4. 客户端切回主节点平滑通信层职责表角色在线时离线时恢复后创世节点核心路由管理节点指定代理人代理人接管降级为代理人代理人备份状态待命已广播给客户端接管创世职责降级为代理人客户端连接创世节点主地址自动切换代理人备用地址切回创世节点两层机制的协同同时离线场景数据层 通信层 创建者A数据创造者离线 ├── 创世节点数据代理接管数据推送兜底 └── 接收者仍能收到数据 创世节点通信核心离线 ├── 代理人已广播备用地址接管通信 ├── 代理人同时接管数据推送创世节点未完成的任务 └── 系统继续运行 创建者A上线 创世节点恢复 ├── 创建者A → 恢复数据推送职责 ├── 创世节点恢复 → 代理人降级 └── 系统平滑切换职责组合矩阵场景数据推送通信路由系统可用正常创建者创世节点✅创建者离线创世节点数据代理兜底创世节点✅创世节点离线创建者代理人已广播✅两者离线代理人数据代理 通信路由代理人已广播✅两者恢复创建者创世节点✅ 设计总结数据层原则创建者优先推送接收者上线时优先由创建者推送创世节点是数据保险箱和兜底代理备份所有数据仅在创建者离线时介入代理自动取消创建者上线后平滑切换创世节点自动退出代理数据完整性通过版本链完整记录变更历史通信层原则创世节点是唯一入口固定IP第一登录地址代理人预先广播所有客户端启动时获取备用地址无缝切换创世节点离线时客户端自动切换自动降级创世节点恢复后自动成为代理人99%可用性保障层级保障可用性通信层主地址 备用地址已广播99%数据层创建者 创世节点代理兜底99%整体两层独立冗余99% 演进规划阶段一纯拥有者模式当前特征说明节点角色全职节点既是客户端也是服务端发送者要求需要在线推送离线消息创世节点缓冲代理实体创世节点轻量代理分工状态全职所有节点做所有事适用规模小团队 100人阶段二代理服务器引入特征说明节点角色全职节点 代理节点发送者要求上传即可无需在线离线消息代理服务器缓存代理实体多个代理服务器分工状态分工萌芽部分节点专职化适用规模中型团队100-500人阶段三完全联邦特征说明节点角色用户节点 代理服务器发送者要求上传即可离线消息归属代理服务器存储代理实体多个独立代理服务器联邦分工状态职业化服务器/客户端完全分离适用规模大规模千人以上 设计价值方面价值去中心化无单点故障每个拥有者都是服务端离线友好创世节点作为消息缓冲区上线后自动拉取可演化从全职到职业化分工平滑演进数据归属每条数据有明确拥有者权限清晰类型安全BlockId三元组唯一标识每个块群组支持群组自动分解为个人块简化群组管理轻量代理当前阶段创世节点即可承担代理职责无需额外部署职责分离数据与通信分离各自独立冗余99%可用一句话总结数据层创世节点是所有创建者的兜底代理备份代发通信层创世节点指定代理人并广播备用地址给所有客户端。以块为最小同步单元以拥有者为核心服务节点系统从“全职节点”演进为“职业化分工”数据与通信职责分离确保消息可靠送达。
返回列表