状态存取模块下全局读取和写入,偶尔数据丢失,如何排查原因和解决?

使用问题 · 375 次浏览
craming 创建于 2023-06-04 09:37

目前遇到的问题是:偶尔,在‘状态存取’模块下,读取全局状态后发现目标数据为空值(应当不是空值才对)。所以,应当是数据因为某个原因丢失了。

具体背景是:

1、目前,有一个公共子程序A,A里头有个词典,这个词典需要以状态保存。目前设置的是,每次运行A的时候,先进行读取全局状态,然后使用和修改,然后写入全部状态。

2、关于‘偶尔’——电脑里大概连续运行了1000次左右的读取全局状态+写入全局状态,过程中没有问题。然后突然出现一次丢失。

 

自己的怀疑:
1、会不会是群晖的存在导致了丢失。可能性不大,因为群晖没有做对C盘内文件的同步任务。

2、两个实例同时调用了这个公共子程序,恰好同时做了‘写入’,冲突导致丢失?

 

现在,

一方面,想要问如何排查丢失的原因?

一方面,想要问是否有其他更稳定的渠道来替代这个全局读写?


回复内容
CL 2023-06-04 10:19
#1

1)先确认一下状态数据是否存在,以判断是数据不存在还是读取过程中遇到了问题。states目录中,state_global_shared_states.json 全局状态保存在这个文件里。

2)同时存取全局状态可能会产生冲突。

craming 回复 CL 2023-06-04 10:33 :

1)state_global_shared_states.json,这个文件,此刻是在的。里头的数据,只有我今天上午发了这个帖子之后测试状态存取的时候写入的一条数据而已。

这是不是意味着出现这个帖子提到的问题的当时,state_global_shared_states.json可能不存在?
2)如果,我把全局写入改为普通的写入(仍然在公共子程序内),是不是仍然可能产生冲突?有没有什么办法避免或解决这种冲突呢?

craming 回复 CL 2023-06-04 10:51 :

要不,我这么的:

1、一天一次,把本地的全局写入的状态,备份一份到“云状态存取”。

2、如果发现本地的全局写入的状态数据丢失了,就从云端下载一份回来。

CL 回复 craming 2023-06-04 10:54 :

文件应该是一直存在的,所有的全局状态都是存在这个文件里。

或者也可以考虑直接用普通文件读取写入来保存自定义数据而不是依赖这个全局状态。

craming 2023-06-04 19:05
#2
回复 CL :

文件应该是一直存在的,所有的全局状态都是存在这个文件里。

或者也可以考虑直接用普通文件读取写入来保存自定义数据而不是依赖这个全局状态。

没问题了,谢谢。最后用了普通文件读取来替代

回复主贴