【问题标题】:Nservicebus msmq to azure queue using gatewayNservicebus msmq 到使用网关的天蓝色队列
【发布时间】:2014-02-10 17:09:10
【问题描述】:

我在使用 Bus.SendToQueues 时遇到错误,问题结束时有详细错误。

我有一个使用存储帐户和密钥设置的 azure 队列,我正在尝试使用 Bus.SendToSites 让使用 msmq 的本地服务总线处理程序向 azure 站点发送消息。

尝试启动网关,按照:http://support.nservicebus.com/customer/portal/articles/859548-the-gateway-and-multi-site-distribution,我正在使用此配置:

App.config:(我是否正确设置了网站?)

<section name="GatewayConfig" type="NServiceBus.Config.GatewayConfig, NServiceBus.Core" />
<GatewayConfig>
  <Sites>
    <Site Key="Azure" Address="http://<!--STORAGE ACCOUNT NAME-->.queue.core.windows.net/<!--STORAGE ACCOUNT KEY-->" ChannelType="Http"/>
  </Sites>
</GatewayConfig>

处理程序:

Bus.SendToSites(new[] { "Azure" }, message);

在运行时,我得到以下信息:

错误: 发送消息失败地址:分发者的数据地址,作为该端点发送消息的返回地址..gateway@HFORTE

内部异常:{“格式名称无效。”}

堆栈跟踪: 在 System.Messaging.MessageQueue.MQCacheableInfo.get_WriteHandle() 在 System.Messaging.MessageQueue.StaleSafeSendMessage(MQPROPS 属性,ITransaction 事务) 在 System.Messaging.MessageQueue.StaleSafeSendMessage(MQPROPS 属性,IntPtr 事务) 在 System.Messaging.MessageQueue.SendInternal(对象 obj,MessageQueueTransaction internalTransaction,MessageQueueTransactionType transactionType) 在 System.Messaging.MessageQueue.Send(对象 obj,MessageQueueTransactionType 事务类型) 在 NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage message, Address address) in :line 0

我看到传输是 MSMQ - 这是问题所在,MSMQ 和 Azure 是不同的传输协议,如果是,如何解决?

【问题讨论】:

    标签: nservicebus gateway azure-queues


    【解决方案1】:

    要使用网关,您必须在发送方和接收方双方都托管 NSB。网关只是为 NSB 端点打开 WCF 服务,以便您可以使用 HTTP 协议发送消息。

    MSMQ 和 Azure 队列传输不能组合在一个解决方案中,因为 IBus 实例是单例的。我们必须使用 RavenDb 开发我们自己的“桥梁”服务。我们之所以选择 Raven,是因为它具有 RX 驱动的事件订阅机制,而且易于使用。由于 RavenDb 是一个文档数据库,因此我们还能够按原样保存消息(包装在某些容器中),而无需过多考虑。

    【讨论】:

    • 谢谢,这也是我迄今为止的恐惧和经历。我也开始研究继电器。我使用 webapi 只是将消息发送到 azure,因为我只需要一种方式通信。
    • 我们使用在本地托管但使用 AzureSB 作为传输的 NSB 解决方案。因此,我们使用 AzureSB 来保证从本地到云的交付。但所有其他本地服务都使用 MSMQ。所以我们有这个基于 RavenDb 的网关来在这两者之间交换消息。由于 RavenDb 可以按原样存储消息,而且它支持事件订阅,所以实现起来非常容易。
    • @AlexeyZimarev 有关此解决方案的更多详细信息,它是否达到预期?陷阱?更好的解决方案?
    • @Stephane 我们设法通过使用先进的卫星,在没有任何中介的情况下开发了一座真正的桥梁。但我相信在 NSB 6 中,您可以通过让两个总线实例使用不同的传输来非常简单地使用它。
    【解决方案2】:

    您的站点地址不应是您的 Azure 队列的地址。应该是NServiceBus接收网关通道的地址。

    在这种情况下,Azure 队列和 NSB 网关都使用 HTTP 只是巧合。

    您的发件人(本地托管)将具有此配置

    <GatewayConfig>
    <Sites>
    <Site Key="Azure" Address="https://some.address.com" ChannelType="Http"/>
    </Sites>
    </GatewayConfig>

    您在 Azure 上托管的 NSB 端点将具有此网关配置

    <GatewayConfig>
    <Channels>
    <Channel ChannelType="Http" Address="https://some.address.com" Default="True"/>
    </Channels>
    </GatewayConfig>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 2016-04-28
      • 2021-10-21
      • 1970-01-01
      相关资源
      最近更新 更多