上篇博文中我們介紹了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.發送更新訂單狀态消息和更新賬戶餘額消息成功後,啟動一個事務性的會話,接收并處理這兩條消息。
那我們先從同一個隊列中發送多條消息這個場景驗證:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuMTOwgzM3gTN4ETLyUDOzUDNyEjMwMzMwcTMwITL1ITNzIzLcNDM3EDMy8CX1ITNzIzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
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