为什么分布式系统被认为是复杂的?

Why are Distributed Systems considered complex?

我刚刚开始了解分布式系统的概念及其优点和缺点。在我正在阅读的书中,它讨论了分布式系统的复杂性,并且它们本质上是复杂的,它列出了以下复杂性的潜在原因;

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

这个问题可以用很多词来回答,但我会尽量归结为要点:

异构性是集成试图解决的主要问题之一。它是大多数分布式系统的固有特征,它指的是这样一个事实,即当您必须集成多个系统时,它们通常会:

  • 在不同的平台上,在不同的网络中;
  • 它们在集成方面的能力不同;
  • 数据存在差异,甚至是指同一业务领域的数据;
  • 使用和支持不同的(有时甚至被遗忘或不受支持的)技术和标准;
  • 拥有不同的所有者(由不同的部门、公司控制)。

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

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

部分失败 - 当您的进程涉及多个相互依赖的写入操作时,您需要确保 ACID transactions. Having to do so in scenarios when multiple systems are involved is even harder because you cannot achieve common transactional context as easily in heterogeneous distributed environment as you would if you were within the boundaries of a single system. Often you will need to implement opposite operations in services (or worse, implement two-phase commit),以便能够补偿处理以防其中一项任务出现问题。

希望这能解决一些问题!

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

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

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

部分失败 - 在涉及多个客户端(@2 个或更多)的事务的情况下,所使用的调度技术很多涉及写操作的冲突操作,并且可能是写操作,在发出锁的过程很复杂,就像在死锁的情况下一样。当锁管理器试图检测、避免或阻止系统时,可能会部分失败导致整个过程回滚。