为什么CORBA失去了知名度?[关闭]


67

我从来没有听过有人说过CORBA,只是嘲讽的意思,考虑到10年前是蜜蜂的膝盖,这很奇怪。为什么CORBA失宠?纯粹是实现不好还是有更根本的东西?


在Wikipedia文章中有关于它的问题和批评的部分:en.wikipedia.org/wiki/Common_Object_Request_Broker_Architecture
oadams 2010年


该是CORBA的遗留问题没有解决的原因,为什么它成为遗产
MrEvil

正如Sam提到的,您可以将DCOM和CORBA放在一起,看看它们为什么不能与SOAP竞争。
詹姆斯·布莱克2010年

7
投票重新开放,以便我可以投票赞成接近迁移到程序员:)

Answers:


155

它不仅是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. 网络是同质的。

所有这些对于本地计算都是正确的。

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

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

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

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

请注意,另一种方法也很好:如果您假装所有调用都是远程调用,那么可能发生的最糟糕的事情是您会失去一点性能,并且您的应用程序包含一些永远不会使用的错误处理代码。例如,这就是Erlang的工作方式。

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

因此,使本地和远程呼叫看起来相同不是问题。使它们看起来像本地电话。

在CORBA中,问题实际上比这复杂得多。它们实际上确实使本地呼叫看起来像远程呼叫,但是由于CORBA是由委员会设计的,因此远程呼叫非常复杂,因为它们必须能够处理一些非常荒谬的要求。这种复杂性被强加给每个人,即使是本地电话也是如此。

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

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


3
+1好答案;现在,我明白为什么有些开发人员似乎对.NET Remoting的看法如此晦涩。但是,如果您愿意接受固有的局限性,.NET Remoting可能是某些问题的不错的解决方案。我不确定将它与CORBA和DCOM融合在一起是否公平。
罗伯特·哈维

4
它们失败的原因部分是专有协议(因此很难与防火墙配合使用),并且(在CORBA的情况下)部分是因为它们是由委员会设计的并且令人肿。SOAP就是一个很好的例子。但是,简化网络通话的概念并不是真正的问题。
gbjbaanb 2012年

我了解问题所在,但是我们有什么选择?如果您不希望通过SOAP或XMLRPC获得如此庞大的xml开销,并且如果要使用C(而不是C ++)进行编程,那么您将使用哪种技术?
Alex

2
这个答案是完全错误的。在任何类似的解决方案中,您都必须创建处理网络错误的代码。Corba并非“假装”函数调用通过网络运行是不正确的。在任何网络问题上,您都会遇到一个例外,而作为程序员的任务就是处理此类情况。您的答案唯一有效的方法是当Corba应用程序的开发人员“假装”不涉及任何网络,但是代表通过网络进行的任何软件通信。实际上,用于网络通信的各种XML解决方案具有高开销(由于XML文本)和高处理负荷。
BJovke

@BJovke您有更好的答案吗?我知道问题已经结束,但很好奇您的推理。
johnildergleidisson

12

诸如CORBA和DCOM之类的分布式对象技术在粒度方面存在问题-实施往往过于“混乱”,无法在网络上良好地执行-且通常泄漏的实施细节使解决方案变得脆弱。

对这些问题的反应是服务导向。


您是否可以扩展有关服务导向与CORBA的优势的答案?
Thufir

在SOA模型中,跨网络边界的调用更为明确,通常会将整个工作单元封装在一个服务调用中。服务接口也更容易从基础实现中抽象出来,以允许实现更改而不会破坏客户端。
2015年

错误。“太健谈” ????这完全取决于开发人员是否希望他基于Corba的软件有多“幽默”,而不是取决于库本身。“泄漏的实施细节”?对于任何没有加密的网络协议来说都是一样的。您可以在Corba中长期使用SSL。主要基于XML的各种网络通信库具有很高的有效负载和处理开销,但使懒惰的程序员可以创建肮脏的代码,而初学者则可以宣传自己为专家。
BJovke
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.