您的位置:首页 > 其它

一次血泪教训引发的构思

2011-10-02 17:19 239 查看
也就是在两个星期前,发生一次线上事故.为此,我们的团队为此付出惨重代价,持续加班3天2两夜,紧急从并不完整的日志中恢复数据,其实日志也就是一个一个的点,需要分析日志序列,把这些点连成操作过程真的是非常的痛苦.

事件平息之后,冥思苦想,认真思考,回想问题所在,有一些想法,顺着这个想法,我决定写一个开源插件,系统引入此插件之后,可以在系统运行之后通过外部注入式,执行代码,这样就可以随时额外附加代码控制整个系统.下面先说说事故,再说说我准备做的东西:

我们的系统是单服结构,数据通过队列和异步处理器,异步写回.系统运行时的数据直接取至内存.如果数据发生变化后,投递到到队列中.不让数据和数据库发生直接关系,保证数据操作的高效性,水平的数据操作压力,这样也是现在比较常用的一套平滑压力的方案,一切看上去都是那么不错,也得到了很多项目的验证.(请各位原谅,出于对知识产权的尊重,我不能过详细的描述项目结构,不过没有关系,这个并不是我这次写这些的主题,主题是由此引发的构思)

但是悲催的事情就发生在此,数据文件的头信息毁坏,数据不仅没有写进去,也没有读出来,因为数据来至内存,没有停服之前,一切看上去那么正常,除了后台不停的报错之外,其他运行一切正常.

就这样停服了,这时,缓存队列中还有很多的数据没有写回,原本固化的操作也也不能被清除,进入一轮死循环,写不进去也读不出来,这时,伴随停服流程,端口也关闭了,没有任何口可以将命令传送到服务器,服务器进入假死的死循环中.

因为java进程还存在,这时我想的第一个方法是,dump出内存,我企图从虚拟机的dump文件中抓取对象,然后写回,结果无果.构思也就从这里开始.

如果现在还有独立的口,他可以将我现在写的代码注入到系统中,立刻写一段代码,注入到系统中,让他帮我把那些在内存中的可爱数据强行写入到数据库中,这样数据不仅完整,而且正确可靠,但是我没有,所以现在我需要做一个这样东西,先画一下脑图吧!整理一下思绪,规整一下功能(图-1).



图-1
简单说一下这些部件:

1) 代码直接运行.包括直接上传已经写好的java代码或者直接编写java代码,然后服务器负责拼组代码,这两种其实没区别,主要的思想是使用JIT(JIT是just in time,即时编译技术).

2) 直接执行class.上传已经编译完成的class,减少编译错误.主要思想是依靠classloader的父委托机制将一个自己的classloader插入到系统中,用来加在class.

3) 一个微型的web服务器.主要用来为上面两种模式提供web的服务.

4) 一个简单认证机制.为来为web服务器提供安全保障.

希望这个简单的开源模块能为我以后的项目带来一些后勤保障,作为一道最后的屏障.

也希望其他同道中人能够依赖这个开源模块,避免一些事故发生.

这个是我一个初步的想法,欢迎大家拍砖和提建议.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: