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

    你可能感兴趣的文章
    php_crond:一个基于多进程的定时任务系统-支持秒粒度的任务配置
    查看>>
    PHP__call __callStatic
    查看>>
    PHP——修改数据库1
    查看>>
    PHP——封装Curl请求方法支持POST | DELETE | GET | PUT 等
    查看>>
    PHP——底层运行机制与原理
    查看>>
    php一句话图片运行,【后端开发】php一句话图片木马怎么解析
    查看>>
    PHP三方登录,移动端与服务端交互
    查看>>
    Redis事务深入解析和使用
    查看>>
    PHP上传文件大小限制的调整 Nginx 413 Request Entity Too Large
    查看>>
    php上传文件找不到临时文件夹
    查看>>
    PHP上传文件时保存文件原有的文件名
    查看>>
    PHP下curl用法分析
    查看>>
    php下载文件
    查看>>
    php与web服务器关系
    查看>>
    redis事务操作
    查看>>
    php中0,空,null和false的区别
    查看>>
    PHP中array_merge和array相加的区别分析
    查看>>
    PHP中Closure::bindTo的用法分析
    查看>>
    php中curl得使用
    查看>>
    PHP中curl特性
    查看>>