在互联网发展的历程中,我们见证了网络架构从中心化向去中心化的不断演进。最近读到一篇关于网络架构演化的深度文章,让我对这个话题有了新的思考。今天想和大家分享一下网络架构演进的几个关键阶段,以及为什么中继(Relay)模式可能是一个更优的解决方案。

中心化架构:城堡与领主的模式

传统的应用架构就像中世纪的城堡系统:一个强大的中央服务器支撑着众多客户端。无论是网站还是移动应用,基本都采用这种模式。

1
客户端 ←→ 中央服务器 ←→ 客户端

这种架构的核心问题在于控制权的集中:

  • 服务器拥有你的数据
  • 服务器拥有你的账户
  • 服务器拥有加密密钥

正如那句经典的话:”不是你的密钥,就不是你的数据”(Not your keys, not your data)。

中心化架构本质上是”封建制”的——应用拥有密钥,用它们在数据周围建立加密墙。用户需要”登录”才能跨过吊桥,而城堡随时可以拉起吊桥,将你拒之门外。

联邦化:城堡间的联盟

为了解决中心化的问题,人们提出了联邦化(Federation)的方案。用户连接到服务器,服务器之间相互通信,交换消息,让不同服务器上的用户能够互相交流。

1
客户端 ←→ 服务器A ←→ 服务器B ←→ 客户端

电子邮件就是这样工作的,Mastodon 和 Matrix 也是如此。我的邮箱是 @gmail.com,你的是 @protonmail.com,我们使用不同公司运营的不同应用,但仍然可以自由地互发邮件。

联邦化的优势在于实现简单——它只是在普通的客户端-服务器架构后面加了一个协议。这就是为什么 Mastodon 本质上就是一个普通的 Ruby on Rails 应用。

联邦化的困境:不可避免的中心化

但是,联邦化网络有一个根本性问题:网络会随时间自然中心化。

这不是偶然现象,而是网络科学的必然结果。网络会收敛到指数分布,这种中心化在各种网络中都能观察到:

  • 互联网
  • 社交网络
  • 航空路线
  • 电力网格
  • 蛋白质相互作用
  • 生态食物网

以电子邮件为例,一位自建邮件服务器23年的开发者最终放弃了:

“电子邮件不再是分布式的了。你根本无法创建这个网络的另一个一等节点…电子邮件现在是寡头垄断,由几家大公司把关的服务。”

我们在 Fediverse 中也看到了类似的整合趋势。2023年,Facebook Threads 实现了 ActivityPub,瞬间成为 Fediverse 中最大的节点,比其余部分大10倍以上。

大型联邦节点占据网络拓扑中的战略中心位置,对网络其余部分有强大影响力。它们可以通过发明不联邦的新功能或切断与其他联邦的联系来拉起吊桥。

P2P:理想与现实的差距

既然服务器是问题,那我们能否直接连接彼此?这就是点对点(P2P)网络的思路。

1
客户端 ←→ 客户端 ←→ 客户端

在P2P网络中,每个参与者运行一个对等节点,可以找到其他对等节点并向它们发送消息。用户拥有自己的密钥,用它们来签名、验证和加密消息。

P2P的优势是真正的用户所有权,但也带来了复杂的工程挑战:

  • 没有中央真相源,需要设计最终一致性
  • 需要合并潜在冲突的状态
  • 时间戳等问题变得困难
  • 多跳路由导致延迟
  • 节点不可靠,经常离线

同样的进化压力也适用于P2P网络,特别是对可靠性的适应性压力。这导致了超级节点的演化:高带宽、高可用性的节点,专门为网络中的其他节点提供服务。

最终,我们不再直接连接,而是连接到高带宽、高可用性的超级节点之一。这听起来就像是”带着额外步骤的中心化”!

中继模式:承认现实,拥抱简单

既然网络最终都会中心化,为什么不从一开始就承认这个现实,并设计一个利用这一点的架构呢?

中继(Relay)架构就是这样的方案:

1
2
3
客户端 → 中继服务器 → 客户端
↓
(用户拥有密钥)

使用一些普通的现成服务器,将它们视为愚蠢的、不受信任的管道。它们的工作只是中继信息。它们不拥有密钥——你拥有你的密钥。你用你的密钥签名消息,然后将它们发布到一个或多个中继。其他用户关注一个或多个中继。当他们收到消息时,他们使用你的密钥来验证是你发送的。就这样!

这就是 Nostr 协议的核心思想。我认为 Nostr 发现了分布式协议的一种新的基本架构——不是联邦化,不是P2P,而是中继。

中继架构的优势

中继架构直击要害:

1. 简单性

使用无聊的技术,比如普通的服务器。你受益于传统应用开发的所有风向。

2. 规模经济

云中的大型愚蠢服务器具有高可用性和高正常运行时间,它们是商品基础设施。

3. 避免N²扩展问题

中继不相互通信,用户只需要加入少数中继就能获得自主权——至少两个,肯定少于十几个。

4. 支持用户所有权

你拥有你的数据、你的账户,最重要的是,你的密钥。中继很大,但它们不负责。如果中继宕机或关闭你,没问题!你的账户不会改变,你的数据已经镜像到其他中继。

5. 可信退出

由于用户拥有密钥和数据,可以随时迁移到其他中继,实现真正的可信退出。

技术实现思考

从技术角度来看,中继架构有几个关键特点:

密钥管理

1
2
3
4
5
6
7
8
9
10
11
// 用户生成密钥对
const keyPair = generateKeyPair();
const privateKey = keyPair.privateKey; // 用户持有
const publicKey = keyPair.publicKey; // 公开分享

// 签名消息
const message = "Hello, decentralized world!";
const signature = sign(message, privateKey);

// 其他用户验证
const isValid = verify(message, signature, publicKey);

中继通信

1
2
3
4
5
6
7
8
9
10
11
// 发布到多个中继
const relays = ['wss://relay1.com', 'wss://relay2.com'];
const signedMessage = {
content: message,
signature: signature,
pubkey: publicKey
};

relays.forEach(relay => {
publishToRelay(relay, signedMessage);
});

数据同步

由于消息被发布到多个中继,天然具备了数据冗余和可用性保证。

对创业者的启示

作为创业者,这种架构演进给我们几个重要启示:

1. 承认现实,而非对抗

与其花费大量精力试图创建”完全去中心化”的系统,不如承认网络中心化的必然性,设计能够利用这一特点的架构。

2. 用户所有权是核心

真正的创新不在于网络拓扑,而在于将控制权还给用户。密钥所有权是实现这一点的关键。

3. 简单胜过复杂

中继架构之所以优雅,是因为它简单。复杂的P2P协议最终也会演化出类似的结构,为什么不直接从简单开始?

4. 基础设施即服务

将中继视为商品基础设施,专注于用户体验和应用逻辑,而不是重新发明网络协议。

结语

网络架构的演进告诉我们,技术发展往往遵循自然规律。与其对抗这些规律,不如理解并利用它们。

中继架构可能不是网络去中心化的终极答案,但它提供了一个实用的中间路径:既保持了用户的自主权,又利用了中心化基础设施的优势。

对于正在构建下一代互联网应用的创业者来说,这种思路值得深入思考。也许真正的创新不在于彻底颠覆现有架构,而在于找到更好的平衡点。


这篇文章基于对分布式系统和网络理论的思考,欢迎在评论区分享你对网络架构演进的看法。