使用NServiceBus(版本5)在.NET中编写后端。到目前为止,我们的客户端(.NET客户端和c ++客户端)都在向具有NServiceBus的WCF服务发送消息,而WCF服务将NServiceBus消息发送给正确的工作者。
现在我们正在对我们的架构进行一些更改,并希望一些客户端将消息直接放入队列并跳过WCF。我们有很多设备(大多数是用c ++编写的)。
我知道NServiceBus用它自己的对象包装它放入队列的消息。我的问题是NServiceBus是否有办法在IoT环境中工作 - 设备将消息直接放入队列,而中间没有适配器?或者服务器端(工作者)处理未使用NServiceBus对象包装的“常规”消息?
答案 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; }
}
注意事项:
如果你选择了SQL传输,那么它就更容易实现这种集成,因为你所要做的就是在db中编写一条记录(你也可以找到{{3的脚本) }})。
答案 1 :(得分:0)
没有人会保证传输消息格式。我建议你远离排队消息的想法,并期望NServiceBus直接使用它们。
相反,让来自设备的消息被破坏者接收,这将根据需要将它们重新发送到NServiceBus。因此,设备通常发出优化的消息,例如,适合可能的最小数量的TCP帧。 NServiceBus不关心这个。使用Json和XML序列化程序检查传输消息 - 它们非常庞大。
我使用AQMP在我的事件中心和设备之间进行消息交换。然后,在事件中心,我可以做我想要的,包括使用NServiceBus。考虑一下业界对设备的建议。 AQMP可能就是你想要的。
答案 2 :(得分:0)
阿列克谢, 不建议您为每条消息添加另一个跃点。如果是这种情况,为什么不只是从IoT设备到云进行HTTP调用。 HTTP处理程序将使用NServiceBus客户端库将其放入队列中。通过使用HTTP处理程序,我将有一个更好的选择来在将来更改内部实现(因此是队列)。