`
mozhenghua
  • 浏览: 325751 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java版工人-监工模式实现

阅读更多

    之前在学习erlang OTP的时候,看到在OTP中实现了工人-监工模式,就是在定义一个工作者进程的时候,同时为器分配了一个overseer(监工),监工啥事儿也不作,就专门负责工作者进程是否正常工作,有无任务异常情况发生,当时看到在机制觉得不以为然觉得就这么几行代码没什么大不了的。

 

    当我最近用java代码来实现分布式编程的时候发现要做一个稳定的,可靠的系统并不是那么容易,之前在单机系统中默认不会不会出任何问题的共享变量操作,进程间通信。在分布式系统中zookeeper锁操作异常,远程socke长连接断连,一切都变得不是那么可靠了,甚至要默许这种异常成为常态。

 

     但是系统还要保证是4个9的稳定性,按照以前的策略是,发生异常的地方,进行函数重试等,于是乎系统的代码开始变得冗余,杂乱起来。

 

     erlang OTP的策略是,默认异常是一种常态,出问题了没有关系,只要将整个进程重启,重启的逻辑由监工进程负责,这样对于工作进程内部执行的逻辑还是高内聚的,清晰的。初始化的时候还可以设置监工进程的重启规则,比如一分钟之内如果超过5次异常,就认为系统中的崩溃啦,就会执行终止业务进程的逻辑。

 

   按照这个逻辑,我在java中也简单实现了监工-工人模式,代码如下:

 

 

import java.util.concurrent.ExecutorService;
import java.uil.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 工人和监工模式实现
 */
public class TaskOverseer {
	private final OverSeer oversee;

	private final long timeInterval;

	private static final ExecutorService threadPool = Executors
			.newCachedThreadPool();

	private int maxErrorCount;

	public TaskOverseer(long duration, TimeUnit timeunit, int maxErrorCount) {
		super();
		this.maxErrorCount = maxErrorCount;
		this.timeInterval = timeunit.toMillis(duration);
		this.oversee = new OverSeer();
		this.oversee.setDaemon(true);
		this.oversee.start();

	}

	private final AtomicInteger count = new AtomicInteger();
	private final AtomicLong timestampe = new AtomicLong(System
			.currentTimeMillis());

	protected void startWork() throws Exception {

	}

	protected void recycleResource() {

	}

	private class OverSeer extends Thread {

		public OverSeer() {
			super("Overseer thhread");
		}

		@Override
		public void run() {
			try {
				while (true) {
					synchronized (this) {
						System.out.println("launch a worker task");
						threadPool.execute(new Worker());
						this.wait();
					}
				}

			} catch (InterruptedException e) {

				throw new RuntimeException(e);
			}
		}
	}

	private class Worker implements Runnable {
		@Override
		public void run() {

			try {
				startWork();
			} catch (Throwable e) {
				synchronized (oversee) {
					recycleResource();

					final long currentTimestamp = System.currentTimeMillis();
					if ((currentTimestamp <= (timestampe.get() + timeInterval))
							&& count.incrementAndGet() > maxErrorCount) {
						// 终止监工进程
						oversee.interrupt();
						throw new RuntimeException("between 1 min "
								+ count.get() + " errors occur", e);
					} else {

						if (currentTimestamp > (timestampe.get() + timeInterval)) {
							count.set(0);
							timestampe.set(currentTimestamp);
						}
					}

					oversee.notifyAll();
				}

			}
		}
	}

	
}

 

    只需继承TaskOverseer类,在构造函数上设置,在多少时间内抛最多多少个异常,如果超过了这个异常数目,系统就会终止。然后按照业务需要覆写startWork这个函数,在里面添加一些业务代码。

​   例如:

public static void main(String[] args) throws Exception {

		TaskOverseer overseer = new TaskOverseer(1l, TimeUnit.MINUTES, 4) {
			@Override
			protected void startWork() throws Exception {
				Thread.sleep(1000 * 20);
				throw new Exception("i am die");
			}
		};

		Thread.sleep(10000 * 99);
	}

 

按照如上构造函数中定义的,一分钟之内最多发生四次异常,超过这个数目系统就会奔溃。

startWork方法中会20秒抛出一个异常,一分钟之内最多抛三个异常,所以系统将这样一直运行下去,如果将线程sleep的时间小于15秒的话,系统一段时间之后就会自动奔溃。

​如果用这样的策略来处理分布式环境下的异常,相信可以构建出一个更加稳定健壮的系统。

分享到:
评论

相关推荐

    迅雷云监工

    安装完成后,用户可以通过Web界面或者其他客户端工具访问"迅雷云监工",实现对远程服务器的可视化管理和监控。 "云监工"这类工具的一个重要特性是安全性,因此在使用过程中,用户需要确保所有通信都是加密的,并...

    web_common.rar_云监工_云监工源码_监工

    【标题】"web_common.rar_云监工_云监工源码_监工" 提供的是迅雷云监工的流量统计源代码,这是一套用于监控和分析网络上传流量的程序。云监工,顾名思义,是基于云计算技术的监控工具,它能够实时监控并统计网络活动...

    指导2监工管理工程师与监工管理企业集团.ppt

    《指导2监工管理工程师与监工管理企业集团》这篇文档主要探讨了建设工程监理的相关概念、监理工程师的角色以及FIDIC(国际咨询工程师联合会)在其中的影响和职业道德规范。以下是详细的知识点解析: 1. 建设工程...

    京东云无线宝监工_jd-cloud-monitor.zip

    京东云无线宝监工_jd-cloud-monitor

    玩客监工.exe

    玩客监工可以监控玩客云的 运行状态,掉线情况,一键提币能功能

    windows部署迅雷云监工.pdf

    windows部署迅雷云监工.pdf

    监工管理工程师考试建设工程合同管理工作试卷.ppt

    综上所述,监工管理工程师在处理建设工程合同时,可能需要利用编程知识,如Visual Basic,来自动化或优化某些工作流程。理解过程的创建、调用和参数传递机制对于编写高效、准确的程序至关重要。在实际工程管理中,这...

    最新监工合同(示范合同)共7页.pdf-文档整理可打印.z

    标题中的“最新监工合同(示范合同)共7页.pdf-文档整理可打印.z”表明这是一个关于监工合同的文档,经过整理并且可以打印,格式为PDF,且包含7个页面。这个标题提示我们,这份文件可能是建筑、工程或者项目管理领域的...

    玩客云监工软件源码.NET4.5

    玩客云监工源码,用.NET4.5编写的。 资源完全开源,可以用来做二次开发。 我是来学习用的,目的也是为了了解区块链,了解真正的核心

    windows部署迅雷云监工.doc

    总之,Windows环境下部署迅雷云监工虽然与Linux环境有所不同,但借助Python和Windows的灵活性,依然可以实现高效且稳定的监控。通过合理的硬件选择和软件配置,我们可以创建一个强大的本地监控中心,为系统稳定运行...

    客运专线隧道监工管理监工管理工作关键点.ppt

    【客运专线隧道工程特点】 客运专线隧道工程是高速铁路建设中的关键组成部分,其设计和施工特点主要体现在以下几...在监工管理中,把握这些关键点,能够有效地保证隧道工程的顺利完成,实现高速铁路的高效、安全运行。

    装修业主监工必备宝典.pptx

    装修业主监工必备宝典

    boot-actuator:基于SpringBoot2.0 实现的jvm远程监工图形化工具,可以同时监控多个web应用,支持远程监控

    简介项目介绍基于SpringBoot2.0 实现的jvm远程监工图形化工具,可以同时监控多个web应用该项目是借鉴另个一开源项目JavaMonito初始版演变而来,剔除了一些功能,增加了可远程监控模块,只需要在需要监控的项目集成...

    监工师《案例分析》历年真题及答案.docx

    ### 监工师《案例分析》历年真题及答案知识点解析 #### 一、知识点概述 本篇文档涉及的是监工师《案例分析》历年真题及其答案解析,主要聚焦于建设工程施工合同管理中的几个典型场景,包括合同价款调整、工程款...

    2021公司品质部产品品质监工工作总结.docx

    本文将详细解读2021年公司品质部在产品品质监工方面所进行的一系列工作总结,同时指出存在的问题,并提出未来的改进方向。 首先,品质控制机制的建设是品质监工工作的基础。2021年,品质部基于《商业管理公司制度》...

    建设工程的监工管理简述.ppt

    在建筑工程领域中,监工管理是确保项目顺利进行的重要环节。这不仅关系到工程质量、安全以及进度的控制,也是工程能否成功交付的关键因素。监工管理的核心在于监理工程师的作用,他们如何执行职责、协调沟通、管理...

    建设工程监工管理简述.ppt

    建设工程监工管理主要涉及建设工程监理制度、监理工程师和工程监理企业的相关知识,下面将详细阐述这些内容。 首先,建设工程监理制度是指在建设工程活动中,由具备相应资质的监理单位受建设单位委托,按照委托监理...

    百度搜索算法

    还可以考虑让厂长在分配任务时同时通知监工,或者让监工根据经验猜测哪个工人最有可能有任务,这样可以在一定程度上减少监工的询问次数。 在面试中回答这类问题时,应聘者需要做到的是清晰地表达自己的思路,包括...

    公路工程建设监工管理.ppt

    公路工程建设监工管理是确保工程项目质量和安全的重要环节。在这一过程中,主要涉及设计阶段和施工阶段的质量控制,以及相应的管理手段和方法。 一、设计阶段的质量控制 设计阶段的质量控制至关重要,因为它为整个...

    水利工程监工管理风险管理工作.ppt

    《水利工程监工管理风险管理工作》的讨论主要集中在风险管理这一核心主题上,这涉及到对不确定性的理解和应对策略。风险管理是确保水利工程建设项目顺利进行的关键环节,它旨在识别、评估和控制可能导致损失的风险...

Global site tag (gtag.js) - Google Analytics