基于dump的本地缓存上线问题记录

本文记录了一次线上部署过程中遇到的三个主要问题:MD5校验不通过、hessian版本不一致及nginx安全模块引发的hessian反序列化错误,并详细阐述了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体的代码在 

基于dump的本地缓存实现.

 

本来以为很简单的一次上线,没想到前后弄了差不多一个下午.最主要的问题有三个

 

问题一 MD5校验不通过

这个问题在daily完全没问题.但是到了线上就悲剧了..刚开始以为是不同机器上,计算md5值不一样造成的..后来我在不同机器算了几次,发现都是一样的...继续查,才发现是自己考虑不周..

这个问题,最初的错误在于

写道
客户端在dump数据流和对应的md5值的时候,发了两次http请求.

 

这本身没有什么问题,但是我在服务端缓存了一份计算好的MD5的值,然后每次客户端在dump数据流的时候,会重新更新这个MD5值..这看上去也没什么问题.但是

写道
线上的机器有多台,如果客户端在dump 数据流的时候,请求到了服务器A,而在请求对应md5值的时候,请求到了服务器B..那么,dump数据流顺带更新的是服务器A中缓存的MD5值,而在服务器B中的md5值是老的..这样的结果就是,md5值不匹配.

 这个属于典型的自己埋雷自己踩.解决方式也很简单

写道
解决方案很多,我觉得比较靠谱的有两种,一是缓存的md5值放在分布式缓存中,而不是本机缓存. 二就有点取巧了.在组建dump数据流的时候,在byte流最后放一段固定16进制字节码.就比如class文件的开头是CAFEBABE一样.客户端就截取这个字符串,然后做校验.

 

问题二  hessian版本不一致

这个问题其实在发布的时候并没有直接遇到.我是在遇到 问题三的时候,怀疑了导致问题三的原因是不是hessian版本不一致.之前我在服务端使用的hessian版本是最高的 hessian4.0.7版本.但是我在客户端查看的时候,发现很多其他的dependency依赖了hessian 3.0.13. .最后请教了一下同事,好像说这边hessian版本默认就是3.0.13.因为其他版本经常会有bug. 比如看毕玄的这篇文章 

http://www.blogjava.net/BlueDavy/archive/2009/08/06/290003.html

最后的解决方案就是,统一版本 hessian3.0.13

 

问题三 nginx 安全模块的一个坑

在线上,客户端启动初始化的时候,一直报 hessian反序列化出错.中间折腾很久,最后发现,线上的nginx安全模块为了防止utf7漏洞,自动在请求留中加了 \r\n .具体如下



 

哎,整一个悲剧..

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值