博客
关于我
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/

    你可能感兴趣的文章
    python 存入数据库bigint_python基础_MySQL的bigint类型
    查看>>
    python 学习 面向对象编程
    查看>>
    Python 学习小结
    查看>>
    Python 学习日记第三篇 -- 字典
    查看>>
    Python 学习笔记(一)Data type
    查看>>
    python 安装 easy_install 和 pip 流程
    查看>>
    python 安装echarts
    查看>>
    python 安装opencv及问题解决
    查看>>
    Python 安装程序:“写入文件 C:\Python27\pythonw.exe 时出错“
    查看>>
    Python 安装避坑指南:从入门到进阶
    查看>>
    Python 安装配置详解
    查看>>
    python 实现儿童算术游戏
    查看>>
    python 实现字符串转整型
    查看>>
    Python 实现定时任务的八种方案!
    查看>>
    python 实现将RGBA 转换为RGB
    查看>>
    Python 实现自动化测试 dubbo 协议接口
    查看>>
    python编程基础之十六
    查看>>
    python字符串input输入_Python input()函数:获取用户输入的字符串
    查看>>
    python 对json数据读取及保存与读取,对dump,dumps,load,loads的理解
    查看>>
    Python 对mysql数据库的操作
    查看>>