我想将从事件中心收到的一个事件发送到服务总线中的多个主题。我使用以下代码使用foreach将事件发送到多个主题以获取topicname。 因为它是一个foreach循环,所以我得到了延迟。有没有更好的方法呢。
foreach (var topicname in GetTopics_ActiveList(payload).Result)
{
TopicClient Client = TopicClient.CreateFromConnectionString(connectionstring, topicname);
var payloadStream = new MemoryStream(Encoding.UTF8.GetBytes(payload));
//var msg = JsonConvert.SerializeObject(payloadStream);
//BrokeredMessage message = new BrokeredMessage(payloadStream, true);
BrokeredMessage message = new BrokeredMessage(payloadStream);
Client.Send(message);
}
答案 0 :(得分:0)
有没有更好的方法呢。
始终。对于启动器,您可以缓存客户端而不是每次创建。其次,使用Send方法的异步发送版本(SendAsync
),而不是一次发送一个,收集任务并等待Task.WhenAll
。并在循环中构建您的代理消息和clone it。
var msg = BuildYourMessage();
var sendTasks = new List<Task>();
foreach (var topic in topicsCache)
{
sendTasks.Add(client.SendAsync(msg.Clone()));
}
Tasks.WhenAll(sendTasks).ConfigureAwait(false);
我遇到的问题是为什么要将它发送到多个主题而不是一个包含多个订阅的主题?也许你可以逃脱这个和一个发送到该主题,委托Azure服务总线执行所有订阅的广播。
答案 1 :(得分:0)
不确定是否已解决此问题,但是每条服务总线消息都可以带有标签,并且可以使用该事件的类型名称作为标签,然后在订阅客户端上可以添加规则以基于使用CorrelationFilter标签。 microsft eShopOnContainers示例就是一个很好的例子。一个通过微服务建立的漂亮的网络,几乎爆满了,该服务通过rabbitmq和/或服务总线进行通信。以下是特定serviceBus实现的链接:https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.cs