2015-04-24 70 views
0

我只是深入分布式系统的概念及其优点和缺点。在我正在阅读的这本书中讨论了分布式系统的复杂性,并且它本质上是复杂的,它列出了以下可能的复杂性原因:为什么分布式系统被认为是复杂的?

  • 异质
  • 异步通信
  • 部分失败

什么,我努力理解什么是这些概念实际上包含(即什么是局部的失败,什么是部分的原因失败?),以及它们在现代系统中如何处理?中间件是否成功地解决了系统中所有这些复杂性问题?

回答

2

这个问题可以在很多的话来回答,但我会尽力熬下来要领:

异质是集成试图解决的主要问题之一。这是大多数分布式系统的固有特性,它指的是大多数,往往不是,当你有多个系统整合,他们会:

  • 在不同的平台,不同的网络中;
  • 在融合方面的能力不同;
  • 数据有差异,即使是涉及同一业务域的数据也是如此;
  • 使用和支持不同的(有时甚至被遗忘或不支持的)技术和标准;
  • 有不同的所有者(由不同部门,公司控制)。

以上所有内容都增加了越来越多的复杂性。

异步通信解决了无状态通信的一些问题,但引入了其他一系列复杂性,当不执行不合适时很容易导致问题。这主要是因为您只能保证消息将在另一端成功接收,但无法保证何时处理操作。所以与同步任务相比,执行相互依赖的异步任务的编排要困难得多。

部分故障 - 当您有涉及多个相互依赖写入操作的进程时,您需要确保ACID事务。在涉及多个系统的场景中必须这样做更加困难,因为在异构分布式环境中无法像在单个系统边界内那样容易地实现通用事务上下文。通常情况下,您需要在服务中实施相反的操作(或更糟糕的是,实施two-phase commit),只是为了能够补偿流程中的所有先前写入,以防某些任务出现问题。

希望这可以清除一些事情!

1

分布式系统如此复杂的原因很简单:时间

在分布式系统中,状态的完美同步变得不可能,因为一个简单的事实是,消息离开一台服务器的时间必须经过一段时间,并且它指向它到达其预定目的地的时间点。除此之外,网络是一种更不可靠的通信媒介,这意味着信息可能永远不会成为可能。

缺乏完美的时间同步意味着不可能对事件的顺序做出绝对的假设。例如,在高度可用的分布式数据库中,如果写入相同资源的两个请求几乎同时到达两个不同的服务器,则无法确定这些事件的绝对顺序。因此,分布式系统必须使用逻辑时间近似值和冲突解决方案来解决这些类型的事件顺序问题。

0

部分失败 - 对于涉及许多客户端(@ 2或更多)的事务,使用的调度技术很多涉及冲突的写操作和可能的写操作,在发出锁的过程中会出现复杂性以防万一发生死锁。当锁管理器尝试检测,避免或防止系统可能部分失败导致整个过程的回滚。