博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记录一个protobuf枚举类型引发问题的分析和思考
阅读量:6373 次
发布时间:2019-06-23

本文共 970 字,大约阅读时间需要 3 分钟。

背景:

  项目使用protobuf作为socket传输数据的序列化协议 数据对象的定义时 使用了很多枚举类型

人物:

  这部分代码经手应该超过3位以上程序员

起因:

  为了丰富聊天内容形态 增加了新的消息类型(嫌原单图展示死板 增加了多图合并展示的消息类型)

经过:

  正常的开发、提测, dang!!发现老版本在进入聊天界面时会必先崩溃 排查发现原因

  protobuf 对象生成的java对应的代码中 旧版本不认识新版本数据 导致枚举类型的值为 UNRECOGNIZED(-1)

  旧代码中通过getNumber()获取对应值的时候直接抛出异常(方法定义中并没有声明) IllegalArgumentException("Can't get the number of an unknown enum value.");

结果:

  很明显 旧版本不能兼容新加的类型

 

解决:

  其实很多方法可以解决这个问题

  其中比较理想的是

    如果项目之前引入热修复的话 这里打个补丁 改一下代码(可惜没如果)

    服务器端增加客户端版本判定 将新类型转成旧类型处理 不过 如果处理不当可能造成丢图(没办法对我们来说这是最好的结果了)

  还有相对不理想的

    比如先给旧版本来一个小升级 解决这个问题(要等用户大量升级小版本之后才能上最新版本 周期比较长)

    旧版本强制升级(会造成一定量的用户流失)

思考:

  其实这个问题很好排查也很好解决 但是却能留给我一些思考 

  1 如果protobuf生成的代码 能将抛出的异常写在方法声明里 其实就可以提醒调用者注意这个部分的问题

  2 如果当初写这个对象转换逻辑的人 在获取枚举对应值的时候发现生成代码的问题 使用get*Value()而不是get*().getNumber()

  3 早点引入热修复也是 

  4 如果项目组定期组织代码review 也许也能发现问题

记:

即便是大公司 较成熟的协议 使用起来也可能存在隐患

掉过越多坑的程序员 越有价值

早为未来做打算

闲暇时间多翻翻之前的(无论是谁写的)代码 即便是互相挑刺 对项目来讲 是好事情

转载于:https://www.cnblogs.com/waterbear/p/10740630.html

你可能感兴趣的文章
基于同IP不同端口,同端口不同Ip的虚拟主机 基于FQDN的虚拟主机
查看>>
项目软件集成三方模块,编译中int32和uint32定义冲突解决方法
查看>>
StretchDIBits速度测试(HALFTONE)
查看>>
在.NET Workflo“.NET研究”w 3.5中使用多线程提高工作流性能
查看>>
验证Oracle处理速度
查看>>
自己写一个jquery
查看>>
艾伟:C#中抽象类和接口的区别
查看>>
Flink - NetworkEnvironment
查看>>
BZOJ4374 : Little Elephant and Boxes
查看>>
【.Net Framework 体积大?】不安装.net framework 也能运行!?开篇叙述-1
查看>>
Python import其他文件夹的文件
查看>>
Jvm(22),回收策略-----标记清除算法
查看>>
MySQL多表关联查询效率高点还是多次单表查询效率高,为什么?
查看>>
UNIX 高手的 10 个习惯
查看>>
传值与传引用
查看>>
HDU 1538 A Puzzle for Pirates(海盗分金问题)
查看>>
C# Web Forms - Using jQuery FullCalendar
查看>>
Sublime-Text-2-pydocstring --- 自动生成python docstring的插件
查看>>
UNIX进程环境
查看>>
我最喜欢的jQuery插件模板
查看>>