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

    你可能感兴趣的文章
    Protobuf - 语法、字段使用规则、注意事项
    查看>>
    protobuf —— 快速上手
    查看>>
    protobuf —— 认识和安装
    查看>>
    Protobuf 三个关键字required、optional、repeated的理解
    查看>>
    ProtoBuf 原理详解
    查看>>
    Protobuf 实例(java)
    查看>>
    ProtoBuf 实际应用(java)
    查看>>
    Protobuf 属性解释
    查看>>
    Protobuf 编译工具转换 Java 类
    查看>>
    protobuf使用详解
    查看>>
    ProtoBuf在使用protoc进行编译时提示: Required fields are not allowed in proto3
    查看>>
    Protobuf学习 - 入门
    查看>>
    protobuf对象与JSON相互转换
    查看>>
    ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化
    查看>>
    protocol学习笔记001---RPC和HTTP协议之间的区别_与各自优势
    查看>>
    protostuff简单应用
    查看>>
    PRover 开源项目教程
    查看>>
    PyTorch-Tutorials【pytorch官方教程中英文详解】- 4 Transforms
    查看>>
    Proxy server 緩存 jsp html
    查看>>
    Proxy 和 Reflect 结合实现代理和拦截( 代码示例 )
    查看>>