您的位置:首页 > 其它

TroubleShooting - 迁移到集群环境数据错乱问题

2015-05-16 17:40 232 查看
最近系统出了个问题,发现系统发布出去的某一条链式结构的数据出现断链的问题,调查发现这是在单系统迁移到集群环境中没有考虑清楚导致多个节点同时修改数据而出现的错误,这里介绍下问题的来龙去脉。

我们的系统持续接受外部系统提供的产品的信息(每次一个产品),对产品信息进行加工,把加工后的产品数据按产品类型加入内存数组,每次有新产品加入数组,就需要把数组数据打包成链式结构(外部数据结构要求),然后发给其他外部系统。单节点的时候对数组的产品添加,以及整个链式数据发送在同个类中使用了synchronized,所以产品都是先添加进数组,然后再组装成链式结构发送出去,在发送过程中也不会出现数组数据被修改的可能性,系统工作正常。在搬到集群环境中后由于多个节点都可以接受产品信息,所以数组被存在了distributedmap里面,但是数组数据没有使用distributed lock来保证组装链式数据的时候数组数据不被修改,链式数据可能会出现nextlink不存在,但是数据却真实存在。

这个问题的源头是要解决多节点同时修改数据的问题,可以通过使用distribution lock来解决。

不过发现更坑爹的问题,因为每次有新产品加入数组,都会触发一次同类型产品的链表结构的组装和发送,如果网络有问题,可能会出现后发出链式数据先到下个节点。单节点的时候由于链式数据中存有创建时间戳,所以下个节点不会出现后创建的链式数据被覆盖的现象。不过对于集群环境,链式数据的时间戳不再是顺序的,当短时间很多个产品进入系统的时候,就可能发生数据多的链式数据的创建时间戳更早同时更早到达下个节点,结果就悲催的被覆盖了。

为了解决这个问题,最好的办法就把发送任务做成集群里的单节点任务 (可以参考clustertimer规范的实现),其他节点只更新distributedmap中的内存数组。同时为了防止链式数据发送过于频繁,把收到产品就发送链式数据改成每分钟检测一次是否有缓存的新产品,有才创建链式数据发送到下一个节点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: