Archiver Appliance 事务处理流程

当 Archiver Appliance 开始运行后发生了什么:

mgmt服务:

config\DefaultConfigService.java

initialize()   {
   
	this.mgmtRuntime = new MgmtRuntimeState(this);
	
	
	startupExecutor = Executors.newScheduledThreadPool(1, new ThreadFactory() {
   
		@Override
		public Thread newThread(Runnable r) {
   
			Thread t = new Thread(r);
			t.setName("Startup executor");
			return t;
		}
	});
	
	
	MgmtPostStartup mgmtPostStartup = new MgmtPostStartup(this);
	ScheduledFuture<?> postStartupFuture = startupExecutor.scheduleAtFixedRate(mgmtPostStartup, 10, 20, TimeUnit.SECONDS);
	mgmtPostStartup.setCancellingFuture(postStartupFuture);
}

创建 mgmt 状态机 —— MgmtRuntimeState;
定期执行 mgmt 后处理 —— MgmtPostStartup。

mgmt\MgmtPostStartup.java

public MgmtPostStartup(ConfigService configService) {
   
	this.configService = configService;
}

	
@Override
public void run() {
   
	if(this.configService.isStartupComplete()) {
   
		this.checkIfAllComponentsHaveStartedUp();
		if(this.configService.getMgmtRuntimeState().haveChildComponentsStartedUp()) {
    
			cancellingFuture.cancel(false);
		}
	} else {
   
		configService.postStartup();
	}
}


checkIfAllComponentsHaveStartedUp() {
    
	if(retrievalStartupState == ConfigService.STARTUP_SEQUENCE.STARTUP_COMPLETE) {
    
		configService.getMgmtRuntimeState().componentStartedUp(WAR_FILE.RETRIEVAL);
	}
	... // etl 和 engine
}

定期执行的 mgmt 后处理包括:
若 configService 未完成,则执行 configService.postStartup() ;
若 configService 已完成,检查 mgmt、engine、etl、retrieval 四个服务是否都启动成功;
每个服务启动成功时,都会更新 mgmt 状态机中已启动服务列表;
若四个服务都成功启动,则开始存储 PV 值 —— startArchivePVRequests()。

config\DefaultConfigService.java

/*
 * config\DefaultConfigService.java
 */


postStartup() {
   
	Config config = new XmlConfigBuilder().build();
	...
	hzinstance = Hazelcast.newHazelcastInstance(config);  // 建立集群信息

	pubSub = hzinstance.getTopic("pubSub");

	initializePersistenceLayer();						// 初始化 MySQL 数据库中存储的 PV 信息
	loadTypeInfosFromPersistence();		
	loadAliasesFromPersistence();
	loadArchiveRequestsFromPersistence();			
	loadExternalServersFromPersistence();			
	registerForNewExternalServers(hzinstance.getMap("channelArchiverDataServers"));
			
	eventBus.register(this);  							 // 事务通知
	pubSub.addMessageListener(new MessageListener<PubSubEvent>() {
   
			@Override
			public void onMessage(Message<PubSubEvent> pubSubEventMsg) {
   
				PubSubEvent pubSubEvent = pubSubEventMsg.getMessageObject();
				if(pubSubEvent.getDestination().equals("ALL") 
					|| (pubSubEvent.getDestination().startsWith(myIdentity) && pubSubEvent.getDestination().endsWith(DefaultConfigService.this.warFile.toString()))
					) {
   
						pubSubEvent.markSourceAsCluster();
						eventBus.post(pubSubEvent);	
				}				
	});
	
	this.startupState = STARTUP_SEQUENCE.STARTUP_COMPLETE;
}

将数据库中存储的 PV 信息加载到当前环境;
建立集群信息、事务通知机制:
集群中某个appliance发送消息后,先通过 PubSubEvent 推送到集群,该消息的目的appliance收到并发现是发给自己的某个服务的消息后,再通过 eventBus 推送到本地。

initializePersistenceLayer() throws ConfigException {
   
	persistanceLayer = new MySQLPersistence();			// 与 MySQL 交互的接口
}

mgmt\MgmtRuntimeState.java

private static int threadNumber = 1;
ScheduledExecutorService archivePVWorkflow = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
   
	@Override
	public Thread newThread(Runnable r) {
   
		Thread t = new Thread
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值