3

Corba 服务器端有很多关于多线程的知识,但我对客户端很感兴趣。我们有一个多线程客户端(Solaris、Orbix 6.3)和一个初始化 ORB 的 Corba 单例“管理器”。在运行时 'lsof' 只显示一个到 Corba 服务器的 TCP 连接,因此所有从客户端工作线程进行的同步调用都应该被序列化。

想改变这种安排以利用并行性:每个线程管理自己的连接。我已经更改了设置,以便每个工作线程调用 ORB_init() 等而不是单例。

现在完全困惑:'lsof' 现在显示 2 个 TCP 连接,但有 6 个工作线程。有些事情不对劲,预计 TCP 连接数与工作线程数一样多。可能是这种方法很幼稚 - 例如每个线程调用 ORB_init() 是否有意义?

我需要有人对此发表意见。多线程客户端的示例代码将有很大帮助。同样,在 Solaris 上使用 Orbix 6.3。

亲切的问候,

阿德里安

4

5 回答 5

1

谢谢你们的回答。我发现,正如约翰尼所说,这确实是特定于实现的。

例如, omniORB具有 maxGIOPConnectionPerServer - 默认为 5。即: ORB 将打开到单个服务器的最大并发连接数。如果客户端上的多个线程调用同一服务器,ORB 会打开到服务器的附加连接,最多可达此参数指定的最大值。如果达到最大值,线程将被阻塞,直到有连接可供它们使用。

不幸的是,我还没有找到Orbix的等价物(如果有的话) 。它绝对默认为 1 个连接。还在搜...

虽然发现作为 Solaris -> Linux 迁移的一部分,几个月后将从 Orbix 迁移到TAO。希望 TAO 会更加友好和可定制。

于 2012-09-25T09:56:56.040 回答
1

连接的管理是特定于纯 CORBA 的实现。每个供应商都有自己的专有方式来配置他们的行为。如果您检查 RTCORBA 规范,它有一种标准化的方式来配置如何使用客户端和服务器之间的连接。

我不知道 Orbix 是如何工作的以及它是否支持 RTCORBA,这可能是你可以从他们的手册中获得的东西。我知道 TAO 对客户端的线程有很多支持。默认情况下,当多个线程调用同一服务器时,可以同时打开多个 tcpip 传输。

于 2012-09-25T06:44:49.263 回答
1

Orbix 内部使用大量优化例程来确保有效使用连接。具体来说,它不会打开到同一个服务器端点的多个连接,因为它能够在同一个 TCP 连接上多路复用多个并发 GIOP 请求。CORBA 故意对客户端和服务器程序员隐藏连接管理。

我不相信这可以通过配置来控制。向 Progress Support 发送支持票以进行确认。如果您离开单例模型并为每个客户端初始化不同的 ORB(每个客户端都有自己的唯一 ID),您可能可以强制它发生,但这将是一个非常严厉且成本高昂的问题解决方案有点模糊。底层 ORB 已经针对并发请求进行了优化,因此我不确定您要解决的问题是什么。

于 2012-10-05T15:15:00.913 回答
0

老实说,我认为对于 CORBA 应用程序没有称为多线程客户端的概念。因为在服务器端,有一个only one object向所有客户端都可用的命名服务注册。如果您查看IOR对象的 ,所有客户端都将是相同的。所以它最多只能建立一个与该对象的连接。它还导致您认为对于任意数量的客户端,您不能获得多个远程对象(这意味着您从不同客户端查找对象的次数,它们都获得相同的引用)。因此,为了支持多线程,服务器实际上必须支持不同的线程策略。POA 服务器可以有不同的线程策略。请通过CORBA 进行 JAVA 编程更多。

于 2012-09-25T05:22:57.303 回答
0

我不知道 Orbix 究竟是如何工作的,但通常 ORB 初始化只完成一次,即使对于多线程设置也是如此。多线程(服务器端)ORB 将启动一定数量的工作线程(按需或如果需要或如果配置,则为固定数量)来处理传入连接。这些连接由工作人员处理。这个工人查找可以处理这个请求的仆人。通常这(对仆人的真正调用)也在一个额外的线程中执行。但是你不会看到这个线程lsof。尝试使用ps -eLftop -H启用线程支持。

编辑:

在客户端,这取决于您要调用多少对象。对于每个对象,调用者线程都是可能的。每个远程对象也可以有多个调用者线程,但前提是从客户端逻辑上的不同线程调用。(想象有多个线程并且远程对象在线程之间共享)

于 2012-09-24T11:19:40.440 回答