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

What is the best approach to copy messages from one service bus to another?

让我给你介绍一下背景。我有一个 IoT 应用程序,它正在将数据流式传输到服务总线,该服务总线在 LIVE 环境中具有多个订阅者的主题过滤器,一切都很好。现在我正在尝试创建一个完全独立的测试环境。当数据流式传输到 LIVE 时,我希望所有消息的副本也进入这个测试环境,这样我们就可以为测试团队隔离环境。到目前为止,提出的解决方案是在代码中添加第二个服务总线连接,并将消息添加到实时总线和测试总线。这需要在应用程序的许多区域更改代码并且很笨重。我正在寻找一种更优雅的方法,我可以复制到达第二辆公共汽车的消息。第一辆公共汽车得到一份副本,第二辆公共汽车也得到一份副本。任何建议将不胜感激?

Azure 服务总线从今天起不支持跨命名空间转发。如果可能的话,您将能够使用 auto-forwarding 设置对另一个命名空间的订阅。在那之前,您确实需要设置一些自定义内容。

So far the solutions proposed have been, is to add a second service bus connection in code and add the messages to both the buses the live one and the test one. This requires code change in many areas of the app and is clunky.

除此之外,它将测试问题引入到您的生产应用程序中,这感觉不对。我会尝试的一种方法(注意还有其他选项也可以工作)是有一个额外的订阅 entity 并引入一个配置为使用测试命名空间的 Azure Function triggered by ServiceBusTrigger configured to the subscription entity you'll set up. The function would be able to leverage a ServiceBus output binding。这种方法的好处是:

  1. 您的生产应用程序无需更改。
  2. 您可以完全控制通过订阅过滤将哪些消息推送到测试命名空间。
  3. 您可以通过 disabling/enabling 订阅或与函数一起删除它来控制消息流入函数。

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

伪代码:

[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();
}