跳到主要内容

3 篇博文 含有标签「Java」

查看所有标签

· 阅读需 5 分钟

最近有用户反馈,他的项目中同时使用了HBase和一个RPC框架,HBase依赖2.5.0的protobuf,RPC框架依赖3.7的protobuf,导致他的项目编译都失败。0.98版本的HBase还是使用的原生的protobuf-java依赖,2.0版本才使用了shaded形式的protobuf,所以我们决定自己提供以shaded形式引入protobuf的HBase Client。

相信这个问题不只是出现在HBase中,或者出现在与protobuf相关的项目中,其实当我们项目间接依赖了像protobuf、netty等大版本之间互不兼容的框架,甚至guava这种某些接口不兼容的框架,都有可能出现类似的问题。这里也是提供一个可以参考的解决方法。

方法上,参考了HBase 2.0之后对第三方依赖的处理,简单来说就是将常用第三方依赖的代码负责一份,修改所有类的package,发布一个自己的artifact到仓库中。这样肯定就不会再依赖冲突了。

而protobuf的依赖处理起来则比较麻烦一点,除了修改原生protobuf类的package之外,还需要处理proto生成的Java文件。所以本文就以protobuf为例,提供第三方依赖冲突的解决方案。因为都是使用Maven插件实现,所以也只对Maven项目有用,相信其他项目也有类似的解决办法。

本文相关代码都已放在Github

· 阅读需 5 分钟

最近的工作内容就是写一个 DualHBaseClient,在查询数据时间过长时,能够将同样的请求发给 replication 的集群,缩小 client 端的 p99、p999 延迟,减小毛刺。 实际开发最初的一版代码都没有花费1pd,性能测试倒测了好几天都不及预期,甚至优化之后各方面性能更差劲。

本文就是记录下导致此次性能问题的主要原因:CompletableFuture.

使用 Java 异步编程的时候,CompletableFuture 用起来还是相当舒服的,在HBase的异步API里,也大量的使用了CompletableFuture,如果 CompletableFuture 有性能问题,那可就悲催了。