美文网首页
序列化引发的问题

序列化引发的问题

作者: lionel880 | 来源:发表于2018-12-24 16:29 被阅读0次

使用公司RPC中间件,发现一个问题,最终定位到序列化问题,进行记录

1.起因

  • 公司内部RPC框架,服务端报错,但客户端却不会立刻报错,而是等到Timeout后,报超时错误。

组内使用内部RPC框架暴露多个服务,其他服务在Provider报错后,Consumer可以立刻响应错误,但唯独使用ElasticSearch的服务不行,怀疑方向为ES自定义的Exception与内部中间件不匹配

在中间件团队的支持下,定位到Netty,isSent为flase,没有发送成功,报错信息为序列化失败。
具体内容为 suppressed Exception (org.elasticsearch.client.Response 不支持序列化)

2.相关联知识点

  • Java的序列化
    Java序列化对象要实现Serializable接口
    1.属性为基本类型,默认支持序列化
    2.属性为引用对象,则引用对象也要支持序列化

  • Suppressed Exception
    这个是Java 1.7引用的异常,常伴随着 try with resource语法使用
    try with resource

public static void main(String[] args) {
    try (FileInputStream inputStream = new FileInputStream(new File("test"))) {
        System.out.println(inputStream.read());
    } catch (IOException e) {
        throw new RuntimeException(e.getMessage(), e);
    }
}

try-with-resource并不是JVM虚拟机的新增功能,只是JDK实现了一个语法糖。当你将上面代码反编译后会发现,其实对JVM虚拟机而言,它看到的依然是之前的写法:

public static void main(String[] args) {
    try {
        FileInputStream inputStream = new FileInputStream(new File("test"));
        Throwable var2 = null;

        try {
            System.out.println(inputStream.read());
        } catch (Throwable var12) {
            var2 = var12;
            throw var12;
        } finally {
            if (inputStream != null) {
                if (var2 != null) {
                    try {
                        inputStream.close();
                    } catch (Throwable var11) {
                        var2.addSuppressed(var11);
                    }
                } else {
                    inputStream.close();
                }
            }

        }

    } catch (IOException var14) {
        throw new RuntimeException(var14.getMessage(), var14);
    }
}

Java最终只能抛出一个Exception,但如果try中爆出了错误1,在finally中报错了错误2,这怎么办,在jdk 1.7以前,你只能通过代码自己解决包装。但jdk1.7以后,提供了addSuppressed方法,可以让你将其他错误,放在一个Exception里进行抛出。

问题最终解释

暴露的服务A使用ES服务,ES服务报错,最终报错 ElasticsearchStatusException 支持序列化 ,但是内部的addSuppressed添加的org.elasticsearch.client.Response 不支持序列化,由于公司内部的RPC框架会对整个对象进行序列化,导致Netty发送失败

解决方案

自己在此服务处,catch Exception进行包装后抛出

相关文章

  • 序列化引发的问题

    使用公司RPC中间件,发现一个问题,最终定位到序列化问题,进行记录 1.起因 公司内部RPC框架,服务端报错,但客...

  • com.esotericsoftware.kryo.kryoex

    这次不扯蛋,直接开讲。 该问题的本质是序列化问题!!!序列化问题!!!序列化问题!!! 重要问题说三遍。 把对象转...

  • Java序列化心得(二):自定义序列化

    正如前文《Java序列化心得(一):序列化设计和默认序列化格式的问题》中所提到的,默认序列化方法存在各种各样的问题...

  • jackson源码分析

    背景:之前碰到序列化的问题,spring默认序列化又是jackson序列化,然后近来又爆出fastjson序列化的...

  • 【Flink 精选】常见的性能问题及其定位思路

    常见的性能问题及其定位思路 1.常见的性能问题 (1)JSON序列化和反序列化 source的序列化,sink的反...

  • Java序列化与反序列化

    问题 Java序列化与反序列化是什么?为什么需要序列化与反序列化?有什么好处?如何实现Java序列化与反序列化? ...

  • Protostuff序列化和反序列化

    Java序列化和反序列化 序列化和反序列化是在应对网络编程最常遇到的问题之一。序列化就是将Java Object转...

  • netty使用Google Protobuf协议优化通道的序列化

    一、Google Protobuf 协议 解决序列化和检索效率的问题。 序列化的方法有: 使用java原生的序列化...

  • 序列化引发的血案

    问题背景 早上来上班,突然值班群里有人报问题,说店铺属性在JD App前端显示错乱了。打开App,点开一个店铺查看...

  • Protostuff序列化和反序列化

    序列化和反序列化是在应对网络编程最常遇到的问题之一。序列化就是将Java Object转成byte[];反序列化就...

网友评论

      本文标题:序列化引发的问题

      本文链接:https://www.haomeiwen.com/subject/xruzkqtx.html