NServiceBus&物联网 - 将来自客户端的消息直接放入队列中,并在服务器端使用NServiceBus进行处理

时间:2015-08-30 07:44:06

标签: nservicebus nservicebus5

使用NServiceBus(版本5)在.NET中编写后端。到目前为止,我们的客户端(.NET客户端和c ++客户端)都在向具有NServiceBus的WCF服务发送消息,而WCF服务将NServiceBus消息发送给正确的工作者。

现在我们正在对我们的架构进行一些更改,并希望一些客户端将消息直接放入队列并跳过WCF。我们有很多设备(大多数是用c ++编写的)。

我知道NServiceBus用它自己的对象包装它放入队列的消息。我的问题是NServiceBus是否有办法在IoT环境中工作 - 设备将消息直接放入队列,而中间没有适配器?或者服务器端(工作者)处理未使用NServiceBus对象包装的“常规”消息?

3 个答案:

答案 0 :(得分:1)

如果您只是尝试将信息发送到目的地或发布活动,那么您没有提及您的传输内容?其中一些选择可能会改变答案,但你应该得到它的要点。

可以直接通过将消息放入队列来与NServiceBus集成。如果您查看documentation,您会看到有#Scripting'每个传输下的部分,向您展示如何将消息直接放入队列。如果要与MSMQ集成,可以找到文档页面here

NSB消息附带Headers。标头中的大多数值都是可选的,它们带有合理的默认值,因此您真正需要的只是消息类型(消息有效负载的实际类型名称)。假设你想要发送,你可以看到所有正在播放的标题here。再一次,你不需要所有这些。

回答你的问题:要从你的C ++代码中集成NSB,你可以将这个C#代码翻译成C ++,这就是你所需要的:

public static void SendMessage(string queuePath, string messageBody, List<HeaderInfo> headers)
{
    using (var scope = new TransactionScope())
    {
        using (var queue = new MessageQueue(queuePath))
        using (Message message = new Message())
        {
            message.BodyStream = new MemoryStream(Encoding.UTF8.GetBytes(messageBody));
            message.Extension = CreateHeaders(headers);
            queue.Send(message, MessageQueueTransactionType.Automatic);
        }
        scope.Complete();
    }
}

public static byte[] CreateHeaders(List<HeaderInfo> headerInfos)
{
    XmlSerializer serializer = new XmlSerializer(typeof(List<HeaderInfo>));
    using (var stream = new MemoryStream())
    {
        serializer.Serialize(stream, headerInfos);
        return stream.ToArray();
    }
}

public class HeaderInfo
{
    public string Key { get; set; }
    public string Value { get; set; }
}

注意事项:

  • MSMQ适用于TransactionScope。根据您使用的设备,我不会在IoT上考虑这个选项。
  • 您仍需要一个库将消息发送到MSMQ。

如果你选择了SQL传输,那么它就更容易实现这种集成,因为你所要做的就是在db中编写一条记录(你也可以找到{{3的脚本) }})。

答案 1 :(得分:0)

没有人会保证传输消息格式。我建议你远离排队消息的想法,并期望NServiceBus直接使用它们。

相反,让来自设备的消息被破坏者接收,这将根据需要将它们重新发送到NServiceBus。因此,设备通常发出优化的消息,例如,适合可能的最小数量的TCP帧。 NServiceBus不关心这个。使用Json和XML序列化程序检查传输消息 - 它们非常庞大。

我使用AQMP在我的事件中心和设备之间进行消息交换。然后,在事件中心,我可以做我想要的,包括使用NServiceBus。考虑一下业界对设备的建议。 AQMP可能就是你想要的。

答案 2 :(得分:0)

阿列克谢, 不建议您为每条消息添加另一个跃点。如果是这种情况,为什么不只是从IoT设备到云进行HTTP调用。 HTTP处理程序将使用NServiceBus客户端库将其放入队列中。通过使用HTTP处理程序,我将有一个更好的选择来在将来更改内部实现(因此是队列)。