1

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

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

我知道 NServiceBus 用它自己的对象包装它放入队列的消息。我的问题是,NServiceBus 是否可以在物联网环境中工作——设备将消息直接放入队列,中间没有适配器?还是让服务器端(工作人员)处理未使用 NServiceBus 对象包装的“常规”消息?

4

3 回答 3

1

如果您只是想向目的地发送消息或发布事件,您没有提到您的传输是什么?其中一些选择可能会改变这里的答案,但您应该了解它的要点。

可以通过将消息放入队列来直接与 NServiceBus 集成。如果您查看文档,您会看到每个传输下方都有“脚本”部分,它向您展示了如何将消息直接放入队列中。如果您想与 MSMQ 集成,您可以在此处找到文档页面。

NSB 消息带有Headers。标头中的大多数值都是可选的,并且它们带有合理的默认值,因此您真正需要的只是消息类型(消息有效负载的实际类型名称)。假设您要进行发送,您可以在此处查看所有正在使用的标头。同样,您不需要所有这些。

要回答您的问题:要从您的 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 一起使用。我不认为物联网是一种选择,具体取决于您使用的设备。
  • 您仍然需要一个库来将消息放入 MSMQ。

如果您选择了 SQL 传输,它会使这种集成变得更加容易,因为您所要做的就是在数据库中写入一条记录(您也可以在此处找到一个脚本)。

于 2015-08-30T23:56:55.077 回答
0

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

于 2015-08-30T14:06:09.700 回答
0

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

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

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

于 2015-08-30T12:08:38.973 回答