erlang节点挂掉避免玩家数据回滚

本文介绍了如何在Erlang系统中处理db节点故障,以避免玩家数据回滚。当db节点挂掉或断网时,通过异常捕获、文件备份和节点监控确保数据安全。在异常发生时,程序会将未成功写入数据库的玩家数据记录到文件,并在节点恢复后写入数据库,从而避免数据丢失。同时,系统会限制新玩家登录并通知在线玩家保存数据,确保服务平稳过渡。

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

前一段时间做的一个小模块,做的节点监控,处理一些异常情况,比如db节点挂掉,或者db节点所在主机出现断网情况。

我们服务器数据库节点和其他的节点并没有放到一台机器上,如果db节点挂掉或者db节点所在机器断网,玩家数据会出现异常,因为玩家的数据存贮到ets中,每隔几分钟写入数据库的,出现上述情况之后玩家照样可以玩游戏,获得物品,但是写库操作会失败。之前游戏中对并没对这种情况做一些相应处理,db挂掉或者db节点断网玩家可以继续玩游戏,直到玩家操作会直接读写数据库,出现异常然后玩家掉线。但是从db挂或者断网之后玩家得到的物品经验都会无效,因为ets中的玩家数据并没有写入数据库,玩家数据要回滚。

  为了避免玩家数据回滚,在程序中加了一些捕获异常的操作。首先做数据库写入、删除异常捕获,如果数据库写入失败,返回{badrpc,nodedown}则将写库操作的函数,以及传递的参数写入文件,注意出现异常后会有大量玩家写库失败然后写入文件,我们要做好数据同步处理,其实很简单,写文件操作由一个进程来做即可。其次做节点监控,如果db挂掉会马上收到nodedown消息,如果出现db所在机器断网会在大约30s之内收到nodedown消息(断网情况下,收到nodedown消息之前很可能写文件操作已经进行了30s)server_manger节点做节点监控,server_manger得知db节点出现问题后,关闭gate,也就是使玩家不能再继续登录,给在线玩家发送一个db_nodedown消息,改消息发送到了玩家进程,玩家进程受到该消息之后,将ets中的数据马上进行一次写库操作,其实就是写入文件(前边说了,不是玩家进程写文件,而是玩家进程给该节点一个公

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值