将消息从一条服务总线复制到另一条服务总线的最佳方法是什么?

时间:2019-05-16 23:12:56

标签: azure publish-subscribe azureservicebus azure-servicebus-topics

让我给您一些背景知识。我有一个IoT应用程序,它将数据流传输到Service总线,该总线具有LIVE环境中具有多个订户的Topic筛选器,一切都很好。现在,我正在尝试创建一个完全独立的测试环境。当数据流传输到LIVE时,理想情况下,我也希望所有到达此测试环境的消息的副本,因此我们可以为测试团队隔离环境。到目前为止,提出的解决方案是在代码中添加第二条服务总线连接,并将消息添加到实时和测试总线中。这需要在应用程序的许多区域中进行代码更改,而且很笨重。我正在寻找一种更优雅的方法,可以复制第二辆公共汽车上到达的消息。第一条总线获得副本,第二条总线也获得副本。任何建议将不胜感激?

1 个答案:

答案 0 :(得分:3)

截至目前,Azure Service Bus不支持跨名称空间转发。如果可能的话,您将能够设置一个带有自动转发到另一个名称空间的订阅。在此之前,您确实需要设置一些自定义项。

  

到目前为止,提出的解决方案是在代码中添加第二条服务总线连接,并将消息添加到实时总线和测试总线这两个总线上。这需要在应用程序的许多区域中进行代码更改,而且很笨拙。

除此之外,它还会将测试问题引入您的生产应用程序中,这并不适合您。我会尝试的一种方法(请注意,还有其他一些可行的选择也可以使用)是拥有一个额外的订阅实体,并引入一个由Azure Function触发的ServiceBusTrigger配置为您将设置的订阅实体。该函数将能够利用配置为使用测试名称空间的ServiceBus output binding。这种方法的好处是:

  1. 您的生产应用程序无需更改。
  2. 您可以完全控制通过订阅上的筛选将哪些消息推送到测试名称空间。
  3. 您可以通过禁用/启用订阅或将订阅与功能一起删除来控制进入功能的消息流。

执行函数将产生一些额外费用。

伪代码:

[FunctionName("CloneForTesting")]
[return: ServiceBus(TopicName = "topic", SubscriptionName = "subscription", Connection = "ProductionServiceBusConnection")]
public static string ServiceBusOutput([ServiceBusTrigger(QueueName = "queue", Connection = "TestingServiceBusConnection")] 
Message message, ILogger log)
{
    log.LogInformation($"Cloning message with ID {message.MessageId}");
    return message.Clone();
}