這取決於Message Delivery Mode。
當發送PERSISTENT
消息時,tibemsMsgProducer_SendToDestination
呼叫將等待EMS服務器回覆確認。
當發送NON_PERSISTENT
消息時,tibemsMsgProducer_SendToDestination
呼叫可能會或可能不會等待確認,具體取決於授權是否已啓用以及npsend_check_mode
設置。請參閱EMS文檔(上面鏈接)瞭解具體的細節。
最後,當發送RELIABLE_DELIVERY
消息時,tibemsMsgProducer_SendToDestination
調用不會等待確認,並且只會在與EMS服務器的連接丟失時失敗。
但是,即使在發送確認的情況下,這也只是確認EMS服務器已收到該消息。它不確認消息是由消息使用者接收和處理的。 EMS Monitoring Messages可用於確定消息是否被消費者確認。
消息監視主題表格中$sys.monitor.<D>.<E>.<destination>
,其中<D>
比賽Q|q|T|t
,<E>
比賽s|r|a|p|\*
和<destination>
是目標的名稱。例如,要監視名爲beterman
的隊列的消息確認,您的程序將訂閱$sys.monitor.q.a.beterman
(或者如果需要已確認的消息的副本,則爲)。
該monitoring messages contain many properties,包括msg_id
,source_name
和target_name
。您可以使用該信息將其關聯回您發送的消息。
否則,更簡單的選項是使用tibemsMsgRequestor
而不是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 you have clear semantics for each of the methods。 GET是safe(不更改狀態),PUT和DELETE是idempotent(多個相同的請求應該與單個請求具有相同的效果),並且POST是非冪等的(每次執行時都會導致服務器狀態發生更改)等您還有well defined status codes。如果您使用的是tibemsMsgRequestor
,則需要創建定製的語義和響應狀態,這需要額外的努力來創建,維護和培訓團隊中的其他開發人員。
此外,使用HTTP技能比EMS技能更容易找到開發人員,並且更容易找到EMS的信息HTTP,因此tibemsMsgRequestor
選項將使招聘變得更加困難,解決問題的難度也更大。
由於這個HTTP是一個更好的選項IMO,用於請求回覆或者希望確保發送的消息被成功處理時。