基于akka实现简单的主从框架
========================Master==============================
package com.scala.akka.rpc.demo2
import akka.actor.{Actor, ActorSystem, Props}
import com.typesafe.config.ConfigFactory
import scala.collection.mutable
import scala.concurrent.duration._
/**
* Created by 贵斌 on 2016-5-13.
*/
class Master(masterHost: String, masterPort: Int) extends Actor {
val registerWorkersMap = new mutable.HashMap[String, WorkerInfo]()
val workers = new mutable.HashSet[WorkerInfo]()
val CHECKWORKERTIME = 10000
override def preStart(): Unit = {
println("Master start....")
import context.dispatcher
context.system.scheduler.schedule(0 millis, CHECKWORKERTIME millis, self, SendMaskSelfHearBeat)
}
override def receive: Receive = {
case "clientconnect" => {
println("a client connected....")
sender() ! "reply"
}
case RegisterWorker(workerId, memory, cores) => {
if (!registerWorkersMap.contains(workerId)) {
val workerInfo = new WorkerInfo(workerId, memory, cores)
registerWorkersMap(workerId) = workerInfo
workers += workerInfo
sender ! RegisteredWorker(s"akka.tcp://MasterSystem@$masterHost:$masterPort/user/Master")
}
}
case HearBeat(workerId) => {
if (registerWorkersMap.contains(workerId)) {
val workerInfo = registerWorkersMap(workerId)
val currentTime = System.currentTimeMillis()
workerInfo.lastHearBeat = currentTime
}
}
case SendMaskSelfHearBeat => {
val currentTime = System.currentTimeMillis()
val diedWorkers = workers.filter(x => (currentTime - x.lastHearBeat) > CHECKWORKERTIME)
val liveWorkers = workers.filter(x => (currentTime - x.lastHearBeat) <= CHECKWORKERTIME)
for (w <- diedWorkers) {
workers -= w
}
println(workers.size)
}
case "master" => println("Master start successful....")
}
}
object Master {
def main(args: Array[String]) {
val host = "127.0.0.1"
val port = 10000
var configstr =
s"""
|akka.actor.provider = "akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname = "$host"
|akka.remote.netty.tcp.port = "$port"
""".stripMargin
val config = ConfigFactory.parseString(configstr)
val MasterSystem = ActorSystem("MasterSystem", config)
//创建Actor
val master = MasterSystem.actorOf(Props(new Master(host, port)), "Master")
master ! "master"
MasterSystem.awaitTermination()
}
}
===================worker========================
package com.scala.akka.rpc.demo2
import java.util.UUID
import akka.actor.{Actor, ActorSelection, ActorSystem, Props}
import com.typesafe.config.ConfigFactory
import scala.concurrent.duration._
/**
* Created by 贵斌 on 2016-5-13.
*/
class Worker(masterHost: String, masterPort: Int) extends Actor {
println("worker is being restarted....")
var master: ActorSelection = _
val SEND_HEARBEATTIME = 5000
val workerId = UUID.randomUUID().toString
override def preStart(): Unit = {
master = context.actorSelection(s"akka.tcp://MasterSystem@$masterHost:$masterPort/user/Master")
master ! "clientconnect"
master ! RegisterWorker(workerId, 1000, 24)
}
override def receive: Receive = {
case "work" => println("worker started successful....")
case "reply" => println("worker connection Master successful....")
case RegisteredWorker(masterUrl) => {
println("worker successful registration.... ")
println(s"Master Url is $masterUrl")
import context.dispatcher
context.system.scheduler.schedule(0 millis, SEND_HEARBEATTIME millis, self, SendWorkSelfHearBeat)
}
case SendWorkSelfHearBeat => {
master ! HearBeat(workerId)
}
}
}
object Worker {
def main(args: Array[String]) {
val host = args(0)
val port = args(1).toInt
val masterHost = args(2)
val masterPort = args(3).toInt
// 准备配置
val configStr =
s"""
|akka.actor.provider = "akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname = "$host"
|akka.remote.netty.tcp.port = "$port"
""".stripMargin
val config = ConfigFactory.parseString(configStr)
//ActorSystem老大,辅助创建和监控下面的Actor,他是单例的
val actorSystem = ActorSystem("WorkerSystem", config)
val worker = actorSystem.actorOf(Props(new Worker(masterHost, masterPort)), "Worker")
worker ! "work"
actorSystem.awaitTermination()
}
}
基于akka实现简单的主从框架的更多相关文章
- 转-基于NodeJS的14款Web框架
基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...
- 第三篇 基于.net搭建热插拔式web框架(重造Controller)
由于.net MVC 的controller 依赖于HttpContext,而我们在上一篇中的沙箱模式已经把一次http请求转换为反射调用,并且http上下文不支持跨域,所以我们要重造一个contro ...
- iOS开发网络篇—简单介绍ASI框架的使用
iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 ...
- 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】
基于SpringMVC下的Rest服务框架搭建[1.集成Swagger] 1.需求背景 SpringMVC本身就可以开发出基于rest风格的服务,通过简单的配置,即可快速开发出一个可供客户端调用的re ...
- 从Theano到Lasagne:基于Python的深度学习的框架和库
从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...
- 基于Mongodb的轻量级领域驱动框架(序)
混园子也有些年头了,从各个大牛那儿学了很多东西.技术这东西和中国的料理一样,其中技巧和经验,代代相传(这不是舌尖上的中国广告).转身回头一望,几年来自己也积累了一些东西,五花八门涉猎到各种方向,今日开 ...
- 基于特定领域国土GIS应用框架设计及应用
基于特定领域国土GIS应用框架 设计及应用 何仕国 2012年8月16日 摘要: 本文首先讲述了什么是框架和特定领域框架,以及与国土GIS 这个特定领 ...
- 基于 Vue.js 之 iView UI 框架非工程化实践记要
像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引用一下,不需要就删除.故观念使然,尽管 Nuget 和 Maven ...
- koa2源码解读及实现一个简单的koa2框架
阅读目录 一:封装node http server. 创建koa类构造函数. 二:构造request.response.及 context 对象. 三:中间件机制的实现. 四:错误捕获和错误处理. k ...
随机推荐
- mysql数据库的高可用方法总结
高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.虽然互联网服务号称7*24小时不间断服务,但多多少少有一 些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无 ...
- NumberBox( 数值输入框) 组件
本节课重点了解 EasyUI 中 NumberBox(数值输入框)组件的使用方法,这个组件依赖于 ValidateBox(验证框)组件.一. 加载方式//class 加载方式<input typ ...
- ExtJs在vs中的应用
目标: 认识EXTJS(自己google) 在vs中创建EXTJS的编程环境 通过一个简单的例子了解EXTJS编程过程 内容: 个人理解EXTJS是一个基于ajax富客户端应用程序框架, 1,创建vs ...
- BOM操作写法实例
浏览器相关信息 // 浏览器信息 navigator.userAgent // Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/ ...
- 2:url有规律的多页面爬取
举例网站:http://www.luoo.net/music/期刊号 e.g:http://www.luoo.net/music/760 打算爬取其title:Hello World:pic:desc ...
- jQuery事件与事件对象
事件是脚本编程的灵魂,本篇来介绍jQuery中的事件处理及事件对象. 事件与事件对象 首先,我们来看一下经常使用的添加事件的方式: <input type="button" ...
- debian系(Ubuntu)安装jenkins(持续集成)
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - sudo sh -c 'ec ...
- 设置cas server使用http非安全协议
目录 1.tomcat添加https安全协议 2.下载cas server端部署到tomcat上 3.CAS服务器深入配置(连接MYSQL) 4.Apache Shiro 集成Cas作为cas cli ...
- LIS n*log(n)的理解
很多时候lis 用二分的方法比较方便 这里写一下他的原理 这里仅对严格的最长上升子序列做讨论 这里有两个数列 一个数列是 原串的数列 a1-an 另一个数列是最长上升子序列辅助数列 s数列的长度为 ...
- web标准(复习)--8
今天我们开始学习下拉及多级弹出菜单,包含以下内容和知识点: 带下拉子菜单的导航菜单 绝对定位和浮动的区别和运用 css自适应宽度滑动门菜单 一.带下拉子菜单的导航菜单下拉菜单在一些企业网站应用尤为广泛 ...