博客
关于我
Azure Messaging-ServiceBus Messaging消息队列技术系列7-消息事务
阅读量:460 次
发布时间:2019-03-06

本文共 1821 字,大约阅读时间需要 6 分钟。

Azure Service Bus 中消息事务支持

在前一篇文章中,我们探讨了 Azure Messaging ServiceBus 的消息回执机制。本文将深入研究Service Bus队列中的消息事务支持。

事务支持概述

Service Bus 队列在处理消息时,支持基于 TransactionScope 的本地事务。这意味着在同一个队列中,消息发送和接收可以通过事务协调,确保所有操作要么全部成功,要么全部回滚。然而,需要注意以下事务限制:

  • 单一资源支持:事务只能包含一个Queue或Topic。
  • 订阅限制:订阅不能放置在事务中。
  • 系统限制:事务不支持与其他系统(如数据库)集成。
  • 消息事务的实际应用场景

    消息事务在实际应用中有多种用途:

  • 订单状态更新:启动一个事务性会话,将更新订单状态的消息和更新账户余额的消息放入同一事务中。若消息发送失败,系统将自动回滚,确保数据一致性。
  • 消息接收处理:在消息成功发送后,启动另一个事务性会话接收并处理这两条消息,保证接收和处理过程的原子性。
  • 以下是验证同一队列中发送多条消息的事务流程:

    public static void SendMessageTransactional(){    var sbUtils = new ServiceBusUtils();    sbUtils.CreateQueue(queueName, false);    var queueSendClient = sbUtils.GetQueueClient(queueName);        using (var trans = new TransactionScope())    {        var order1 = CreateSalesOrder(1);        var order2 = CreateSalesOrder(2);        var message1 = sbUtils.Create(order1);        var message2 = sbUtils.Create(order2);                queueSendClient.Send(message1);        queueSendClient.Send(message2);                Console.WriteLine("Send but uncomplete!");        trans.Complete();        Console.WriteLine("Complete!");    }}

    在事务未完成前,队列中的消息状态为未确认。事务完成后,消息将被标记为已发送并移除队列。

    接下来,我们验证同一队列接收消息的事务性:

    public static void ReceiveMessageTransactional(){    var sbUtils = new ServiceBusUtils();    var queueReveiveClient = sbUtils.GetReceiveQueueClient(queueName, ReceiveMode.PeekLock);        using (var trans = new TransactionScope())    {        var message1 = queueReveiveClient.Receive();        message1.Complete();        var message2 = queueReveiveClient.Receive();        message2.Complete();                Console.WriteLine("Received but uncomplete!");        trans.Complete();        Console.WriteLine("Complete!");    }}

    在事务未完成前,接收的消息仍留在队列中。事务完成后,消息将被标记为已接收并从队列中移除。

    总结

    通过以上验证,可以看出 Azure Service Bus 在消息发送和接收方面提供了强大的事务支持。这种机制对于需要保证消息可靠传输和处理的场景尤为重要。

    转载地址:http://qhhfz.baihongyu.com/

    你可能感兴趣的文章
    poi-tl简介与文本/表格和图片渲染
    查看>>
    pointnet分割自己的点云数据_PointNet解析
    查看>>
    POI实现Excel导入Cannot get a text value from a numeric cell
    查看>>
    POI实现Excel导入时提示NoSuchMethodError: org.apache.poi.util.POILogger.log
    查看>>
    POI实现Excel导出时常用方法说明
    查看>>
    POI导出Excel2003
    查看>>
    POI数据获取及坐标纠偏
    查看>>
    Quartz入门看这一篇文章就够了
    查看>>
    POI解析Excel【poi的坑——空行处理】
    查看>>
    POI:POI+JXL实现xls文件添加水印
    查看>>
    POI:POI实现docx文件添加水印
    查看>>
    POJ 1006
    查看>>
    Quartz中时间表达式的设置-----corn表达式
    查看>>
    poj 1035
    查看>>
    POJ 1061 青蛙的约会 (扩展欧几里得)
    查看>>
    Quartz2.2.1简单使用
    查看>>
    POJ 1080 Human Gene Functions(DP:LCS)
    查看>>
    Quant 开源项目教程
    查看>>
    POJ 1088 滑雪
    查看>>
    POJ 1095 Trees Made to Order
    查看>>