分布式综合处理系统Pluto ================================
##Pluto简介##
- Pluto是一个分布式任务分发系统。自身包含一个高性能http静态服务器(但不完善,不支持高级功能),使用apache mina框架搭建,HTTP控制层使用类似spring MVC 的注解风格,支持任务实时日志及数据保存,支持数据恢复。
- 任务分发采用预先推送机制,最大利用客户端处理能力,支持远程关闭重启客户端。
##Pluto背景##
- Pluto之前,服务端处理所有的任务,后来因为需求的复杂度增加,加入了定时任务功能,为了与服务器隔离,单独部署了数据库任务处理程序,减轻了服务端工作压力。因服务端功能的增加,以及数据库经常迫于压力出现性能瓶颈,于是有了Pluto的开发计划,单独处理大量需要并行处理的任务或者批量的数据更新请求。
- 随着服务端计算越来越复杂,单机计算时间达到无法忍受地步,因此拓展pluto实现分布式计算,依靠集群计算力加速复杂数据计算、统计。
##初始化部分##
- Pluto 启动时,先启动log4j日志系统,然后初始化配置文件,并监视配置文件变更(一秒内检测一次配置文件是否变更,如果有变更,则执行相应的重载方法)。
- 之后是任务管理器初始化,处理数据预先格式化文件格式,启动任务变更日志模块,如果这一步失败,则直接退出。
- 然后是HTTP服务器初始化,扫描有注解的controller,绑定端口,如果这一步失败,也会退出。
- 之后检测是否有配置其他服务器,如果有,则以备份服务器身份连接到指定的服务器,实时接受数据备份。
- 最后是客户端通讯服务器初始化,设置通讯编码、协议,如果失败,会退出。最后会注册关闭线程钩子,在服务器关闭的时候解绑端口、保存数据、刷入缓存,必要的时候,通知客户端关闭。
##HTTP部分##
- http服务模块启动时会预先扫描所有初始化时指定的包,将其中包含特定注解的方法取出,并将url地址绑定到方法,url支持正则表达式和通配符,如果有重复的地址,会启动失败。
- 扫描完毕后会将包含绑定方法的类放入对象池初始化,以便稍后执行时使用。
- 当收到一个请求后,解析url,取出对应的方法,解析注解参数,并从请求上下文中取出对应的数据注入该方法。
- 所有的controller 都必须继承自BaseController,该父类提供上下文信息,处理请求初始化,以及其他辅助方法。目前已有的实现类有Admin和FileController以及用于AJAX请求的AJAXController。
- Admin类包含任务添加方法、停机方法以及服务器状态方法。主要定位于服务器管理界面,未来任务相关的会独立到任务类中。
- FileController类是静态服务器的核心部分,该方法解析url,将对应的资源返回给客户端。当请求一个文件时先判断该文件是否已经改变,如果没有改变则直接返回304状态,然后判断是否为一个新文件,如果是则载入内存,并创建一个文件监视任务,如果文件被变更,则重载入内存。目前该类仅包含两个方法,分别处理文本类型(html,js,css,)和图片类型资源(jpg,png,gif,swf)。
- AJAXController以Json方式返回其他方法的结果。
##数据管理部分##
- 数据管理器包含一个任务原子id生成器,为每个任务生成唯一的id,防止重复任务。每个任务状态变更时,将创建一个异步非重复日志、数据保存任务。关闭的时候将未处理完的任务保存至磁盘,初始化的时候会重新载入上一次未处理完的任务。
- 分布式计算任务不记录数据至文件、日志,仅仅在其生命周期中临时存储数据。
##客户端通讯服务部分##
- 客户端通讯服务模块负责与客户端的通讯、协调、任务分发、负载均衡。每隔一段时间,客户端会发送心跳包。当任务管理器收到新任务时,会直接通知服务模块,触发任务状态变更事件。
- 当客户端初次连接服务端时,依据客户端提交的状态数据判断客户端类型(执行端、提交端、备份端)。
- 客户端的状态变更也会触发任务状态变更事件,如断开、任务执行成功、任务执行失败、失去响应。
- 当任务状态变更事件被触发的时候,会检查所有的客户端,筛选出执行队列未达到限制并且上次任务分发时间最远的客户端,选择一个任务发送给它,然后重复以上过程,直到所有的任务被发送或者没有客户端可以发送任务。
- 如果没有可以接受任务的客户端,则将其放入待发送列表,等待下次任务变更事件触发。
- 分布式任务在master收到后按照接口约定拆分参数并发送到指定的执行端,等待执行完毕后再进行合并,最后发回提交端。
- 目前服务器关闭的时候默认会通知所有的客户端销毁任务执行并关闭。