默认
发表评论 5
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
请教IM中netty+protobuf 如何更好地使用?
阅读(58548) | 评论(5 收藏 淘帖
在我们的IM中,使用netty+protobuf,客户端发送各种命令(部分参数相同,大部分参数不同)到服务端。
我们现在想要为每个命令写个proto文件,但是服务端在解码的时候就需要指定一个protoc生成的解码器,这样的话就服务端就会解码失败。
我现在想到的方法是再包装一层,消息发送的时候,是具体命令+protobuf二进制数据(参数),然后根据命令调用应用的解码器,取到最终参数

有什么其他的方法吗,或者不应该这么设计。。。

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:请教一个Android的图片压缩方案,用于我的IM中下一篇:如何保证IM实时消息的“时序性”与“一致性”?
推荐方案
评论 5
我认为在你的IM中使用“具体命令+protobuf二进制数据(参数)”这种方式不是最佳途径,这差不多就是一个命令对应一个.proto文件,后期要改一个命令则所有其它平台都要重新编译一下,这太难维护了。

建议正确地理解Protobuf,即Protobuf只是一种数据格式,它跟早期很多写IM的人用字符串加特殊符号拼装协议或者用byte数组拼装协议是一样的道理。即:用profobuf定义好一个全局协议格式,不同的命令只是其中的type字段值内容不一样而已。

如果你对协议的定义有疑问,你可以在论坛里找文章,比如这篇里的协议定义方式:http://www.52im.net/thread-298-1-1.html,可以给你带来灵感:
请教IM中netty+protobuf 如何更好地使用?_102453fc8yazukmgpgpg8g.png

还有这一篇也可以看看《理论联系实际:一套典型的IM通信协议设计详解》:http://www.52im.net/thread-283-1-1.html
以前没有接触过im开发是吧
签名: 国庆长假还没有缓过来,请让我静一静,产品狗死远点...
引用:JackJiang 发表于 2017-02-09 11:00
我认为在你的IM中使用“具体命令+protobuf二进制数据(参数)”这种方式不是最佳途径,这差不多就是一个命令 ...

body-data里面是json类型的参数吗
我之前使用的是version + type+ body-length + body(json参数) 简单方式编码,后来项目组有人说这样设计没有用到protobuf的编码压缩,于是我就改为了下面这种方式
message LGN {
    optional string username = 1;
}
message GET{
}
message Command{
    optional LGN lgn = 1;
    optional GET get = 2;
}
message Message {
    optional int32 version = 1;
    optional string type = 2;
    optional Command = 3;
}
这样的话,解码会快点,但也是不好维护
最后,protobuf对string类型是没有压缩的吧?IM通讯里面是否要压缩,如果要压缩的话,是要另外采用其他方式?
引用:xxm 发表于 2017-02-13 10:51
body-data里面是json类型的参数吗
我之前使用的是version + type+ body-length + body(json参数) 简单 ...

你项目组的人说的是对的,要让protobuf能极致压缩的话,确实是要针对每一个协议来按照pb能最大化压缩来确定每一个字段的类型的,就是将就它,但显然维护就麻烦了。

所以通常情况下,都是在im真正稳定前,别整什么pb,等协议全部定下来后,再改成pb就不麻烦了,必竟产品稳定后,不可能没事老动协议。
引用:JackJiang 发表于 2017-02-13 11:17
你项目组的人说的是对的,要让protobuf能极致压缩的话,确实是要针对每一个协议来按照pb能最大化压缩来确 ...

ok! 多谢你的回答
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部