如何解决使用多个区域 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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。