使用多个区域 Azure 队列时如何将消息路由到正确的队列

问题描述

我有一个应用分发到五个地区,美国、欧盟、中国等。

请求被路由到离客户最近的工作人员,但是请求的某些方面必须根据某些业务逻辑在特定区域进行处理,例如如果客户从纽约证券交易所请求信息但在欧洲,大部分工作可以在欧洲进行,但部分工作必须在美国地区进行。

当发生这种情况时,我会使用正确区域的正确 QueueClient 向处理敏感工作的地方发送消息。

我有一个路由客户端来确定我们何时需要将这些消息发送到正确的区域,这很好用。但是我发现我需要管理多个队列客户端。

正在寻找能够满足这种需求的设计模式,因为今天我正在这样做:

public class MyService : IMyAppService
    {
        private readonly IMyAppQueueEventClient usQueueClient;
        private readonly IMyAppQueueEventClient euQueueClient;
        private readonly IMyAppQueueEventClient cnQueueClient;

        public MyAppService(IMyAppQueueEventClient USQueueClient,IMyAppQueueEventClient EUqueueClient;
            IMyAppQueueEventClient CNqueueClient;
            )
        {
            
            this.usQueueClient = USQueueClient;
            this.euQueueClient = EUQueueClient;
            this.cnQueueClient = CNQueueClient;
            
        }

这感觉真的很笨拙。当我添加新区域时,我最终不得不更新构造函数,这会导致后续更改以更新测试等。

当然有一种方法可以从 appSettings 中读取并创建一个 QueueClient 数组并将它们传入,然后选择正确的。

解决方法

我解决这个需求的方法是使用装饰器模式。

我采用了基本 authorizationFailureHandler 并将它和一个 authorizedClientService 属性类型添加到如下实现中:

QueueClient

我向此类添加了一个 string Region 方法,该方法调用私有 public class RegionalQueueClient public string region; private QueueClient client; 成员来传递消息。

然后我创建了另一种类型,称为我的 public Receipt SendMessage(),其中包含一个 QueueClient 成员。

我使用 DependencyInjection 将它们全部加载,它的作用就像一个魅力,我能够根据需要使用 Linq 查询为正确的区域找到正确的客户端。

记录从 SuperQueue 中读取为数组,如 seen in this answer.