惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
N
News and Events Feed by Topic
S
Schneier on Security
G
GRAHAM CLULEY
Scott Helme
Scott Helme
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
CERT Recently Published Vulnerability Notes
T
The Exploit Database - CXSecurity.com
C
Cisco Blogs
T
The Blog of Author Tim Ferriss
Cisco Talos Blog
Cisco Talos Blog
P
Privacy & Cybersecurity Law Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 司徒正美
Blog — PlanetScale
Blog — PlanetScale
Project Zero
Project Zero
MyScale Blog
MyScale Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
The Last Watchdog
The Last Watchdog
Vercel News
Vercel News
The Cloudflare Blog
C
Check Point Blog
Help Net Security
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
AI
AI
Simon Willison's Weblog
Simon Willison's Weblog
云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
Stack Overflow Blog
Stack Overflow Blog
腾讯CDC
NISL@THU
NISL@THU
S
Security @ Cisco Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
S
SegmentFault 最新的问题
MongoDB | Blog
MongoDB | Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
AWS News Blog
AWS News Blog
Cloudbric
Cloudbric
N
News and Events Feed by Topic
PCI Perspectives
PCI Perspectives
S
Securelist
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Vulnerabilities – Threatpost
S
Secure Thoughts

博客园 - ace--碳水化合物

English1 Tidio 官方帮助中心 ERP 相关系统介绍 蝉翼定理 选配法 利润最大化公式 写在失业的一段话 排列组合-组合 在线简历 概率论与数理统计学习章节 绝对值 比例五大定理 算术平均值与几何平均值 等价符号 公因数与最大公因数 容斥原理 英语2026 机器学习,深度学习,强化学习 分别是什么以及区别是什么 深度学习 监督学习 FAQ IVR TTS选择 k 近邻算法 kaldi 平稳核函数(stationary kernel) Karush-Kuhn-Tucker 条件 凸二次规划(convex quadratic programming) FunASR+FreeSwitch做坐席客服系统记录 freeswitch原理图 客服系统,第三方平台,对话转录音,这些可以不依赖第三方做么 STUN服务器 游戏升级记 10 OBB 边界问题 关于yolo26是否可以通过结合java开发 opencv和yolo是一回事情吗 pytorch TorchVision - ace--碳水化合物 PyTorch 和 FashionMNIST 的关系 java record 游戏升级记 9 VibeVoice实现90分钟、多角色播客生成,拓展语音合成新边界 同 WiFi 下用 Claude Code 控制另一台 Windows 电脑 Numpy 1 游戏升级记 8 开源claudecode前端 github star 9k+ 向量数据库skill 游戏升级记 7 游戏升级记 6 关系型数据库,向量数据库,ES,缓存,列式数据库,时序数据库,图数据库等的区别和共同点列举table 多Agent可视化 Agent设计模式 中文 Hermes+Obsidian+LLM wkii,构建AI知识库 Claude Code 前端工程泄露代码开源 游戏升级记 5 ai记忆 Rag 1 游戏升级记 4 游戏升级记 3 游戏升级记 2 AI学习路线 关于hermes agent安装 1 游戏升级记 1 代码迷踪 十三 代码迷踪 十二 ai智能体工程 Rust vs Go 微信小程序实名认证 怎样制作一个街机游戏 跟Claude code说 深入思考 它会思考更深入. googlebusiness profile设置统一白名单的操作,要弹窗模式的 该怎样利用ollama自己训练一个编程大模型 中华AI智能体编程一站式基站构想 打包网站到exe和app 识别的内容一般是试题模板的题号和手写的答题答案(数字) opencv怎么训练 在线SaaS系统做接口版本滚动更新 stripe相关支付流程 流程示意图 error: linker `link.exe` not found | = note: program not found - rust 给我一份关于stripe平台的使用开发说明 c++学习记20260219 奥数-平面几何经典定理 奥数-组合数学 奥数-几何 奥数-代数 奥数-数论
Gun.js原理
ace--碳水化合物 · 2026-05-20 · via 博客园 - ace--碳水化合物

一、文字版架构图

┌─────────────────────────────────────────────────────────────┐
│                     Gun.js 去中心化架构                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   用户 A (浏览器/Node)          用户 B (浏览器/Node)          │
│   ┌─────────────────┐          ┌─────────────────┐          │
│   │   应用层         │          │   应用层         │          │
│   │  gun.get('key') │          │  gun.get('key') │          │
│   └────────┬────────┘          └────────┬────────┘          │
│            │                            │                    │
│   ┌────────▼────────┐          ┌────────▼────────┐          │
│   │  Gun.js 内核    │◄────────►│  Gun.js 内核    │          │
│   │  - CRDT 冲突    │  P2P直连 │  - CRDT 冲突    │          │
│   │  - HAM 图       │          │  - HAM 图       │          │
│   │  - 数据图结构   │          │  - 数据图结构   │          │
│   └────────┬────────┘          └────────┬────────┘          │
│            │                            │                    │
│   ┌────────▼────────┐          ┌────────▼────────┐          │
│   │   本地存储       │          │   本地存储       │          │
│   │  IndexedDB /    │          │  IndexedDB /    │          │
│   │  localStorage   │          │  localStorage   │          │
│   └─────────────────┘          └─────────────────┘          │
│                                                             │
│                     ┌─────────────────┐                     │
│                     │   中继节点       │  (可选,非必须)      │
│                     │   (Relay Peer)  │                     │
│                     │   仅帮忙转发    │                     │
│                     │   不存储数据    │                     │
│                     └─────────────────┘                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

二、核心原理分层说明

层级 作用 关键点
应用层 你用 gun.get() / gun.put() 读写数据 和普通 API 一样简单
Gun.js 内核 把所有数据组织成一个巨大的图 (Graph),用 HAM 算法 做 CRDT 冲突解决 任何人离线改了数据,重新连接后自动合并,不会丢
传输层 默认走 WebSocket 连中继节点;也可切换 WebRTC 做真 P2P 连接建立后,数据直接端到端,不经过服务器
本地持久化 Radisk 引擎自动把数据存进 IndexedDB 刷新页面、断网,数据都在,重连后自动同步

三、Mermaid 流程图(可渲染为图片)

你可以把下面这段代码复制到 Mermaid Live Editor 里,立刻生成一张架构流程图:

graph TD A[用户 A] --> GUN_A[Gun.js 实例] B[用户 B] --> GUN_B[Gun.js 实例] GUN_A --> STORE_A[本地存储 IndexedDB] GUN_B --> STORE_B[本地存储 IndexedDB] GUN_A <-->|WebRTC / WebSocket| GUN_B RELAY[可选中继节点 Relay] -.->|辅助穿透 NAT| GUN_A RELAY -.->|辅助穿透 NAT| GUN_B GUN_A --> GRAPH[(全局有向图 HAM Graph)] GUN_B --> GRAPH


一句话总结 Gun.js 的原理

每个客户端都是一个完整节点,数据以图结构存本地,通过 CRDT 算法实现无冲突多主写入,网络恢复后自动同步最新状态,中继节点只转发不存储,真正去掉中心数据库。

CRDT 全称是 Conflict-free Replicated Data Type(无冲突复制数据类型)。

这是一种数据结构设计的“指导思想”,专门用来解决一个核心问题:当多个人同时离线编辑一份数据,而且没有中央服务器来当裁判时,大家重新联网后怎么做到自动合并、不打架、最终所有人手里的数据都能一模一样。

你可以把它想象成一块“魔法白板”:

  • 小明在北京往上画了一个红圈,小红在洛杉矶往上画了一个蓝方块。
  • 两人此时网络断开,看不到对方干了什么。
  • 重新联网后,白板自动同时呈现出红圈和蓝方块,既不会只保留红圈,也不会因为冲突而碎掉。

为什么 Gun.js 需要 CRDT?

在你之前设想的场景里(北京和洛杉矶两人实时看到彼此状态,没有后端数据库),最大的挑战就是:

  • 两人可能同时改同一个状态(比如都在“备注”栏里写字)
  • 网络随时可能断开
  • 没有中央服务器来决定“以谁为准”

传统的做法需要一把“锁”或一个中心服务器来排队处理请求,而 CRDT 允许无锁、无中心的自由修改,只要数据结构本身设计得足够“聪明”,无论并发操作以什么顺序到达,最终结果都能自动收敛成一致。


CRDT 怎么做到“不冲突”?

关键在于它要求所有的修改操作必须满足三个数学性质:

  • 结合律:先收到 A 再收到 B,和先收到 B 再收到 A,最终结果一样。
  • 交换律:合并操作不依赖顺序。
  • 幂等律:同一个操作被重复传输多次,效果只保留一次,不会叠加。

满足这三条,即便消息在不同人之间乱序到达,最终数据也能自动收敛到同一个结果。


最常见的两种实现思路

  1. 基于状态的

    • 每隔一段时间,把整个数据结构的完整状态发送给对方。
    • 对方收到后,通过一个 merge(合并) 函数把自己的状态和对方的状态合并起来。
    • 哪怕中间少收了几次状态,只要最后一次完整合并,结果就不会错。
  2. 基于操作的

    • 只把修改动作本身(比如“在坐标3的位置插入字母A”)广播出去。
    • 要求消息系统本身保证不丢消息、不乱序
    • 传输内容很小,但对网络可靠性要求高。

Gun.js 内部用的是 HAM(Hypothetical Amnesia Machine,假设性遗忘机器),可以理解为 CRDT 的一种具体实现算法,基于状态合并,专门针对“图数据”做冲突解决。


用集合来举个最简单的例子

假设我们两人维护一个只有添加、没有删除的集合:

  • 我离线时往集合里加了 {A}
  • 你离线时往集合里加了 {B}
  • 联网后我们互相把集合发给对方
  • 合并操作就是取并集 {A} ∪ {B} = {A, B}

显然:

  • 先合并 A 后合并 B,还是反过来,结果都是 {A, B}交换律
  • 重复收到 {A} 做多次并集依然是 {A, B}幂等性

这个“只增不删的集”就是一种最经典的 CRDT,叫 G-Counter 或 Grow-Only Set

当然,现实里更复杂——要支持删除、数值加减、文本编辑,所以会有 PN-Counter、RGA、WOOT 等高级算法,但核心精神都一样:用数学性质保证最终一致,不用锁和中心协调器