【问题标题】:Why has CORBA lost popularity? [closed]为什么 CORBA 失去了人气? [关闭]
【发布时间】:2011-04-19 15:28:31
【问题描述】:

我从来没有听过任何人谈论 CORBA,只是用嘲讽的语气,考虑到 10 多年前它是蜜蜂的膝盖,这很奇怪。为什么 CORBA 会失宠?纯粹是实现不好还是有更根本的问题?

【问题讨论】:

标签: corba


【解决方案1】:

不仅仅是 CORBA,一般来说它是 RPC。这包括 DCOM、Java-RMI、.NET Remoting 和所有其他的东西。

问题基本上在于分布式计算从根本上不同于本地计算。 RPC 试图假装这些差异不存在,并使远程调用看起来就像本地调用一样。但是,为了构建一个好的分布式系统,您需要处理这些差异。

Bill Joy、Tom Lyon、L. Peter Deutsch 和 James Gosling 确定了分布式计算的 8 个谬误,即分布式编程的新手认为是正确的,但实际上是错误的,这通常导致项目失败或成本和工作量显着增加。 RPC 是这些谬误的完美体现,因为它建立在同样的错误假设之上:

  1. 网络可靠。
  2. 延迟为零。
  3. 带宽是无限的。
  4. 网络安全。
  5. 拓扑不会改变。
  6. 只有一名管理员。
  7. 运输成本为零。
  8. 网络是同构的。

所有这些都适用于本地计算。

以可靠性为例:如果您在本地调用一个方法,那么调用本身总是会成功。当然,被调用的方法本身可能有错误,但是方法的实际调用总是会成功的。并且始终会返回结果,或者,如果方法失败,则会发出错误信号。

在分布式系统中,情况并非如此:调用方法本身的行为可能会失败。 IE。从您的角度来看,您似乎调用了该​​方法,但该调用实际上在网络上丢失了并且从未到达该方法。或者,该方法成功接收到调用并执行了操作,但结果在返回给您的途中丢失了。或者方法失败了,但是错误丢失了。

与延迟类似:在本地,调用方法基本上是免费的。方法本身可能需要任意时间来计算答案,但调用是免费的。通过网络,一个呼叫可能需要数百毫秒。

这就是几乎所有 RPC 项目(包括 CORBA)都失败的原因。

请注意,反过来也可以:如果您只是假装所有调用都是远程调用,那么可能发生的最糟糕的事情就是您丢失了一个一点点性能,你的应用程序包含一些永远不会使用的错误处理代码。例如,这就是 Erlang 的工作原理。

在 Erlang 中,进程总是有单独的堆和单独的垃圾收集器,就像它们运行在不同大陆的不同机器上一样,即使这些进程在同一个 CPU 上的同一个 VM 上运行相同的地址空间。如果您将数据从一个进程传递到另一个进程,则该数据始终会被复制,就像进程位于不同机器上时一样。调用总是作为异步消息发送进行。

因此,使本地和远程调用看起来相同不是问题。让它们看起来像本地调用。

在 CORBA 中,问题实际上比这更令人费解。他们实际上确实使本地调用看起来像远程调用,但是由于 CORBA 是由委员会设计的,远程调用难以置信复杂,因为它们必须能够处理一些难以置信的荒谬要求。这种复杂性被强加给每个人,即使是本地电话也是如此。

再次,与 Erlang 相比,复杂性要低得多。在 Erlang 中,向进程发送消息并不比在 Java 中调用方法复杂。接口基本相同,只是期望不同:Java中的方法调用期望是瞬时的和同步的,而在Erlang中,消息发送期望是异步的并且具有可见的延迟。但实际上使用它们并不比一个简单的本地过程调用更复杂。

另一个区别是 Erlang 区分了函数调用和消息发送,它只能发生在进程内部,因此总是本地的,消息发送发生在进程之间,并且假定总是远程的,即使它们不是。在 CORBA 中,所有方法调用都被假定为远程的。

【讨论】:

  • +1 不错的答案;我现在可以理解为什么一些开发人员似乎对 .NET Remoting 持如此悲观的看法。但是,如果您愿意接受固有的限制,.NET Remoting 对于某些问题可能是一个不错的点解决方案。我不确定将它与 CORBA 和 DCOM 混为一谈是否公平。
  • 他们失败的部分原因是专有协议(因此很难与防火墙一起使用)和(在 CORBA 的情况下)部分是因为它们是由委员会设计的并且膨胀得可怕。 SOAP 也是一个很好的例子。但是,简化网络调用的概念并不是真正的问题。
  • 我理解这些问题,但我们有什么替代方案?如果您不希望使用 SOAP 或 XMLRPC 获得巨大的 xml 开销,并且如果您想用 C(而不是 C++)编程,那么您使用哪种技术?
  • 这个答案是完全错误的。在任何类似的解决方案中,您都必须创建处理网络错误的代码。 Corba“假装”函数调用通过网络是不正确的。在任何网络问题上,您都会遇到异常,而您作为程序员的任务就是处理此类情况。您的答案有效的唯一方法是当 Corba 应用程序的开发人员“假装”不涉及网络时,但这代表了网络上的任何软件通信。实际上各种用于网络通信的 XML 解决方案都有很高的开销(因为 XML 文本)和很高的处理负载。
  • @BJovke 你有更好的答案吗?我知道问题已经结束,但我很想知道你的推理。
【解决方案2】:

像 CORBA 和 DCOM 这样的分布式对象技术在粒度方面存在问题 - 实现往往过于“健谈”而无法在网络上很好地执行 - 而且通常会泄露实现细节,从而使解决方案变得脆弱。

服务导向作为对这些问题的反应而受到重视。

【讨论】:

  • 您能否详细说明面向服务相对于 CORBA 的优势?
  • 在 SOA 模型中,跨网络边界的调用更加明确,通常会将整个工作单元封装在单个服务调用中。服务接口也更容易从底层实现中抽象出来,以允许在不破坏客户端的情况下更改实现。
  • 错了。 “太啰嗦”???这完全取决于开发人员希望他的基于 Corba 的软件有多“健谈”,而不是依赖于库本身。 “泄露的实施细节”?对于任何没有加密的网络协议都是一样的。您已经可以在 Corba 中使用 SSL 很长时间了。各种主要基于 XML 的网络通信库具有较高的负载和处理开销,但会使懒惰的程序员创建脏代码和初学者以标榜自己为专家。
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 2014-01-29
  • 2015-05-22
  • 2014-05-31
  • 1970-01-01
相关资源
最近更新 更多