协议过程最好设计为请求响应、无状态式,类http,这样通讯模块设计起来简单,至于senssion的管理可以交给上层应用。
消息格式的设计比较繁琐。
线程间通讯
可以直接传C结构指针,这是最高效的方案,不存在消息的复制,传输消耗。难点在于消息的同步和内存的管理。
可以利用pipe
函数,做管道。消息序列化后在管道上传输。管道将消息串行化,这样大大减轻了消息同步和内存管理的复杂度,
项目较小时,我会采用前一种方案,项目较大后一种方案较为简单。
进程间通讯
进程间通讯其实可以分为本机进程间通讯,同构计算机进程间通讯,异构计算机进程间通讯。这里我们按照异构计算机进程间通讯设计。通讯方案采用socket机制。摒弃linux提供的共享内存,消息队列等机制。
1、既然设计为进程间通讯了,你很难保证,不发生程序的迁移,共享内存和消息队列机制,只适合本机通讯使用。
2、socket机制足够高效,往往不是项目的瓶颈。
消息的序列化
消息的序列化有很多方案,protocolbuffer,bison等方案比较高效,当然你也可以用json。json的可读性更高。
如果没有足够的证据证明你需要更高效的消息序列化方案,json往往是最好的选择。
综上
进程间通讯,rpc调用,socket、json方案往往是最好的选择。
例外
如果是做嵌入式,通常需要面临几个难题
1、单片机cpu性能薄弱,即便是json解析都无法完成
2、通讯媒介往往是串口,i2c等,传输速度慢,且链路无法保证消息能够准确,完整的送到对端。
问题1往往不是问题,cpu性能弱,需要处理的事情也少,通讯协议按照字节流设计即可。文档的维护也可以交给单片机开发人员来做。
问题2在历史上早被解决掉了,ppp协议往往是最好的解决方案。
再综上
协议设计往往有最佳实践,我们只要采用最佳实践即可。