Azure Messaging-ServiceBus Messaging消息隊列技術系列7-消息事務
阿新 • • 發佈:2017-05-12
topic ons single 例如 bus tel .com gif ext
上篇博文中我們介紹了Azure Messaging-ServiceBus Messaging消息回執機制。
Azure Messaging-ServiceBus Messaging消息回執機制
本文中我們主要研究消息的事務。直奔主題:
- Service Bus Queues支持事務,基於TransactionScope
- Service Bus Queues provide support for local transactions in the context of a single queue.
- 事務的限制:事務只能包含一個Queue或者Topic,訂閱不能放在事務中,同時事務不支持其他系統,例如數據庫
那消息事務的實際應用場景有哪些呢?例如:
1.啟動一個事務性的會話,將發送更新訂單狀態消息和更新賬戶余額消息放到一個事務中,消息發送失敗後 rollback,確認消息未被發送。
2.發送更新訂單狀態消息和更新賬戶余額消息成功後,啟動一個事務性的會話,接收並處理這兩條消息。
那我們先從同一個隊列中發送多條消息這個場景驗證:
1 public static void SendMessageTransactional() 2 { 3 var sbUtils = new ServiceBusUtils(); 4 5 //創建隊列 6 sbUtils.CreateQueue(queueName, false); 7 8 //多次發送消息到OrderQueue 9 var queueSendClient = sbUtils.GetQueueClient(queueName); 10 11 using (var trans = new TransactionScope()) 12 { 13 var order1 = CreateSalesOrder(1); 14 var order2 = CreateSalesOrder(2); 15 var message1 = sbUtils.Create(order1); 16 var message2 = sbUtils.Create(order2); 17 queueSendClient.Send(message1); 18 queueSendClient.Send(message2); 19 Console.WriteLine("Send but uncomplete!"); 20 trans.Complete(); 21 22 Console.WriteLine("Complete!"); 23 } 24 }
發送消息完成,但是未提交事務前,隊列是這樣的:
事務提交後Complete:
然後,我們繼續研究驗證同一個隊列接收消息的事務性:有個前提要求:
消息接收時,如果啟動事務,消息消費接收模式必須是PeekAndLock模式。
消息接收完成,如果事務不Complete,消息仍舊在消息隊列中。
1 public static void ReceiveMessageTransactional() 2 { 3 var sbUtils = new ServiceBusUtils(); 4 var queueReveiveClient = sbUtils.GetReceiveQueueClient(queueName, ReceiveMode.PeekLock); 5 using (var trans = new TransactionScope()) 6 { 7 var message1 = queueReveiveClient.Receive(); 8 message1.Complete(); 9 var message2 = queueReveiveClient.Receive(); 10 message2.Complete(); 11 Console.WriteLine("Received but uncomplete!"); 12 trans.Complete(); 13 14 Console.WriteLine("Complete!"); 15 } 16 }
當接收完消息,事務未提交時:
隊列中的消息是:
事務提交後:
Azure Service Bus 中消息:
消息已經被消費。
以上就是Azure ServiceBus 中對消息事務的支持。
2017/3/30
Azure Messaging-ServiceBus Messaging消息隊列技術系列7-消息事務