循序渐进企业级搜索引擎之Master模块设计及实现-系统加载

原创 2014年03月08日 17:26:33

第二章              Master模块设计及实现

Master具体细分为系统配置及监控加载模块、请求及相应封装处理模块、统计模块、监控及负载均衡等模块。具体的关系图如下:

 

2.1 Master系统逻辑框架图

下面逐个对这些模块及主要代码进行分析讲解。

2.1 系统配置及监控加载模块

由于系统需要在启动的时候加载一些配置和监控模块,同时还需要在最后做一些系统的资源释放和销毁动作,加上spring提供了类似的重写接口,所以系统的入口类需要实现如下三个接口:ApplicationContextAware,InitializingBean,DisposableBean实现如下:

/*
	 * (non-Javadoc)
	 * 
	 * @see org.springframework.beans.factory.DisposableBean#destroy()
	 */
	public void destroy() throws Exception {
		MasterCfgManager.destory();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
	 */
	public void afterPropertiesSet() throws Exception {
		MasterCfgManager.init();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.springframework.context.ApplicationContextAware#setApplicationContext
	 * (org.springframework.context.ApplicationContext)
	 */
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		WebAppContextUtil.setAppContext(applicationContext);
	}

 

afterPropertiesSet在这个方法中主要是在spring对系统上下文加载完成之后会直接触发调用,系统的初始化就此开始。setApplicationContext这个方法主要是加载在spring中定义的类,用于系统master中加载对index和query分开处理的provider。接下来看下系统init中都加载了什么内容。

具体的初始化函数如下:

/**
	 * 初始化函数
	 */
	public static void init() {
		loadCfg();
		initSlaveClientPool();
		initIndexPool();
initSearchPool();
		initStatisticPool();
		initParam();
		ChameleonKeeperThreadPoolManager.init();
		startChameleonKeeper();
		registerZKRoot();
	}


 

初始化主要是负责配置文件的加载,slave客户端restful调用的实例化类,初始化索引线程池和搜索线程池,以及master中需要用到的统计线程池,接下来就是启动一个zookeeperserver的守护线程,最后将master注册在zookeeper的一个root节点上,监听其下面的所有slaves端的节点信息变化。其中添加zookeeper server端的守护线程实现如下:

public static void startChameleonKeeper() {
		ServerConfig config = loadServerConfig();
		ChameleonKeeperThreadPoolManager
				.addJobToZKServerStartExecutor(new ZKServerStartUpJob(config));
	}
public static void addJobToZKServerStartExecutor(Runnable command) {
		init();
		DaemonThreadFactory daemon = new DaemonThreadFactory();
		zkServerStartExecutor = daemon.newThread(command);
		makeThreadName(zkServerStartExecutor,"-zkServerStartExecutor");
		setUncaughtExceptionHandler(zkServerStartExecutor);
		zkServerStartExecutor.start();
	}


 

具体启动的线程run方法如下:

public void run() {
		ZooKeeperServerMain main = new ZooKeeperServerMain();
		try {
			System.out.println("zookeeper server 启动");
			main.runFromConfig(config);
			System.out.println("zookeeper server 启动完成");
		} catch (IOException e) {
			LOG.error( "zookeeper server启动出错: " + e.getMessage() );
			e.printStackTrace();
		}
	}

而监控zookeeper节点的创建如下:

public static void initZK(String server, String root) {
		try {
			if (zk == null || !zk.getState().isAlive()) {
				synchronized (mutex) {
					if (zk == null || !zk.getState().isAlive()) {
						closeZK();
						init(root);
						createZK(server, root);
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			LOG.error("init zk ConnectionLossException!", e);
		}
	}

	private static void createZK(String server, String root) throws Exception {
		zk = new ZooKeeper(server, sessionTimeOut, new ClientWatcher());
		try {
			Stat stat = zk.exists(root, false);
			if (stat == null) {
				zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
						CreateMode.PERSISTENT);
				registerWatcher();
				System.out.println("connect zk server success!");
			}
		} catch (KeeperException.ConnectionLossException e) {
			System.out.println("ConnectionLoss exception sleep for 3s...");
			Thread.sleep(3 * 1000);
			System.out.println("connect zk server again");
			createZK(server, root);
		}
	}

至此系统配置加载已经完成,同时对系统监控系统也已经启动完成,可以对slaves端的节点信息变化做出相应的处理。



电商搜索引擎实践(工程篇)

随着互联网数据规模的爆炸式增长, 如何从海量的历史, 实时数据中快速获取有用的信息, 变得越来越有挑战性. 一个中等的电商平台, 每天都要产生百万条原始数据, 上亿条用户行为数据. 一般来说, 电商数...
  • abv123456789
  • abv123456789
  • 2016年03月27日 22:16
  • 4110

Web搜索引擎设计和实现分析

胡朝晖(浙江大学计算机系) 王海瑛(宁波海峰塑化有限公司)---- 一、引言 ---- 随着Internet的飞速发展,人们越来越依靠网络来查找他们所需要的信息,但是,由于网上的信息源多不胜数,也就是...
  • nm
  • nm
  • 2000年08月11日 08:37
  • 4207

循序渐进企业级搜索引擎之Master模块设计及实现-系统请求响应封装模块

2.2 系统请求响应封装模块   系统首先从request的信息中获取请求的类型,并依据请求的类型获取相应的处理类, if (handler == null && path.length() >...
  • letueo
  • letueo
  • 2014年03月09日 11:56
  • 1050

企业级即时通讯系统的设计与实现

  • 2014年04月10日 21:35
  • 273KB
  • 下载

2017.7.14 慕课网-Java从零打造企业级电商项目实战:for4 product模块接口设计

后台接口  /manage/product /manage/product/list.do 查询商品列表 选项 说明 URL /list.do...
  • liyuhui195134
  • liyuhui195134
  • 2018年01月04日 16:41
  • 71

慕课网-Java从零打造企业级电商项目实战:3 category模块设计与开发

6品类模块设计与开发 6.1要实现的功能 6.2 mmall_category表 6.3 品类模块接口设计 6.4/manage/category/add_category.do ...
  • hello_YaZe
  • hello_YaZe
  • 2017年10月31日 14:56
  • 1

2017.7.1 慕课网-Java从零打造企业级电商项目实战:2用户模块设计与开发

2. 用户模块设计与开发 2.1 要实现的功能   2.2 mmall_user表   2.3 用户模块接口设计 2017.7.3 慕课网-Java从零打造企业级电商项目实战:fo...
  • liyuhui195134
  • liyuhui195134
  • 2018年01月04日 16:41
  • 19

企业级应用中统一配置模块的设计

 简介: 在企业级应用的开发和运行中,配置数据是必不可少的。在以往的应用中,配置数据往往以许多不同方式保存,比如:文件、注册表以及数据库等。对配置数据的松散管理造成了在应用系统运行过程中查找、使...
  • cxzhq2002
  • cxzhq2002
  • 2015年02月25日 19:19
  • 607

ASP.NET典型三层架构企业级医药行业ERP系统实战(8大模块22个子系统,价值3000万)

ASP.NET典型三层架构企业级医药行业ERP系统实战(8大模块22个子系统,价值3000万)  课程讲师:Tiger     课程分类:.net         适合人群:高级       课时数...
  • u013019627
  • u013019627
  • 2014年01月13日 14:22
  • 2356

ASP.NET典型三层架构企业级医药行业ERP系统实战(8大模块22个子系统,价值3000万)

ASP.NET典型三层架构企业级医药行业ERP系统实战(8大模块22个子系统,价值3000万)  课程讲师:Tiger     课程分类:.net         适合人群:高级       课时数...
  • u013019627
  • u013019627
  • 2014年01月06日 13:06
  • 2100
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:循序渐进企业级搜索引擎之Master模块设计及实现-系统加载
举报原因:
原因补充:

(最多只允许输入30个字)