--更新:Bug 修复

The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue

  1. 消息dequeue时增加auto complete

    public static async Task MessageDequeueAsync()

    {

    // Configure the MessageHandler Options in terms of exception handling, number of concurrent messages to deliver etc.

    var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)

    {

    // Maximum number of Concurrent calls to the callback ProcessMessagesAsync, set to 1 for simplicity.

    // Set it according to how many messages the application wants to process in parallel.

    MaxConcurrentCalls = 1,

             // Indicates whether MessagePump should automatically complete the messages after returning from User Callback.
    // False below indicates the Complete will be handled by the User Callback as in `ProcessMessagesAsync` below.
    AutoComplete = false
    }; // Register the queue message handler and receive messages in a loop
    queueClient.RegisterMessageHandler(
    async (message, token) =>
    {
    // Process the message
    await PostMessageToBot(message);
    loggerCore.Information($"Received message: SequenceNumber:{message.SystemProperties.SequenceNumber} Body:{Encoding.UTF8.GetString(message.Body)}");
    // Complete the message so that it is not received again.
    // This can be done only if the queueClient is opened in ReceiveMode.PeekLock mode.
    await queueClient.CompleteAsync(message.SystemProperties.LockToken);
    },
    //async (exceptionEvent) =>
    //{
    // // Process the exception
    // loggerCore.Error($"WeChat message dequeue exception:{exceptionEvent.Exception.Message}");
    //}
    messageHandlerOptions);
    }

2.在Azure上设置duplication detect时间,由1~59s,设置为55s,大笔试lock duration 时间长,可供消费的时间。

前言

第一次使用消息队列,遇到了一些问题:同一个消息有多次出列。是一个消息只入列一次,还是多次?还是因为出列问题,出列了多次?

Microsoft Azure service bus queue

Azure service bus queue在Azure上创建一个service bus,在service bus 上创建一个 queue,创建的时候注意 enable duplicate detected message这个选项选上,防止消息重复入列。

找到SAS Policy: RootManageSharedAccessKey 的值,复制下来,用作connectstring。

Azure service bus sample on github

配置servicebus 的queue

namespace:Microsoft.Azure.ServiceBus;

初始化queueClient:

private static readonly Serilog.ILogger loggerCore = LoggerCoreFactory.GetLoggerCore();
const string ServiceBusConnectionString = "Endpoint=sb://{YOUR-NAMESPACE-ON-Azure}.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey={YOUR-KEYS}";
const string QueueName = "{YOUR-QUEUE-NAME}";
static IQueueClient queueClient; static MessageQueueHandler()
{
queueClient = new QueueClient(ServiceBusConnectionString, QueueName);
}

消息入列

这里添加messageID 作为入列依据,防止同一消息多次入列,然后不用频繁的关闭消息连接,影响性能。

public static async Task MessageEnqueueAsync(string message)
{
// Send messages.
await SendMessagesAsync(message);
// don't close frequently
//await queueClient.CloseAsync();
} static async Task SendMessagesAsync(string messageXML)
{
try
{
// Create a new message to send to the queue.
var messageStr = ParseMessageType.Parse(messageXML);
var msgId = messageStr.Body.MsgId.Value;
var message = new Microsoft.Azure.ServiceBus.Message
{
MessageId = msgId,// avoid same message enqueue more than once
Body = Encoding.UTF8.GetBytes(messageXML),
};
loggerCore.Information($"message enqueue:{messageXML}");
// Send the message to the queue.
await queueClient.SendAsync(message);
}
catch (Exception exception)
{
loggerCore.Error($"message enqueue error:{exception.ToString()}");
}
}

出列

public static async Task MessageDequeueAsync()
{
// please choice PeekLock mode
queueClient = new QueueClient(ServiceBusConnectionString, QueueName, ReceiveMode.PeekLock); // Register the queue message handler and receive messages in a loop
queueClient.RegisterMessageHandler(
async (message, token) =>
{
// Process the message
await PostMessageToBot(message);
loggerCore.Information($"Received message: SequenceNumber:{message.SystemProperties.SequenceNumber} Body:{Encoding.UTF8.GetString(message.Body)}");
// Complete the message so that it is not received again.
// This can be done only if the queueClient is opened in ReceiveMode.PeekLock mode.
await queueClient.CompleteAsync(message.SystemProperties.LockToken);
},
async (exceptionEvent) =>
{
// Process the exception
loggerCore.Error($"WeChat message dequeue exception:{exceptionEvent.ToString()}");
});
}

这样消息就会根据入列的先后,逐次出列。

后记

几个有帮助的链接分享一下:

1.Read best practice. 就是如何最好的使用Azure queue,避免不需要的开销。

2.Enable queue duplicate detection 启用消息重复检测项,防止同一消息多次额enqueue。

微软云消息队列 Azure service bus queue的更多相关文章

  1. 【Microsoft Azure学习之旅】测试消息队列(Service Bus Queue)是否会丢消息

    组里最近遇到一个问题,微软的Azure Service Bus Queue是否可靠?是否会出现丢失消息的情况? 具体缘由如下, 由于开发的产品是SaaS产品,为防止消息丢失,跨Module消息传递使用 ...

  2. 如何在ASP.NET Core中使用Azure Service Bus Queue

    原文:USING AZURE SERVICE BUS QUEUES WITH ASP.NET CORE SERVICES 作者:damienbod 译文:如何在ASP.NET Core中使用Azure ...

  3. Windows Azure Service Bus (2) 队列(Queue)入门

    <Windows Azure Platform 系列文章目录> Service Bus 队列(Queue) Service Bus的Queue非常适合分布式应用.当使用Service Bu ...

  4. Azure Service Bus(二)在NET Core 控制台中如何操作 Service Bus Queue

    一,引言 上一篇讲到关于 Azure ServiceBus 的一些概念,讲到 Azure Service Bus(服务总线),其实也叫 "云消息服务",是微软在Azure 上提供的 ...

  5. Windows Azure Service Bus (4) Service Bus Queue和Storage Queue的区别

    <Windows Azure Platform 系列文章目录> 熟悉笔者文章的读者都了解,Azure提供两种不同方式的Queue消息队列: 1.Azure Storage Queue 具体 ...

  6. 阿里云ONS而微软Azure Service Bus体系结构和功能比较

    阿里云ONS而微软Azure Service bus体系结构和功能比较 版权所有所有,转载请注明出处http://blog.csdn.net/yangzhenping.谢谢! 阿里云的开放消息服务: ...

  7. Windows Azure Service Bus (3) 队列(Queue) 使用VS2013开发Service Bus Queue

    <Windows Azure Platform 系列文章目录> 在之前的Azure Service Bus中,我们已经介绍了Service Bus 队列(Queue)的基本概念. 在本章中 ...

  8. 【服务总线 Azure Service Bus】ServiceBus 队列中死信(DLQ - Dead Letter Queue)问题

    Azure Service Bus 死信队列产生的原因 服务总线中有几个活动会导致从消息引擎本身将消息推送到 DLQ. 如 超过 MaxDeliveryCount 超过 TimeToLive 处理订阅 ...

  9. 【Azure 服务总线】Azure Service Bus中私信(DLQ - Dead Letter Queue)如何快速清理

    在博文ServiceBus 队列中死信(DLQ - Dead Letter Queue)问题一文中,介绍了服务总线产生私信的原因及可以通过代码的方式来清楚私信队列中的消息,避免长期占用空间(因为私信中 ...

随机推荐

  1. 《java入门第一季》模拟用户登陆注册案例集合版

    需求:校验用户名和密码,登陆成功后玩猜数字小游戏. 在这里先写集合版.后面还有IO版.数据库版. 一.猜数字小游戏类: 猜数字小游戏的代码见博客:http://blog.csdn.net/qq_320 ...

  2. Cocos2D:塔防游戏制作之旅(二)

    一个象牙塔的视图 如果你并不熟悉此类型的游戏,塔防游戏是一个战略游戏,你需要购买和将武装塔放置在战略位置,去阻止一波又一波的敌人到达并摧毁你的基地 每一波敌人都更强,这些更强的对手有着更快的速度和对于 ...

  3. Linux之使用网络

    Linux有好多命令可以让你方便的使用网络,常见的有ssh,rsync,wget,curl等等,但是telnet等方式并不适用于网络交互的使用,因为它会暴露你的用户名密码等.所以一般使用安全的命令来进 ...

  4. 基于Qt的手机程序----口袋理财

    主页面 记账模块 制定目标 备忘录

  5. 高性能C++网络库libtnet实现:http

    HTTP libtnet提供了简单的http支持,使用也很简单. 一个简单的http server: void onHandler(const HttpConnectionPtr_t& con ...

  6. AngularJS进阶(三十一)AngularJS项目开发技巧之获取模态对话框中的组件ID

    AngularJS项目开发技巧之获取模态对话框中的组件ID 需求 出于项目开发需求,需要实现的业务逻辑是:药店端点击查看"已发货""已收货"订单详情时,模块弹出 ...

  7. MySQL的一些常用的SQL语句整理

    安装MySQL有两种的方式,一种是解压版本,但是需要配置环境变量,相对而言比较麻烦.所以我们一般采取第二种方式,那就是到MySQL的官网上下载安装版.这样就会省去很多麻烦,在这里我就不再详细的介绍具体 ...

  8. Java之美[从菜鸟到高手演变]之设计模式二

    在阅读过程中有任何问题,请及时联系:egg. 邮箱:xtfggef@gmail.com 微博:http://weibo.com/xtfggef 如有转载,请说明出处:http://blog.csdn. ...

  9. 【Visual C++】游戏编程学习笔记之二:定时器的使用

    本系列文章由@二货梦想家张程所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44195831 作者:ZeeCode ...

  10. ERP-非财务人员的财务培训教(二)------如何评价公司/部门经营业绩

    一.财务比率分析 第一节  流动性比率 第二节  经营比率 第三节  资本结构比率 第四节  获利能力比率 第五节  现金流量比率 第六节  获现能力比率 二.财务比率金字塔 第二部分   如何评价公 ...