我刚刚进入分布式系统的概念及其优缺点。在我正在阅读的书中,它讨论了分布式系统的复杂性,并且它们本质上是复杂的,它列出了以下作为复杂性的潜在原因;
我正在努力理解的是这些概念实际包含的内容(即什么是部分失败以及部分失败的原因是什么?),以及它们在现代系统中如何处理?中间件是否成功解决了系统中所有这三个复杂问题?
答案 0 :(得分:2)
这个问题可以用很多词来回答,但我会尝试将其归结为基本要素:
异质性是集成试图解决的主要问题之一。它是大多数分布式系统的固有特性,它指的是,当您必须集成多个系统时,它们通常会:
以上所有都增加了越来越多的复杂性。
异步通信解决了无状态通信的一些问题,但引入了另外一组复杂性,当不能实现不正确时很容易导致问题。这主要是因为您只保证在另一端成功接收消息,但在处理操作时无法保证(如果有的话)。因此,与同步任务相比,执行相互依赖的异步任务的编排要困难得多。
部分失败 - 如果您的流程涉及多个相互依赖的写入操作,则需要确保ACID个事务。在涉及多个系统的情况下必须这样做更加困难,因为您无法像在单个系统的边界内那样在异构分布式环境中轻松实现常见的事务上下文。通常,您需要在服务中实现相反的操作(或者更糟糕的是,实现two-phase commit),以便能够补偿过程中的所有先前写入,以防其中一个任务出现问题。
希望这会让事情变得清晰!
答案 1 :(得分:1)
分布式系统如此复杂的原因很简单:时间!
在分布式系统中,状态的完美同步变得不可能,因为在消息离开一个服务器的点和它到达预定目的地的点之间必须经过一些时间。除此之外,网络是一种更不可靠的通信媒介,这意味着消息可能永远不会发生。
缺乏完美的时间同步意味着不可能对事件的顺序做出绝对的假设。例如,在高度可用的分布式数据库中,如果写入同一资源的两个请求几乎同时到达两个不同的服务器,则无法确定这些事件的绝对顺序。因此,分布式系统必须使用逻辑时间和冲突解决方案的近似值来解决这些类型的事件顺序问题。
答案 2 :(得分:0)
部分失败 - 如果涉及许多客户端的事务(@2或更多),正在使用的调度技术很多涉及写入和写入的冲突操作,在发布过程中锁定复杂性就像在死锁的情况下一样。当锁管理器尝试检测,避免或阻止系统可能部分失败导致整个过程回滚。