1 序
写这篇文章主要目的是总结经验,做了很多简省,把与该文章没有关系的东西删掉了,请大家谅解。本人是个初学者,有些问题的解决方法可能很笨,也有漏洞,请大家指正一下。
2 需求
我们做的是一个web应用,大家都知道一个web应用通常包含前台和后台。在我们的应用中,后台有一台服务器,且只部署一个实例,用于数据管理;前台有5台服务器,每台服务器上部署4个实例。对于初学者来说,可能不会遇到这样的部署情况,也就一个实例罢了,呵呵,慢慢来,大流量的web应用有很多讲究。像某部门的售票网站,就是没有处理好大流量的实例。在这方面,国内三座大山都做得不错了。
回归正题,下图是我们应用的大致框架图:
我们的需求是:
1. SVM模型的原始训练数据存储在数据库中
2. SVM训练过程在后台进行
3. 前台定时更新SVM模型数据
3 分析与设计
需求看上去比较简单,但是有一些需要注意的地方。
1. 后台训练数据会随时变更的,这里的变更可能是模型类别的改变(增加或减少),也可能是类别数据的改变(增加或减少)。
2. 后台改变了训练数据,需要尽快训练出模型,让前台更新,因此不是每次训练模型都进行特征计算,参数选择。可能直接使用默认的参数进行训练来减少训练时间。
3. 新模型数据如何保存,如何传给前台的每个实例。
4. 新模型数据如果有错,需要切换到一个默认的正常版本。
为了解决上述问题,我们试着采用的方案如下:
1. 每次训练数据改变后,执行一次模型训练程序,如果不采用默认参数训练,则往redis中设置一个值,模型训练程序每次都去redis中读取进行判断。当次训练结束后需从redis中清除这个值。
2. 模型训练完成后,把模型文件上传到文件系统,并在redis中设置版本号。
3. 前台每个实例启动时从默认的版本加载,我们的默认版本直接放在了war包里面。每隔1分钟去redis中获取版本号与当前版本号对比,进行更新。
4. 通过手动更新redis中版本号,如设为0,使每个实例重新加载默认版本。这里会有一个问题,设为0后,每隔一分钟又会重新加载,因此需要记录上一次是否成功加载过默认版本。如果是,就不用加载了。
4 遗留问题
如何验证前后台数据的一致性,毕竟是通过网络传输的。目前,我们并没有做验证。