是否可以使用Azure服务总线实现以下伪场景?
我有一个可以扩展到50个示例的函数,它使用了一个服务总线触发器。我想保证,只有当现有的相关消息当前没有被处理时,相关消息才会被处理。
假设我有一条信息(消息A)正在由与用户ID 1234相关联的功能示例处理。(消息B)出现在也与UserID 1234相关联的队列上,服务总线应该“忽略”它,因为相关消息已经在处理中。另一个消息(消息C)出现在队列中,由于没有用户ID为9876的操作中消息,因此立即进行处理。
消息A完成处理,现在将拾取消息B。
目前,我有一个路由函数,它使用初始服务总线触发器,然后将其路由到10个函数之一,每个函数负责UserID的最后一个数字为0-9的消息。
这意味着如果函数“4”忙碌处理一个请求,它将无法处理UserID以4结尾的任何其他请求,从而保证系统无法同时处理相关消息。它完成了它的工作,但没有伸缩性。
2条答案
按热度按时间pkln4tw61#
没有条件锁定。从描述来看,听起来你想处理与同一用户ID关联的消息,一次一个。为此,Azure Service Bus有一个名为Message Sessions的功能。
zwghvu4y2#
据我所知,Azure服务总线有一个内置的锁定机制,所以无论消息是什么,如果您阅读一个队列,当一个函数拾取该消息时,其余的函数将不会拾取该相同的消息。(因此,在您的函数中,当您选择一条消息时,您会在进行任何处理之前将其插入Azure表存储中,并在处理之前检查它是否存在)。
服务总线-https://learn.microsoft.com/en-us/azure/service-bus-messaging/message-transfers-locks-settlement
表存储-https://learn.microsoft.com/en-us/azure/cosmos-db/table/quickstart-dotnet?toc=https%3A%2F%2Flearn.microsoft.com%2Fen-us%2Fazure%2Fstorage%2Ftables%2Ftoc.json&bc=https%3A%2F%2Flearn.microsoft.com%2Fen-us%2Fazure%2Fbread%2Ftoc.json&tabs=azure-cli%2Cwindows
总而言之,我认为这里的解决方案将使用多种技术,并使用一个中心点,您的横向扩展功能可以根据其他功能处理的内容进行验证,无论该中心数据库是什么