JSON或协议缓冲区来replace自定义TCP消息

本来,我们有两个应用程序与TCP / IP通信,并且它们都是由C ++实现的。 它们之间的消息是自定义消息types。

在这里输入图像说明

现在,客户端程序将被改变为基于nodejs web应用程序,并且它们之间的通信将被改变为消息总线,比如rabbitmq

在这里输入图像说明

所以它们之间的消息types应该改变。

我首先想到了JSON ,但是自定义消息太复杂了,它们是由templateinheritance来定义的。 看起来,将自定义消息转换为JSON不是一个好的select。 我对吗?

 class Address { int network; int addressType; //... }; class MsgType{ unsigned char msgSeq; unsigned int msgLen; //... }; class Message{ Address destination; Address source; MsgType msgType; //... }; template <typename T, int RESPONSE_TYPE> class ResponseMessage : public Message{ //... } typedef struct{ int number; int type; }ConfigResp; class CfgResp : public ResponseMessage<ConfigResp, CONFIG_REQUEST> { //... } 

Protocol Buffers是我的另一个select。 我该怎么办? 重新定义自定义消息到协议缓冲区? 不,不

这里是我的解决scheme:只需将整个原始自定义消息(二进制types)封装到协议缓冲区中作为服务器端的一条消息,然后解码客户端的自定义消息(二进制types)。 那可能吗?

看起来你正在构build你的应用程序变得更具可扩展性。 不使用一个不错的消息格式是完全相反的目标。

不要将二进制格式embedded到协议缓冲区块中。 你什么也得不到 – 你需要为每个想要使用消息总线的组件重写parsing和编写代码。 这浪费了时间和精力。

将C ++结构映射到JSON或协议缓冲区是很痛苦的。 但是,它会使用node.js或其他东西偷看到消息总线中更容易的钩住这些消息。

就个人而言,我会使用协议缓冲区 – 因为他们更安全。 JSON库中的各种types的处理之间存在差异,因为JSON格式(故意)是松散的。 特别是我发现处理长整数有问题。

通常我会为每个需要转换的类编写一个辅助模板结构,然后转换成许多样板文件。 就像是

 template<typename T> class ProtocolBufferHelper { } template<> class ProtocolBufferHelper<Address> { typedef address_buffer protocol_buffer_type; void writeToProtocolBuffer( const Address &a, address_buffer & buffer) { buffer.setNetwork(a.network); ... } ... } template<> class ProtocolBufferHelper<Message> { void writeToProtocolBuffer( const Message &m, address_buffer & buffer) { ::writeToProtocolBuffer(buffer.getDestination(), m.destination); ::writeToProtocolBuffer(buffer.getSource(), m.source); ... } } template<typename T> void writeToProtocolBuffer( const T &value, ProtocolBufferHelper<T>::protocol_buffer_type & buffer ) { ProtocolBufferHelper<T>::writeToProtocolBuffer(value, buffer); } 

你将不得不原谅我不记得在C ++中的协议缓冲区语法是什么(它已经有一段时间了…)。 但希望它足以让你开始。