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

NServiceBus&;IoT-将来自客户端的消息直接放入队列中,并在服务器端使用NServiceBus进行处理,nservicebus,nservicebus5,Nservicebus,Nservicebus5,Out后端是使用NServiceBus(版本5)在.NET中编写的。直到现在,我们的客户(无论是.NET客户端还是C++客户端)都向具有NService总线的WCF服务发送消息,WCF服务将NService总线消息发送给正确的工作人员。 现在,我们正在对我们的体系结构进行一些更改,希望一些客户端将消息直接放入队列并跳过WCF。我们有很多设备(大多数是用c++编写的) 我知道NServiceBus用它自己的对象包装它放入队列中的消息。我的问题是,NoSeriBUS是否有任何在IOT环境中工作的方法

Out后端是使用NServiceBus(版本5)在.NET中编写的。直到现在,我们的客户(无论是.NET客户端还是C++客户端)都向具有NService总线的WCF服务发送消息,WCF服务将NService总线消息发送给正确的工作人员。 现在,我们正在对我们的体系结构进行一些更改,希望一些客户端将消息直接放入队列并跳过WCF。我们有很多设备(大多数是用c++编写的)


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

没有人会保证传输消息的格式。我建议您不要将消息排队,而是希望NServiceBus直接使用它们

取而代之的是,将来自设备的消息发送给断开的服务器,断开的服务器将根据需要重新发送给NServiceBus。因此,设备通常会发出优化的消息,例如,适合尽可能少的TCP帧。NServiceBus对此并不关心。使用Json和XML序列化程序检查传输消息-它们非常庞大

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

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

如果您只是尝试向目标发送消息或发布事件,您没有提到您的传输方式?其中一些选择可能会改变这里的答案,但你应该了解其中的要点

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

美国国家安全局的消息随附。报头中的大多数值都是可选的,它们带有合理的默认值,因此您真正需要的是消息类型(消息负载的实际类型名称)。假设你想发送,你可以看到所有的标题。再说一次,你不需要所有这些

回答你的问题:从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; }
}
publicstaticvoidsendmessage(字符串queuePath、字符串messageBody、列表头)
{
使用(var scope=new TransactionScope())
{
使用(var queue=newmessagequeue(queuePath))
使用(Message=new Message())
{
message.BodyStream=newmemoryStream(Encoding.UTF8.GetBytes(messageBody));
message.Extension=CreateHeaders(headers);
Send(message,MessageQueueTransactionType.Automatic);
}
scope.Complete();
}
}
公共静态字节[]CreateHeaders(列表标题)
{
XmlSerializer serializer=新的XmlSerializer(typeof(List));
使用(var stream=new MemoryStream())
{
序列化器。序列化(流,headerInfos);
返回流ToArray();
}
}
公营班主任信息
{
公共字符串密钥{get;set;}
公共字符串值{get;set;}
}
注意事项:

  • MSMQ与TransactionScope配合使用。我不认为物联网是一个取决于你使用的设备的选项
  • 您仍然需要一个库来将消息放入MSMQ

如果您选择了SQL传输,则会使此集成更容易,因为您所要做的就是在db中写入一条记录(您也可以找到用于此记录的脚本)。

您使用的是什么传输?@Simon我们现在正在重新设计我们的体系结构。目前是msmq,但我们正在转向RabbitMQ或Azure ServiceBus。确实如此,但每个真正使用设备的人都会告诉你,当你每秒有数百万条消息时,你无法承受消息中有数千字节的垃圾,XML开销被认为是不必要的垃圾。可靠地整合消息并将其传送到处理引擎是一项单独的任务。例如,这就是Azure EventHub的用途。