这取决于消息传递模式。
发送PERSISTENT
消息后,tibemsMsgProducer_SendToDestination
呼叫将等待 EMS 服务器回复确认。
发送NON_PERSISTENT
消息时,tibemsMsgProducer_SendToDestination
呼叫可能会或可能不会等待确认,具体取决于是否启用了授权和npsend_check_mode
设置。有关具体详细信息,请参阅 EMS 文档(上面链接)。
最后,当RELIABLE_DELIVERY
发送消息时,tibemsMsgProducer_SendToDestination
调用不会等待确认,只有在与 EMS 服务器的连接丢失时才会失败。
但是,即使在发送确认的情况下,这也只是确认 EMS 服务器已收到消息。它不确认消息已被消息使用者接收和处理。EMS 监控消息可用于确定消息是否已被消费者确认。
消息监控主题的格式为$sys.monitor.<D>.<E>.<destination>
,其中<D>
matches Q|q|T|t
、<E>
matchess|r|a|p|\*
和<destination>
是目的地的名称。例如,要监视名为 的队列的消息确认beterman
,您的程序将订阅$sys.monitor.q.a.beterman
(或者$sys.monitor.Q.a.beterman
如果您想要已确认消息的副本)。
监控消息包含许多属性msg_id
,包括、source_name
和target_name
。您可以使用该信息将其与您发送的消息相关联。
否则,更简单的选择是使用 atibemsMsgRequestor
而不是 a tibemsMsgProducer
。tibemsMsgRequestor_Request
将发送消息并等待收件人的回复。在这种情况下,您最好使用RELIABLE_DELIVERY
并NO_ACKNOWLEDGE
删除生产者与 EMS 服务器以及 EMS 服务器与消费者之间的所有确认和确认消息。
但是,如果您确实走这tibemsMsgRequestor
条路,那么您可能还想考虑简单地使用 HTTP 请求,用负载平衡器代替 EMS 服务器。在架构上,这两个选项之间没有太大区别(EMS 使用持久 TCP 连接,HTTP 不使用)
Producer -> EMS Server -> ConsumerA
-> ConsumerB
Client -> Load Balancer -> ServerA
-> ServerB
但是对于HTTP,每个方法都有清晰的语义。GET 是安全的(不改变状态),PUT 和 DELETE 是幂等的(多个相同的请求应该与单个请求具有相同的效果),POST 是非幂等的(每次执行都会导致服务器状态发生变化)等。您也有明确定义的状态代码。如果您正在使用tibemsMsgRequestor
,则需要创建定制的语义和响应状态,这将需要额外的努力来创建、维护和培训团队中的其他开发人员。
此外,找到具有 HTTP 技能的开发人员比 EMS 技能要容易得多,而且找到 EMS 的 HTTP 信息要容易得多,因此该tibemsMsgRequestor
选项将使招聘更加困难,解决问题更加困难。
因为这个 HTTP 是一个更好的选择 IMO,用于请求-回复或当您想要确保发送的消息被成功处理时。