跳到主要内容

客户端应用程序会话

在同一主机上的应用程序之间的通信可以通过共享内存或共享 TCP 通道进行。通过共享内存进行通信的开销和延迟比通过 TCP 通道通信更低。同一主机上的应用程序也可以同时使用共享内存和共享 TCP 通道进行通信。

IPC 的另一个用例是允许驻留在不同主机上的应用程序建立直接通信通道并绕过 Solace PubSub+。例如,两个应用程序可以建立一个直接通道来交换大型数据集,而这些数据集对平台中的其他应用程序没有兴趣。这种直接通信保留了 Solace PubSub+ 的容量,但也要求通信应用程序之间紧密耦合。

驻留在不同主机上的应用程序可以通过 TCP 通道进行通信;通过共享内存进行通信是不可能的。

无IPC的基于会话的通信

通常,一个会话代表与事件代理的一个 TCP 连接。从应用程序到事件代理建立会话,它允许传输和接收消息。下图显示了一个应用程序之间通过事件代理进行通信的场景。

在这种场景中,一个应用程序不会直接与其他应用程序通信。尽管多个应用程序可以通过会话连接到事件代理,但一个应用程序不会直接感知其他应用程序的存在或不存在。因此,应用程序发送消息时,不会考虑其他应用程序是否可能对接收它们感兴趣。

典型的应用程序与 Solace PubSub+ 事件代理的基于会话的交互

img

IPC基于会话的通信

IPC 功能引入了应用程序的多点会话概念。尽管多点会话尝试保持与应用程序通过会话连接到事件代理时发生的消息行为相同(即,应用程序之间发送和接收消息的语义保持不变),但多点会话并不依赖于与事件代理的会话连接。相反,它允许应用程序建立与一个或多个对等 IPC 应用程序的会话,并直接与它们通信。它可以有与对等应用程序建立的出站连接的混合,以及来自对等应用程序的入站连接。应用程序仍然使用一个单一的会话,但在 API 内部为每个直接通信的对等应用程序管理“隐藏”的子会话。

下图显示了一个 IPC 多点会话,其中应用程序 A 和 B、A 和 C、以及 A 和 D 之间存在通信通道。应用程序 B、C 和 D 可以与应用程序 A 在同一主机上,也可以在不同的主机上。如果它们与应用程序 A 在同一主机上,则通信通道可以是 TCP 或共享内存。如果它们与应用程序 A 在不同的主机上,则通信通道必须是 TCP。

通过 IPC 多点会话进行通信的应用程序

img

IPC 依赖于“客户端/服务器”模型,其中一个应用程序积极地建立与另一个接受传入连接的应用程序的 IPC 连接。

应用程序 A 不会直接感知对等应用程序何时加入或离开多点会话。这与通过事件代理通信是一致的,在这种情况下,一个给定的应用程序不会直接感知其他应用程序何时连接或断开与事件代理的连接。

多点会话包括一个“路由表”的概念,该表用对等应用程序的订阅请求填充。当一个应用程序向多点应用程序发送消息时,该消息被发送到已订阅该消息的每个对等应用程序。发布应用程序只需要发送一次消息;API 查找主题,然后将消息发送到任何匹配的子会话。

IPC 本质上不是多播;例如,应用程序 A 发布的消息分别发送到每个对等应用程序(B、C 和 D),但前提是它们已订阅消息的主题。

当一个应用程序订阅一个主题时,订阅被发送到它已建立子会话的每个对等应用程序。

当从对等应用程序接收到直接消息时,它被传递到多点会话的消息接收回调中。没有根据哪个对等应用程序发送了直接消息来进行区分(这与当与事件代理建立连接时应用程序如何交互是一致的)。

当存在多个子会话,并且存在慢速消费者时,会发生以下情况:

  • 如果所有消费者都无法接收消息,则发布者的发送函数返回 WOULD_BLOCK
  • 如果至少有一个子会话可以接受直接消息,则发布者的发送函数返回 OK。消息被丢弃给其他子会话。未收到消息的子会话在它们收到的下一条消息上提供了一个丢弃指示标志。

API 调用者不会知道消息没有被传递到某些子会话。这与向可能有一些慢速消费者的事件代理发送直接消息时发生的行为是一致的。

非多点会话

尽管,默认情况下,IPC 会话是多点的,但 IPC 也可以用于非多点会话,其中会话只有一个 IPC 对等方。非多点会话允许应用程序只接受一个传入连接,而不是接受任意数量的传入连接。

连接模型

通过 IPC 进行通信的应用程序必须首先在它们之间建立一个 TCP 通道,其中一个应用程序积极地建立连接,另一个应用程序接受传入连接。因此,TCP 监听端口是应用程序用来相互发现的机制(在同一主机上或在不同的主机上)。

一旦建立了 TCP 连接,建立连接的应用程序就会向对等应用程序指示是否使用 TCP 通道或共享内存用于连接。如果指定了 TCP,则已建立的 TCP 连接继续用于通信。如果指定了共享内存,则应用程序切换到共享内存通道,然后拆除 TCP 连接。然而,TCP 通道允许连接的应用程序向监听的应用程序指示用于进一步通信的共享内存通道的详细信息。

当使用共享内存通信时,建立连接的应用程序负责创建共享内存通道并控制通道的大小(即,为每个方向的通信分配的内存量)。监听的应用程序只需接受这个通道,然后使用它。