azure-functions - 如何获取非 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 Service Bus 不保证 FIFO 顺序的行为呢?
Azure 服务总线允许采用FIFO方法(先进先出),我们不能保证按我们希望订阅者进程处理消息的顺序输入消息。
为此,我们需要牺牲输入消息的多线程/多进程(Fan-In)方式,而采用单发布者方式。类似地,在消息处理方面,如果不采用单订阅者方法,我们无法保证线程安全的方法来处理消息,从而牺牲了扇出方法的可扩展性优势。
这些选项中的每一个都将削弱 Azure 服务总线的丰富功能,从而降低真正的服务总线架构的能力。
您可以参考此链接以获取更多信息。
我在队列中有消息 1、2、3、4。如果我的应用程序在收到消息 1 时失败,Azure Function 由于其并发性如何反应?当消息 1 超时时,是否会有另一个线程读取消息 2?
基于 azure 文档,Functions 运行时以peek-lock模式接收消息。如果函数成功完成,它会调用Complete
消息,Abandon
如果函数失败,它会调用。
如果函数运行时间超过PeekLock
超时时间,只要函数运行,锁就会自动更新。
推荐阅读
- key - 使用 jq 下降 JSON 文档路径并更新字段名称
- sparql - 为整个 SPARQL 查询创建唯一 ID
- r - R/dplyr:基于一列将值分配给组
- c# - 如何检查streamread行中是否有4个或更多空格
- python - Python XOR解密仅解密一半RGB图像
- java - Tomcat 9 Servlet 使用 gretty 与 webapp 崩溃
- java - 在 maven 中添加了 Randoop 插件以生成单元测试。并且卡在了这个错误中
- windows - PHP 5.6 和 Plesk 中的 .htaccess
- php - PHP从特殊字符读取TXT文件
- javascript - 使用 three.js 和 React 使用 DOM 像素迭代定位球体