首页 > 解决方案 > 如何获取非 FIFO 顺序的 Azure 服务总线队列消息?

问题描述

我有以下 Http 触发 Azure 函数将数据发送到队列中。但是如何才能看到 Azure Service Bus 不保证 FIFO 顺序的行为呢?

我正在使用偷看锁接收行为。假设我在队列中有消息 1、2、3、4。如果我的应用程序在收到消息 1 时失败,Azure Function 由于其并发性如何反应?当消息 1 超时时,是否会有另一个线程读取消息 2?

        [FunctionName("ServiceBusFunction")]
        public static void Run([ServiceBusTrigger("testQueueDuplicateDetection")] string myQueueItem, ILogger log)
        {
            log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
        }

        [FunctionName("ServiceBusOutput")]
        [return: ServiceBus("testQueueDuplicateDetection")]
        public static string ServiceBusOutput([HttpTrigger] string input, ILogger log)
        {
            log.LogInformation($"C# function processed: {input}");
            return input;
        }

提前致谢!

标签: azure-functionsazureservicebusazure-servicebus-queuesazure-function-async

解决方案


但是如何才能看到 Azure Service Bus 不保证 FIFO 顺序的行为呢?

Azure 服务总线允许采用FIFO方法(先进先出),我们不能保证按我们希望订阅者进程处理消息的顺序输入消息。

为此,我们需要牺牲输入消息的多线程/多进程(Fan-In)方式,而采用单发布者方式。类似地,在消息处理方面,如果不采用单订阅者方法,我们无法保证线程安全的方法来处理消息,从而牺牲了扇出方法的可扩展性优势。

这些选项中的每一个都将削弱 Azure 服务总线的丰富功能,从而降低真正的服务总线架构的能力。

您可以参考此链接以获取更多信息。

我在队列中有消息 1、2、3、4。如果我的应用程序在收到消息 1 时失败,Azure Function 由于其并发性如何反应?当消息 1 超时时,是否会有另一个线程读取消息 2?

基于 azure 文档,Functions 运行时以peek-lock模式接收消息。如果函数成功完成,它会调用Complete消息,Abandon如果函数失败,它会调用。

如果函数运行时间超过PeekLock超时时间,只要函数运行,锁就会自动更新。


推荐阅读