跳到主要内容

Deliver-To-One

通过使用Solace消息API,客户端应用程序可以利用Solace PubSub+的Deliver-To-One(DTO)功能,即使有许多客户端具有适当的订阅并且能够接收消息,也只将直接传递消息发送给单个客户端。

使用DTO可以实现接收消息的负载均衡,因为只有一个连接的客户端可以消费DTO消息。需要注意的是,作为直接消息,如果没有连接的客户端,事件代理不会对消息进行缓冲。

DTO优先级和行为仅与设置DTO标志发布的 DTO消息相关。否则,正常交付规则适用;即所有消息都交付给所有订阅者。

  • 对于新应用,我们建议使用共享订阅进行直接消息负载均衡。
  • 使用Web消息API(Javascript和Node.js)的消息消费者无法更改消息优先级以利用DTO特性。

控制DTO消息接收

要控制哪个客户端可以接收DTO消息,订阅客户端通过会话属性被分配一个本地订阅者优先级。订阅者优先级范围从1(最高)到4(最低)。

本地优先级是客户端订阅对于直接连接的事件代理上发布的DTO消息的接收优先级。

当发布DTO消息时,单个具有最高订阅者优先级级别的本地客户端将接收该消息。在多个客户端共享最高本地订阅者优先级的情况下,将通过轮询方式选择单个客户端。

在可能的情况下,发布的DTO消息始终交付给本地连接的客户端。然而,如果没有分配本地订阅者优先级的客户端,则消息将交付给邻近的事件代理(如果可用)。需要注意的是,如果有多个远程连接的事件代理选项,不会尝试在它们之间均匀分配DTO消息。这意味着事件代理网络将确保在连接到事件代理网络的适当客户端中唯一交付DTO消息。但是,只能在连接到同一事件代理的客户端之间预期负载均衡。

DTO与始终交付(DA)

客户端还可以通过在向事件代理添加订阅时对特定主题订阅应用始终交付(DA)属性来覆盖DTO交付。带有DA标志的主题订阅总是接收所有匹配订阅的主题的消息 - 无论设置的优先级如何。使用DA标志覆盖在应用程序希望为审计、重放或监控目的接收消息副本时非常有用。例如,监控应用程序应对其所有订阅使用DA标志,以确保它不会意外成为DTO组的成员并接收应交付给依赖DTO的其他应用程序的消息。

作为特殊情况,订阅>(匹配所有主题)始终被视为DA订阅。

优先级为1至4的订阅和DA订阅如果共享相同的主题字符串是唯一的,这意味着客户端可以对同一主题同时拥有DTO和DA订阅。然而,如果客户端由于优先级和DA订阅都有资格接收给定消息,只会交付单份消息。

如何显示订阅的DTO优先级

订阅的DTO优先级通过show smrp subscriptions用户执行命令显示为P1至P4的值或DA值,以表示始终交付订阅。

img 示例:

solace> show smrp subscriptions
Flags Legend:
T - Destination Type (C=local-client, Q=local queue, R=remote-router)
P - Subscription Persistence (P=persistent, N=non-persistent)
R - Redundancy Type for Local Destinations (P=primary, B=backup, S=static, -=not-applicable)
Message VPN : default (exported: Yes; 100% complete)
Destination Name       Flags BlkID DTO  Subscription
                       T   P   R       Prio
---------------------- -   -   ----- ---- ------------------------------------
#client                C   N   S     0   P1   #MCAST/>
#client                C   N   S     0   P1   #SEMP/lab-129-4/>
#client                C   N   S     0   P1   #P2P/lab-129-4/#client/>
#client                C   N   S     0   P1   #P2P/v:lab-129-4/#client/>
#client                C   N   S     0   P1   #SEMP/v:lab-129-4/>
#client                C   N   S     0   P1   #P2P/lab-129-4/WnAHbdbR/#client/>
dev2-180/316/#00000001 C   N   P    34   P1   #P2P/v:lab-129-4/27vgoQH9/dev2-180/316/#00000001/>
dev2-180/316/#00000001 C   N   P    33   P1   a/b
test000001             C   N   P    33   P3   #P2P/v:lab-129-4/YC4EzyB4/test000001/>
testInstance           C   N   P    33   P1   #P2P/v:lab-129-4/0N7rz7R0/testInstance/>
testInstance           C   N   P    33   DA   a/b
testInstance           C   N   P    33   P1   #P2P/CACHEINST/testInstance/>
testInstance           C   N   P    34   P1   #P2P/CACHEINST/testCluster/>
testInstance           C   N   P    35   P1   #P2P/CACHEINST/testCache/>
Message VPN : testVpn (exported: No; 100% complete)
Destination Name       Flags BlkID DTO  Subscription
                       T   P   R       Prio
---------------------- -   -   ----- ---- ------------------------------------
#client                C   N   S     -   P1   #MCAST/>
#client                C   N   S     -   P1   #SEMP/lab-129-4/>
#client                C   N   S     -   P1   #P2P/lab-129-4/#client/>
#client                C   N   S     -   P1   #P2P/v:lab-129-4/#client/>
#client                C   N   S     -   P1   #SEMP/v:lab-129-4/>
#client                C   N   S     -   P1   #P2P/lab-129-4/WnAHbdbR/#client/>