Erlang中我使用了supervisor,但是我想在重启时,恢复工作进程的数据,但是不使用io

发布于 2014/10/09 11:12
阅读 956
收藏 1
Erlang中我使用了supervisor,但是我想在重启时,恢复工作进程的数据,但是不使用io操作,有什么办法可以直接将数据放在内存中,而且下次还能正确读取
加载中
0
摩云飞
摩云飞
你可以这么考虑这个问题:你想要恢复进程的数据,但是这个进程会在异常时被其 supervisor 重启,所以,用于保存该进程数据的东东一定不能创建于该进程内部(此处仅考虑将数据保存在内存中的情况),否则该进程重启后,保存在内存中的数据一样会丢失。那么一种可行的方案就是,在 supervisor 进程中创建一个 ets 表用于保存数据,这样的话,即使挂在在 supervisor 下的工作进程发生了异常,保存在 ets 表中的数据依然不会丢失。ets 表中的数据仅会在 supervisor 本身异常时才会一起丢失,但是一般情况下,supervisor 是不会一样的。
0
鹰

引用来自“摩云飞”的评论

你可以这么考虑这个问题:你想要恢复进程的数据,但是这个进程会在异常时被其 supervisor 重启,所以,用于保存该进程数据的东东一定不能创建于该进程内部(此处仅考虑将数据保存在内存中的情况),否则该进程重启后,保存在内存中的数据一样会丢失。那么一种可行的方案就是,在 supervisor 进程中创建一个 ets 表用于保存数据,这样的话,即使挂在在 supervisor 下的工作进程发生了异常,保存在 ets 表中的数据依然不会丢失。ets 表中的数据仅会在 supervisor 本身异常时才会一起丢失,但是一般情况下,supervisor 是不会一样的。

嗯。之前我是这样想过的,但是基于安全考虑的话,我不想让ets变成public,这样的形式,最后我们是通过这样来解决的,一个supervisor,一个worker,一个workerMgr,这个workerMgr(gen_server)用来创建ets(private),并将heir设置为自己,在worker的init函数中,通过调用workerMgr的一个函数(call/cast),让workerMgr将ets的权限give_away,就将ets的拥有权交给了worker,这样worker就能操作了。当worker一旦崩溃,通过查ets的官方文档中的give_away函数,可以发现这样一句话:

即worker一旦崩溃,就会自动将ets的权限交还给workerMgr,这样就会达到保存数据的效果。因为workerMgr没有做任何特殊其它的操作,所以其崩溃的机率比较小,就可以达到恢复数据的效果。但是我的boss认为这个办法,不是最好的,我正在思考新的方法,如果你有好的方法,希望不吝赐教。我在github上找到了一个和这思想一样的demo:  https://github.com/DeadZen/etsgive,你可以看看。

0
摩云飞
摩云飞
恩…你说得方法很不错…值得借鉴…看来你 boss是高手啊…看来他还有其他高见我们不知道的…呵呵
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部