dangdangdotcom / dubbox

Dubbox now means Dubbo eXtensions, and it adds features like RESTful remoting, Kyro/FST serialization, etc to the Dubbo service framework.
http://dangdangdotcom.github.io/dubbox
Apache License 2.0
4.89k stars 2.06k forks source link

kyro 反序列化问题 #142

Open skysoul1985 opened 8 years ago

skysoul1985 commented 8 years ago

Caused by: com.esotericsoftware.kryo.KryoException: Unable to find class: x13b4c1339765d6e5

发布的一个接口服务,在消费方调用的时候,出现如上问题kyro反序列化失败(但有的时候接口调用又正常,但是将消费端服务重启后,就出现此问题)

尝试过清空zookeeper的dubbo注册信息,第一次ok,但是重启消费端后,在继续的时候又出现问题;也尝试过在register增加file配置(以为是localcache的冲突问题,我的java应用都是在同一台机器上);如果都没最终解决问题! 还请高人帮忙指点指点!

skysoul1985 commented 8 years ago

找到原因了,dubbox中的kyro注册类型的顺序问题导致;kyro会为每个注册类进行数字编号,dubbox中缺省注册了一些类型(比如double[]类型的编号是54),如果用户自定义注册类型,默认会从55开始,即顺序编号; 我们项目出现这个问题的主要原因是:我们有两个独立应用都对外提供服务,但是应用通过kyro注册自定义bean是独立的,所以两个应用自定义bean排序都是从55开始;现在有第三个独立应用想调用前面的两个服务的api,因此需要把前面的两个应用的相关bean都注册进入kyro中,因为是顺序编号的,这就导致其中肯定有一个应用的bean的顺序和原有的应用是不一致的情况;

skysoul1985 commented 8 years ago

不知道谁有啥较好的解决方案?

dimmacro commented 8 years ago

@skysoul1985 估计初次使用dubbox的kryo序列化时都会遇到这个坑吧,当时我们也是如此,排查了半天,最后一步步调试才发现的,我这边的解决方案是这样的 ,从压测效果上看还是比hessian2的性能好的.你可以参考下

skysoul1985 commented 8 years ago

看了下你们的实现,这个是可以解决,但是不会使用到kryo的优化吧,应该会用到kyro的序列化,但是头部类型定义应该是将完整的包和类路径都打包在里面,如果register,则头部类型定义就是一个数字标号,减少整个序列化后的长度