在集群环境下,偶尔数据无法取出的问题解决

最近在用户使用系统时,出现偶尔数据无法取出,但有时又正常的奇怪现象。刚开始以为是用户操作是session超时等问题,后来排查代码一直也没有发现问题。就搁置没有处理。

今天在部署新系统时,采用灰度发布的形式。在上线部分机器后查看日志,发现了一些空指针异常。看异常抛出的位置,感觉跟前段时间的问题应该相关。

在排查过后,发现偶尔系统复发取出是因为:代码中使用了一个内存对象作为缓存。缓存生成、使用的过程如下图:

%e7%bb%98%e5%9b%be1

页面1在取出数据后,在内存中会保留该数据。之后页面2直接使用内存数据。

这个结构在单机时没有任何问题。但是在机群系统中,页面1读取后将数据保留在A机器的内存中,但是请求页面2时,如果被路由转发到B机器时,会引起空指针异常。

知道问题的原因之后,遍很好解决了。页面2取出数据时直接访问数据,而不是从内存中读取就可以了。如果需要做缓存,可以丢入redis等缓存中即可。

《在集群环境下,偶尔数据无法取出的问题解决》上有3条评论

    1. 这个内存缓存是自己实现的一个线程安全的对象,通过map存储key-value形式的数据。可以设置缓存容量的上线、达到上限后有自动淘汰机制,以保证不会出现OutOfMemory等问题。通过spring创建单例对象,在系统中进行使用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注