基于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 ...
随机推荐
- [MVC4-基礎] 從資料庫取值顯示在DropDownList中
剛開始學MVC4,以下是一些基礎的學習筆記! 完成效果像下面這樣,資料來源是既有的Database. 1.Controller public ActionResult Index() { SqlCon ...
- Ganglia 监控Hadoop
Ganglia监控Hadoop集群的安装部署 一. 安装环境 Ubuntu server 12.04 安装gmetad的机器:192.168.52.105 安装gmond的机 器:192.168.52 ...
- gdb调试整理
调试环境:linux调试工具:gdb 调试类别 1.调试core文件 gdb 应用程序名 core文件名2.调试正在执行的程序 gdb 应用程序名 pid 3.gdb 应用程序名 4 ...
- Android高清巨图加载方案
1.今天看了鸿洋的<Android高清巨图加载方案>一文,对加载高清巨图时的解决方案有了一定的认识. 思路为: 提供一个设置图片的入口. 重写onTouchEvent,在里面根据用户移动的 ...
- Struts2学习笔记--Struts例子及开发流程
参考资料:http://blog.csdn.net/hntyzgn2010/article/details/5547753 http://chenlh.iteye.com/blog/464341 入门 ...
- 蚁群算法matlab实现
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下用matlab实现蚁群算法: %蚂蚁算法test %用产生的一个圆上的十个点来检验蚂蚁 ...
- opencv 批量图像读写
处理图像数据集时通常要读写整个文件夹里的图像,这时就会用的图像的批量读写. 比较常用的方法就是生成一个包含所有图像的txt列表 生成txt文件的方法如下: 利用cmd进入dos 利用路径进入指定文件夹 ...
- [POJ] 2239 Selecting Courses(二分图最大匹配)
题目地址:http://poj.org/problem?id=2239 Li Ming大学选课,每天12节课,每周7天,每种同样的课可能有多节分布在不同天的不同节.问Li Ming最多可以选多少节课. ...
- 基于toyix的进程和轻权进程的学习
我们在平时的计算机课上学习过进程,知道程序的执行的背后其实就是进程在进行一些操作.大家都知道打开windows的任务管理器可以看到正在运行的进程,当程序卡死时,可以在任务管理器里强制关闭相关程序的进程 ...
- Sogou搜狗搜索引擎登录网站 - Blog透视镜
Sogou搜狗是中国搜狐旗下的搜索引擎,其登录方式也很简单,只要输入网址,验证码即可,不需要注册账号,再进行登录,其他非 * 必填的字段,可留下空白不填,验证码只有4码,也很清晰可见,不像有的网站,即 ...