多线程 Corba 客户端
Posted
技术标签:
【中文标题】多线程 Corba 客户端【英文标题】:Multithreaded Corba Client 【发布时间】:2012-09-24 09:49:29 【问题描述】:Corba 服务器端有很多关于多线程的知识,但我对客户端感兴趣。我们有一个多线程客户端(Solaris、Orbix 6.3)和一个初始化 ORB 的 Corba 单例“管理器”。在运行时,“lsof”只显示一个到 Corba 服务器的 TCP 连接,因此所有从客户端工作线程发出的同步调用都应该被序列化。
想改变这种安排以利用并行性:每个线程管理自己的连接。我已经更改了设置,以便每个工作线程调用 ORB_init() 等而不是单例。
现在完全困惑:'lsof' 现在显示 2 个 TCP 连接,但有 6 个工作线程。 有些事情不对劲,预计 TCP 连接数与工作线程数一样多。可能是这种方法很幼稚 - 例如每个线程调用 ORB_init() 是否有意义?
我需要有人对此发表意见。多线程 client 的示例代码将有很大帮助。同样,在 Solaris 上使用 Orbix 6.3。
亲切的问候,
阿德里安
【问题讨论】:
我看到你做了类似的事情,我正在尝试做的事情。这是我的问题 - ***.com/questions/13009694/…。你有什么想法? (您的问题+1 - 互联网对于多线程 CORBA 客户端的信息真的很差,而对于多线程 CORBA 服务器的信息非常丰富)。提前致谢! 【参考方案1】:连接管理是纯 CORBA 的特定实现。每个供应商都有自己的专有方式来配置他们的行为。如果您检查 RTCORBA 规范,它有一种标准化的方式来配置如何使用客户端和服务器之间的连接。
我不知道 Orbix 是如何工作的以及它是否支持 RTCORBA,这可能是你可以从他们的手册中得到的。我知道 TAO 对客户端的线程有很多支持。默认情况下,当多个线程调用同一服务器时,可以同时打开多个 tcpip 传输。
【讨论】:
【参考方案2】:谢谢你们的回答。我发现,正如 Johnny 所说,这确实是特定于实现的。
omniORB 例如 maxGIOPConnectionPerServer - 默认为 5。即: ORB 将打开到单个服务器的最大并发连接数。如果客户端上的多个线程调用同一服务器,则 ORB 会打开到服务器的附加连接,最多可达此参数指定的最大值。如果达到最大值,线程将被阻塞,直到有连接可供它们使用。
很遗憾,我还没有找到 Orbix 的等价物(如果有的话)。它绝对默认为 1 个连接。仍在谷歌搜索...
发现作为 Solaris 的一部分 -> Linux 迁移将在几个月后从 Orbix 迁移到 TAO。希望 TAO 会更加友好和可定制。
【讨论】:
【参考方案3】:Orbix 内部使用大量优化例程来确保有效使用连接。具体来说,它不会打开到同一个服务器端点的多个连接,因为它能够在同一个 TCP 连接上多路复用多个并发 GIOP 请求。 CORBA 故意对客户端和服务器程序员隐藏连接管理。
我不相信这可以通过配置来控制。向 Progress Support 发送支持票以进行确认。如果您离开单例模型并为每个客户端初始化不同的 ORB(每个客户端都有自己的唯一 ID),您可能可以强制它发生,但这将是一个非常严厉且成本高昂的问题解决方案有点模糊。底层 ORB 已经针对并发请求进行了优化,所以我不确定您要解决的问题是什么。
【讨论】:
谢谢布赖恩。你说的有道理。我的印象是调用一个接一个地被序列化。情况可能并非如此,它们可能确实是交错的,即多个请求从不同的工作线程向下推送,然后向这些线程发送多个回复。确实有更智能的处理方式。【参考方案4】:老实说,我认为对于 CORBA 应用程序没有称为多线程客户端的概念。因为在服务器端,有only one object
已注册到可供所有客户端使用的命名服务。如果您查看对象的IOR
,它对于所有客户端都是相同的。因此它最多只能建立一个与该对象的连接。它还导致您认为对于任意数量的客户端,您不能获得多个远程对象(这意味着您从不同客户端查找对象的次数,它们都获得相同的引用)。因此,为了支持多线程,服务器实际上必须支持不同的线程策略。 POA 服务器可以有不同的线程策略。请通过JAVA PROGRAMMING WITH CORBA了解更多信息。
【讨论】:
什么是实现存储库和动态接口? 即使服务器上有一个对象,ORB 也可以创建多个 tcpip 连接。还有其他获取/创建对象引用的方法,您可以轻松地将多个对象从服务器提供给多个客户端。还要检查各种 POA 策略,例如可以为每个客户端提供服务的服务定位器。【参考方案5】:我不知道 Orbix 究竟是如何工作的,但通常 ORB 初始化只完成一次,即使对于多线程设置也是如此。多线程(服务器端)ORB 将启动一定数量的工作线程(按需或如果需要或如果配置,则为固定数量)来处理传入连接。这些连接由工作人员处理。这个工人查找可以处理这个请求的仆人。通常这(对仆人的真正调用)也在一个额外的线程中执行。但是您不会看到带有lsof
的此线程。尝试在启用线程支持的情况下使用ps -eLf
或top -H
。
编辑:
在客户端,这取决于您要调用多少对象。对于每个对象,调用者线程都是可能的。每个远程对象也可以有多个调用者线程,但前提是从客户端逻辑上的不同线程调用。 (假设有多个线程并且远程对象在线程之间共享)
【讨论】:
谢谢。尽管如此,我正在查看客户端 - 传出连接。 来自omniorb.sourceforge.net/omni41/omniORB/omniORB008.html:8.3 客户端行为 在连接的客户端,调用代理对象的线程直接驱动GIOP 协议并阻塞连接以接收回复。客户端第一次调用特定地址空间时,ORB 会打开到远程地址空间的合适连接(基于 8.7.1 节中描述的客户端传输规则)。收到回复后,ORB 缓存打开的网络连接,以供另一个调用使用。这可以解释。 抱歉,必须使用多个 cmets 回复。因此,唯一的机会可能是找出禁用传出网络连接缓存的 Orbix 配置参数(如果有)。 你的意思是连接重用,这是很常见的,并且可以提高性能,因为建立连接需要时间。以上是关于多线程 Corba 客户端的主要内容,如果未能解决你的问题,请参考以下文章
Sun/Oracle CORBA 实现是不是有任何线程池以及如何配置它?
Corba 客户端 - Python 和 Corba 服务器 - Java
使用 CORBA - org.omg.CORBA.BAD_PARAM 连接客户端(在 VirtualBox 上)和服务器(在 localhost 上):