1

根据CAP 定理,分布式 Erlang 系统不可能同时提供以下所有三个保证:

  • 一致性(所有 Erlang 运行时或节点,同时看到相同的数据)
  • 可用性(节点故障不会阻止幸存者继续运行)
  • 分区容限(尽管有任意消息丢失,系统仍继续运行)

一个分布式 Erlang 系统可以支持个、一个两个保证。

使用 Erlang 和 OTP,如何实现每个保证?大多数分布式 Erlang 应用程序为更高级别的 A 和 P 做出了实际的选择,并满足于“最终一致性”。似乎 Erlang 本身旨在支持分布式 (P)、容错 (A)、软实时、不间断的应用程序。

编程语言 (Erlang)、运行时系统 (ERTS) 和库集 (OTP) 旨在构建分布式容错应用程序;我该如何做定义分布式容错应用程序的三件事?

4

4 回答 4

5

为清楚起见已编辑

这取决于您的应用程序的设计,而不是您实现它的平台。您可以使用几乎任何语言或平台组合来实现任何 2 个保证。

于 2010-10-03T17:20:44.550 回答
3

我发现的一个非常好的例子是Riak,这是一个基于 Amazon Dynamo 并使用 Erlang 和 OTP 构建的分布式键值存储。可调 CAP 控件让您可以动态“选择”一致性和可用性级别;它选择关注 CAP 的 A 和 P,这使得它最终保持一致。Riak 是开源的,网上有很多关于其实现的好文章。

另一个很好的例子是Dynomite,PowerSet 的 Dynamo-clone-in-Erlang。尽管该项目已经停止了一段时间,但它可以作为一个有用的功能设计文档,介绍如何构建 Dynamo 克隆。

这两个项目本身都是基于 Amazon 的Dynamo的,这是一个可增量扩展、高度可用的键值对存储系统。该技术旨在让用户能够权衡成本、一致性、耐用性和性能,同时保持高可用性。这篇论文很好读。

于 2010-10-03T18:01:22.673 回答
0

Erlang 的优势在于选择 A&P,但与任何系统一样,可以选择任意两个或更少。这部分是由于 erlangs 编程模型通过消息传递进行的所有通信。如果您使用良好的 Erlang 风格,则不会使用共享内存在进程之间进行通信。

于 2010-10-04T22:02:45.953 回答
-1

我认为这个定理应该只考虑一层。什么是层?它类似于 OSI-ISO 层,但用于数据库:应用程序/数据库、操作系统、磁盘/硬件。不能在一层中满足所有 CAP 条件。Erlang/OTP 在应用层中运行,因此其中的 2 个由 Erlang 覆盖(您可以选择,因为 Erlang 的灵活性),最后一个覆盖 OS(即文件系统)或硬件层(raid)。

于 2010-10-03T21:04:53.450 回答