一、前言
任务调度管理作为基础架构通常会出现于我们的业务系统中,目的是让各种任务能够按计划有序执行。比如定时给用户发送邮件、将数据表中的数据同步到另一个数据表都是一个任务,这些相对耗时的操作通过任务调度系统来异步并行执行,既能提高任务的执行效率又能保障任务执行的可靠性。
实现的方式也是多种多样,比如使用Timer进行简单调度或者使用Quartz类似的框架,本文基于淘宝开源框架TbSchedule实现,其设计目的是让批量任务或者不断变化的任务能够被动态的分配到多个主机的JVM中,在不同的线程组中并行执行,所有的任务能够被不重复,不遗漏的快速处理,目前被应用于阿里巴巴众多业务系统。
请参照http://code.taobao.org/p/tbschedule/wiki/index/,相关内容不再重复介绍,本文记录了详细的部署整合操作步骤。
二、Zookeeper部署
1、TbSchedule依赖于Hadoop Zookeeper组件,实现任务的分布式配置及各服务间的交互通信,Zookeeper以TreeNode类型进行存储,支持Cluster形式部署且保证最终数据一致性,关于ZK的资料网上比较丰富,相关概念不再重复介绍,本文以zookeeper-3.4.6为例,请从官网下载http://zookeeper.apache.org。
2、创建ZookeeperLab文件夹目录,模拟部署3台Zookeeper服务器集群,目录结构如下。
3、解压从官网下载的zookeeper-3.4.6.tar文件,并分别复制到三台ZkServer的zookeeper-3.4.6文件夹。
4、分别在三台ZkServer的data目录下创建myid文件(注意没有后缀),用于标识每台Server的ID,在Server1datamyid文件中保存单个数字1,Server2的myid文件保存2,Server3的myid保存3。
5、创建ZkServer的配置文件,在zookeeper-3.4.6conf文件夹目录下创建zoo.cfg,可以从示例的zoo_sample.cfg 复制重命名。因为在同一台机器模拟Cluster部署,端口号不能重复,配置文件中已经有详细的解释,修改后的配置如下,其中Server1端口号2181,Server2端口号2182,Server3端口号2183。
代码如下 | 复制代码 |
# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=E:/ZookeeperLab/server1/data dataLogDir=E:/ZookeeperLab/server1/logs # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 server.1=127.0.0.1:2888:3888 server.2=127.0.0.1:2889:3889 server.3=127.0.0.1:2890:3890 |
6、通过zookeeper-3.4.6bin文件夹zkServer.bat文件启动ZKServer,由于Cluster部署需要选举Leader和Followers,所以在3个ZKServer全部启动之前会提示一个WARN,属正常现象。
7、Zookeeper启动成功后可以通过zookeeper-3.4.6bin文件夹的 zkCli.bat验证连接是否正常,比如创建节点“create /testnode helloworld”,查看节点“get /testnode”,连接到组群中其它ZkServer,节点数据应该是一致的。更多指令请使用help命令查看。
8、对于Linux环境下部署基本一致,zoo.cfg配置文件中data和datalog文件夹路径改为linux格式路径,使用“./zkServer.sh start-foreground”命令启动ZkServer,注意start启动参数不能输出异常信息。
9、至此Zookeeper的配置完毕。
三、SVN从TaoCode获取并Import TbSchedule源码(请先配置Maven环境)
四、TbSchedule控制台的部署
1、TbSchedule Console是基于web页面对调度任务配置、部署、监控的终端。
2、将源码目录下的consoleScheduleConsole.war包及depend-lib库部署到Web应用服务器,本文以Tomcat 7.0.54为例,相关步骤不再描述。
3、首次打开页面会跳转到“基础信息配置”Config.jsp页面,其中前2项为Zookeeper服务的连接配置,请正确填写前面部署的Zookeeper服务器地址和端口号,多个ZKServer可以使用逗号分隔。后3项是用于标识ZkServer中调度任务配置的根节点和节点权限,无严格要求。
4、点击保存后,会提示 “错误信息:Zookeeper connecting ......localhost:2181”,如果ZKServer配置正确可以不用理会,直接点击“管理主页”,若不能正常跳转到Index.jsp页面请重新检查Zookeeper的配置,建议关闭防火墙。
5、TbSchedule Console Web站点对应的两个地址
[监控页面] http://localhost:8081/ScheduleConsole/schedule/index.jsp
[管理页面] http://localhost:8081/ScheduleConsole/schedule/index.jsp?manager=true
如果以上地址能正常访问则TbSchedule Console的部署配置完成。
五、Task场景设计
1、假设场景:任务需要将订单表tbOrder中制单日期在20141201--20141208?龋ü?天)的数据同步到备份tbOrder_copy 表,其中每2天分为一个任务组并行同步(每次提取500条),关于任务组的划分和TbSchedule中TaskItem的相关概念请先参考wiki,后续也会有部分解释。
2、数据环境使用MySql数据库,创建tbOrder和tbOrder_Copy数据表,结构相同,同时在tbOrder事先生成好测试数据,建议每天的数据量在1000条以上。
六、数据同步任务实现
1、创建TaskCenter Demo Project,添加对tbschedule project的依赖,并集成Spring Framework。
2、创建OrderInfo实体类,属性对应tbOrder表,用于映射从数据表取的数据。
3、创建DataSyncABean任务类,实现IScheduleTaskDealSingle<T>泛型接口的selectTasks和execute方法,其中selectTasks方法用于取数,execute方法用于执行selectTasks返回的Result,关于代码中任务片段的划分和TbSchedule中TaskItem的相关概念后续再解释,代码参考如下。
代码如下 | 复制代码 |
package Task; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import com.taobao.pamirs.schedule.IScheduleTaskDealSingle; import com.taobao.pamirs.schedule.TaskItemDefine; import DBHelper.*; public class DataSyncABean implements IScheduleTaskDealSingle<OrderInfo> { public List<OrderInfo> selectTasks(String taskParameter, String ownSign, int taskItemNum, List<TaskItemDefine> queryCondition, int eachFetchDataNum) throws Exception { List<OrderInfo> result = new ArrayList<OrderInfo>(); if (queryCondition.size() == 0) { return result; } StringBuffer condition = new StringBuffer(); for (int i = 0; i < queryCondition.size(); i++) { if (i > 0) { condition.append(","); } condition.append(queryCondition.get(i).getTaskItemId()); } /* 场景A:将tbOrder表中的数据分8个任务项,每次取200条数据, 同步到tbOrder_copy表中。 */ String sql = "select * from tbOrder " + "where " + " BillNumber not in (select BillNumber from tbOrder_copy) " + " and RIGHT(BuildDate,1) in (" + condition + ") " + "limit " + eachFetchDataNum; System.out.println("开始执行SQL:" + sql); ResultSet rs = MySQLHelper.executeQuery(sql); while (rs.next()) { OrderInfo order = new OrderInfo(); order.BillNumber = rs.getString("BillNumber"); order.BuildDate = rs.getString("BuildDate"); order.Customer = rs.getString("Customer"); order.GoodsName = rs.getString("GoodsName"); order.Amount = rs.getFloat("Amount"); order.SaleMoney = rs.getFloat("SaleMoney"); result.add(order); if (rs.isLast()) { break; } } MySQLHelper.free(rs, rs.getStatement(), rs.getStatement() .getConnection()); return result; } public Comparator<OrderInfo> getComparator() { return null; } public boolean execute(OrderInfo task, String ownSign) throws Exception { String sql = "insert into tbOrder_copy values('" + task.BillNumber + "','" + task.BuildDate + "','" + task.Customer + "','" + task.GoodsName + "'," + task.Amount + "," + task.SaleMoney + ")"; MySQLHelper.executeNonQuery(sql); System.out.println("execute:" + sql); return true; } } |
4、在Spring容器中注册数据同步任务Bean。
代码如下 | 复制代码 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <bean id="dataSyncABean" class="Task.DataSyncABean" /> </beans> |
5、Main函数初始化Spring容器和TbSchedule 任务管理Factory,连接ZKServer,代码如下,也可以参照TbSchedule源码中通过Spring进行初始化TBScheduleManagerFactory 。
代码如下 | 复制代码 |
import java.util.Properties; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; import com.taobao.pamirs.schedule.strategy.TBScheduleManagerFactory; public class TaskCenter { public static void main(String[] args) throws Exception { // 初始化Spring ApplicationContext ctx = new FileSystemXmlApplicationContext( "srcpplicationContext.xml"); // 初始化调度工厂 TBScheduleManagerFactory scheduleManagerFactory = new TBScheduleManagerFactory(); Properties p = new Properties(); p.put("zkConnectString", "localhost:2181"); p.put("rootPath", "/tbSchedule/Test"); p.put("zkSessionTimeout", "60000"); p.put("userName", "zookeeper"); p.put("password", "zookeeper"); p.put("isCheckParentPath", "true"); scheduleManagerFactory.setApplicationContext(ctx); scheduleManagerFactory.init(p); } } |
6、如果配置正确应该可以成功启动该TaskDeal服务。
七、在TbSchedule Console创建调度任务(请事先仔细阅读wiki中的概念解释)
1、创建调度策略,其中“最大线程组数量”设置为4,表示在机器上的通过4个线程组并行执行数据同步任务。
2、创建调度任务
任务名称:对应调度策略中的任务名称,标识任务和策略的关联关系;
任务处理的SpringBean:对应Demo TaskDeal服务Spring容器中的任务对象ID;
2、创建调度任务
任务名称:对应调度策略中的任务名称,标识任务和策略的关联关系;
任务处理的SpringBean:对应Demo TaskDeal服务Spring容器中的任务对象ID;
代码如下 | 复制代码 |
<bean id="dataSyncABean" class="Task.DataSyncABean" /> |
每次获取数据量:对应于bean任务类selectTasks方法参数 eachFetchDataNum;
执行开始时间:“0 * * * * ?” 表示每分钟的0秒开始,表达式同Quartz设置的Crontab格式,有工具可以生成,详细解释参照http://dogstar.iteye.com/blog/116130;
代码如下 | 复制代码 |
2.字段 允许值 允许的特殊字符 3.秒 0-59 , - * / 4.分 0-59 , - * / 5.小时 0-23 , - * / 6.日期 1-31 , - * ? / L W C 7.月份 1-12 或者 JAN-DEC , - * / 8.星期 1-7 或者 SUN-SAT , - * ? / L C # 9.年(可选) 留空, 1970-2099 , - * / 10.表达式意义 11."0 0 12 * * ?" 每天中午12点触发 12."0 15 10 ? * *" 每天上午10:15触发 13."0 15 10 * * ?" 每天上午10:15触发 14."0 15 10 * * ? *" 每天上午10:15触发 15."0 15 10 * * ? 2005" 2005年的每天上午10:15触发 16."0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 17."0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 18."0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 19."0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 20."0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 21."0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 22."0 15 10 15 * ?" 每月15日上午10:15触发 23."0 15 10 L * ?" 每月最后一日的上午10:15触发 24."0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 25."0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 26."0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 27.每天早上6点 28.0 6 * * * 29.每两个小时 30.0 */2 * * * 31.晚上11点到早上8点之间每两个小时,早上八点 32.0 23-7/2,8 * * * 33.每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点 34.0 11 4 * 1-3 35.1月1日早上4点 36.0 4 1 1 * |
任务项:前面假设的任务场景中需要把1-8号数据按2天为1个任务组并行数据同步,所以可以把任务划分为1,2,3,4,5,6,7,8一共8个任务碎片,8个任务碎片被分配到4个线程组,那么每个线程组对应2个任务碎片,运行时任务项参数又被传递到bean任务类selectTasks方法的List<TaskItemDefine> queryCondition参数,例如第1个线程组调用selectTasks方法是queryCondition参数条件为1,2 ,第2个线程组执行参数条件为3,4,bean任务类中根据参数生成对应的BuildDate条件取数,并将结果提交到execute方法执行,从而实现并行计算。
任务项的划分:可以有非常多的分配策略和技巧,例如将一个数据表中所有数据的ID按10取模,就将数据划分成了0、1、2、3、4、5、6、7、8、9供10个任务项;将一个目录下的所有文件按文件名称的首字母(不区分大小写),就划分成了A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z供26个任务项 。
3、新增任务配置保存后,Task会按指定的时间段自动开始执行,可以从TbScheduleConsole监视到对应的线程组和任务项。
4、同时可以从任务TaskDeal服务控制台监视到Debug输出的取数SQL和 Insert语句,以及TbSchedule的Heartbeat、TaskItem Debug信息。
代码如下 | 复制代码 |
17:01:00.000 [DataSyncATask-4-HeartBeat] DEBUG c.t.p.s.t.TBScheduleManager - 恢复调度:DataSyncATask$192.168.56.1$4354D7079D6144AAB33F650B6FF7E532$0000000003 17:01:00.000 [DataSyncATask-2-HeartBeat] DEBUG c.t.p.s.t.TBScheduleManager - 恢复调度:DataSyncATask$192.168.56.1$FCC86240694749FD9CE84DB791448D93$0000000001 17:01:00.000 [DataSyncATask-3-HeartBeat] DEBUG c.t.p.s.t.TBScheduleManager - 恢复调度:DataSyncATask$192.168.56.1$D4D821EBFCFA47C1865A7E42278F45A7$0000000002 17:01:00.002 [DataSyncATask-0-HeartBeat] DEBUG c.t.p.s.t.TBScheduleManager - 恢复调度:DataSyncATask$192.168.56.1$D3CED88695434526B8C9220FFCD9B584$0000000000 开始执行SQL:select * from tbOrder where BillNumber not in (select BillNumber from tbOrder_copy) and RIGHT(BuildDate,1) in (7,8) limit 500 开始执行SQL:select * from tbOrder where BillNumber not in (select BillNumber from tbOrder_copy) and RIGHT(BuildDate,1) in (5,6) limit 500 开始执行SQL:select * from tbOrder where BillNumber not in (select BillNumber from tbOrder_copy) and RIGHT(BuildDate,1) in (3,4) limit 500 开始执行SQL:select * from tbOrder where BillNumber not in (select BillNumber from tbOrder_copy) and RIGHT(BuildDate,1) in (1,2) limit 500 17:01:00.289 [DataSyncATask-4-exe3] DEBUG c.t.p.s.t.TBScheduleManager - 暂停调度 :DataSyncATask$192.168.56.1$4354D7079D6144AAB33F650B6FF7E532$0000000003:FetchDataCount=147,FetchDataNum=9600,DealDataSucess=9600,DealDataFail=0,DealSpendTime=687968,otherCompareCount=0 17:01:00.291 [DataSyncATask-0-exe1] DEBUG c.t.p.s.t.TBScheduleManager - 暂停调度 :DataSyncATask$192.168.56.1$D3CED88695434526B8C9220FFCD9B584$0000000000:FetchDataCount=130,FetchDataNum=180,DealDataSucess=180,DealDataFail=0,DealSpendTime=23783,otherCompareCount=0 17:01:00.295 [DataSyncATask-3-exe0] DEBUG c.t.p.s.t.TBScheduleManager - 暂停调度 :DataSyncATask$192.168.56.1$D4D821EBFCFA47C1865A7E42278F45A7$0000000002:FetchDataCount=161,FetchDataNum=18000,DealDataSucess=18000,DealDataFail=0,DealSpendTime=1207563,otherCompareCount=0 17:01:00.297 [DataSyncATask-2-exe0] DEBUG c.t.p.s.t.TBScheduleManager - 暂停调度 :DataSyncATask$192.168.56.1$FCC86240694749FD9CE84DB791448D93$0000000001:FetchDataCount=131,FetchDataNum=700,DealDataSucess=700,DealDataFail=0,DealSpendTime=80063,otherCompareCount=0 17:01:02.674 [DataSyncATask-2-HeartBeat] DEBUG c.t.p.s.t.TBScheduleManagerStatic - DataSyncATask$192.168.56.1$FCC86240694749FD9CE84DB791448D93$0000000001:不是负责任务分配的Leader,直接返回 17:01:02.865 [DataSyncATask-3-HeartBeat] DEBUG c.t.p.s.t.TBScheduleManagerStatic - DataSyncATask$192.168.56.1$D4D821EBFCFA47C1865A7E42278F45A7$0000000002:不是负责任务分配的Leader,直接返回 17:01:02.866 [DataSyncATask-4-HeartBeat] DEBUG c.t.p.s.t.TBScheduleManagerStatic - DataSyncATask$192.168.56.1$4354D7079D6144AAB33F650B6FF7E532$0000000003:不是负责任务分配的Leader,直接返回 17:01:04.433 [DataSyncATask-0-HeartBeat] DEBUG c.t.p.s.zk.ScheduleDataManager4ZK - DataSyncATask$192.168.56.1$D3CED88695434526B8C9220FFCD9B584$0000000000:开始重新分配任务...... 17:01:04.437 [DataSyncATask-0-HeartBeat] DEBUG c.t.p.s.zk.ScheduleDataManager4ZK - TASK_TYPE=DataSyncATask:TASK_ITEM=1:CUR_SERVER=DataSyncATask$192.168.56.1$D3CED88695434526B8C9220FFCD9B584$0000000000:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=2:CUR_SERVER=DataSyncATask$192.168.56.1$D3CED88695434526B8C9220FFCD9B584$0000000000:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=3:CUR_SERVER=DataSyncATask$192.168.56.1$FCC86240694749FD9CE84DB791448D93$0000000001:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=4:CUR_SERVER=DataSyncATask$192.168.56.1$FCC86240694749FD9CE84DB791448D93$0000000001:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=5:CUR_SERVER=DataSyncATask$192.168.56.1$D4D821EBFCFA47C1865A7E42278F45A7$0000000002:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=6:CUR_SERVER=DataSyncATask$192.168.56.1$D4D821EBFCFA47C1865A7E42278F45A7$0000000002:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=7:CUR_SERVER=DataSyncATask$192.168.56.1$4354D7079D6144AAB33F650B6FF7E532$0000000003:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=8:CUR_SERVER=DataSyncATask$192.168.56.1$4354D7079D6144AAB33F650B6FF7E532$0000000003:REQ_SERVER=null:DEAL_PARAMETER= 17:01:07.658 [DataSyncATask-2-HeartBeat] DEBUG c.t.p.s.t.TBScheduleManagerStatic - DataSyncATask$192.168.56.1$FCC86240694749FD9CE84DB791448D93$0000000001:不是负责任务分配的Leader,直接返回 17:01:07.882 [DataSyncATask-3-HeartBeat] DEBUG c.t.p.s.t.TBScheduleManagerStatic - DataSyncATask$192.168.56.1$D4D821EBFCFA47C1865A7E42278F45A7$0000000002:不是负责任务分配的Leader,直接返回 17:01:07.882 [DataSyncATask-4-HeartBeat] DEBUG c.t.p.s.t.TBScheduleManagerStatic - DataSyncATask$192.168.56.1$4354D7079D6144AAB33F650B6FF7E532$0000000003:不是负责任务分配的Leader,直接返回 17:01:09.441 [DataSyncATask-0-HeartBeat] DEBUG c.t.p.s.zk.ScheduleDataManager4ZK - DataSyncATask$192.168.56.1$D3CED88695434526B8C9220FFCD9B584$0000000000:开始重新分配任务...... 17:01:09.446 [DataSyncATask-0-HeartBeat] DEBUG c.t.p.s.zk.ScheduleDataManager4ZK - TASK_TYPE=DataSyncATask:TASK_ITEM=1:CUR_SERVER=DataSyncATask$192.168.56.1$D3CED88695434526B8C9220FFCD9B584$0000000000:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=2:CUR_SERVER=DataSyncATask$192.168.56.1$D3CED88695434526B8C9220FFCD9B584$0000000000:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=3:CUR_SERVER=DataSyncATask$192.168.56.1$FCC86240694749FD9CE84DB791448D93$0000000001:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=4:CUR_SERVER=DataSyncATask$192.168.56.1$FCC86240694749FD9CE84DB791448D93$0000000001:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=5:CUR_SERVER=DataSyncATask$192.168.56.1$D4D821EBFCFA47C1865A7E42278F45A7$0000000002:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=6:CUR_SERVER=DataSyncATask$192.168.56.1$D4D821EBFCFA47C1865A7E42278F45A7$0000000002:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=7:CUR_SERVER=DataSyncATask$192.168.56.1$4354D7079D6144AAB33F650B6FF7E532$0000000003:REQ_SERVER=null:DEAL_PARAMETER= TASK_TYPE=DataSyncATask:TASK_ITEM=8:CUR_SERVER=DataSyncATask$192.168.56.1$4354D7079D6144AAB33F650B6FF7E532$0000000003:REQ_SERVER=null:DEAL_PARAMETER= |
5、至此同步任务配置完成,并且实现了模拟场景的要求。
八、以上也只是对TbSchedule的初步认识,更多高级应用仍然在探索中。
相关推荐
淘宝分布式调度框架TBSchedule是淘宝的一块开源软件,TBSchedule有很多特性,包括批量任务,多主机,多线程,动态扩展,实时或定时任务,分片,并发,不重复执行。TBSchedule依赖于ZK存储调度数据,在使用中充当着...
**Python-Gerapy分布式爬虫管理框架** Gerapy是一个强大的基于Python的分布式爬虫管理系统,它结合了Scrapy、Scrapyd、Scrapyd-Client、Scrapyd-API以及Django和Vue.js等技术,旨在为开发者提供一个便捷、高效的...
《分布式实时计算框架 原理及实践案例》
4. 分布式 web 框架的优点:分布式 web 框架的优点包括降低企业成本、自动探测功能、部署发布功能、监控功能、配置中心和基于分布式缓存的 session 管理等。 5. 分布式 web 框架的挑战:分布式 web 框架面临的挑战...
该项目是一个分布式任务调度框架,旨在帮助开发者更高效地管理和调度任务。系统提供了实时任务、定时任务(如:3天之后执行)、CronExpression任务等功能。通过该项目,开发者可以学习并实践Java技术的应用,为后续...
淘宝分布式计算机构架
淘宝分布式服务框架,开发。网上下载的资料,还不错。
简介:《分布式服务框架:原理与实践》创作者具有丰富的分布式服务框架、平台中间件的架构设计和实践经验,主导设计的华为分布式服务框架已经在全球数十个国家成功商用。《分布式服务框架:原理与实践》依托工作实践...
基于java的开发源码-Redkale 1.9.4 Java 分布式微服务框架.zip 基于java的开发源码-Redkale 1.9.4 Java 分布式微服务框架.zip 基于java的开发源码-Redkale 1.9.4 Java 分布式微服务框架.zip 基于java的开发源码-...
本项目通过整合Dubbo、Zookeeper和SpringMVC,构建了一个完整的分布式服务治理框架,以实现高效的服务注册、发现、管理和监控。 首先,我们要理解Dubbo的核心功能。Dubbo提供了服务提供者(Provider)和服务消费者...
C++课程设计大作业基于unbutu实现的Linux分布式系统框架源码,C++课程设计大作业基于unbutu实现的Linux分布式系统框架源码C++课程设计大作业基于unbutu实现的Linux分布式系统框架源码C++课程设计大作业基于unbutu...
Dubbo分布式服务框架
组件化的构架使得开发者不需要任何改动就能轻松实现一站式开发,分布式部署,规避分布式调试的困难,提升开发效率。框架提供udp、 tcp、websocket常用网络协议,同时提供优雅的协议接口,可让开发者轻松实现其他...
Dubbo+Zookeeper分布式RPC系统框架实战教程,课程内容从分布式系统技术知识点教学,Dubbo四大组件,Zookeeper,Dubbo源码解析,分布式系统技术图谱,分布式RPC系统框架全面解读。
《架构探险:从零开始写分布式服务框架》的初衷是希望把分布式服务框架的实现细节及分布式服务框架周边的知识点梳理清楚,为那些对分布式服务框架感兴趣的人打开一扇窗户,降低获取相关知识的门槛。所以《架构探险:...
数据库技术与分布式计算框架是现代数据处理领域的两大基石,本文将带领读者从基础的数据库出发,逐步深入到分布式计算框架的核心,特别适用于想要从数据存储转移到分布式计算的初学者。 首先,从数据库层面来看,...
.`分布式服务框架之Dubbo整合Spring项目一.pdf
.`分布式服务框架之Dubbo整合Spring项目一.docx
分布式数据库安全框架研究 分布式数据库安全框架是企业级应用的重要组成部分,但随着数据量的增加和数据处理需求的提升,分布式数据库的安全问题也日益凸显。为了解决这个问题,本文旨在对分布式数据库安全框架进行...
本教程将逐步介绍如何实现一个分布式服务访问框架,以提升系统的可伸缩性和可靠性。我们将重点关注源码理解和工具的使用。 一、分布式服务访问框架的基本概念 分布式服务访问框架的核心是服务化思想,即将业务功能...