使用scala实现Akka底层的rpc通信
来源:互联网 发布:apache 压力测试工具 编辑:程序博客网 时间:2024/06/05 15:15
需求如下图:
Master代码:
package com.season.rpc.akkaimport akka.actor.{Actor, ActorSystem, Props}import com.typesafe.config.ConfigFactoryimport scala.collection.mutableimport scala.concurrent.duration._/** * Created by Administrator on 2017/5/2 0002. */class Master extends Actor { val CHECK_INTERVAL = 15000 val id2Worker = new mutable.HashMap[String,WorkerInfo]{} val workers = new mutable.HashSet[WorkerInfo]() override def preStart(): Unit = { //启动一个定时器 import context.dispatcher context.system.scheduler.schedule(0 millis,CHECK_INTERVAL millis,self,CheckTimeOutWorker) } override def receive: Receive = { case RegisterWorker(workerId,memory,cores) => { println(s"a connection from worker workerId : $workerId ram: $memory cpu: $cores") val workerInfo = new WorkerInfo(workerId,memory,cores) id2Worker(workerId) = workerInfo workers += workerInfo sender ! RegisteredWorker } case HeartBeat(workerId) => { println(s"a heartbeat from worker workerId : $workerId") val workerInfo: WorkerInfo = id2Worker(workerId) val current = System.currentTimeMillis() workerInfo.lastHeartbeatTime = current } case CheckTimeOutWorker => { println("internal msg check") val current = System.currentTimeMillis() //过滤掉超时的workers val deadWorkers = workers.filter(w => current - w.lastHeartbeatTime > CHECK_INTERVAL)// for (workerInfo <- deadWorkers){// id2Worker -= workerInfo.id// workers -= workerInfo// } deadWorkers.foreach(workerInfo => { id2Worker -= workerInfo.id workers -= workerInfo }) println(id2Worker.size) } }}object Master { val MASTER_ACTOR_SYSTEM = "MasterSystem" val MASTER_ACTOR_NAME = "Master" def main(args: Array[String]): Unit = { val host = args(0) val port = args(1).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) val actorSystem = ActorSystem(MASTER_ACTOR_SYSTEM, config) val masterActor = actorSystem.actorOf(Props[Master], MASTER_ACTOR_NAME) //masterActor ! "CheckTimeout" }}Worker代码:
package com.season.rpc.akkaimport java.util.UUIDimport akka.actor.{Actor, ActorSelection, ActorSystem, Props}import com.typesafe.config.ConfigFactoryimport scala.concurrent.duration._/** * Created by Administrator on 2017/5/2 0002. */class Worker(val host: String ,val port: Int ,val memory: Int ,val cores: Int) extends Actor{ val WORKER_ID = UUID.randomUUID().toString val HEARTBEAT_INTERVAL = 10000 var masterRef : ActorSelection =_ override def preStart(): Unit = { masterRef = context.actorSelection(s"akka.tcp://${Master.MASTER_ACTOR_SYSTEM}@$host:$port/user/${Master.MASTER_ACTOR_NAME}") masterRef ! RegisterWorker(WORKER_ID,memory,cores) } override def receive: Receive = { case RegisteredWorker => { import context.dispatcher context.system.scheduler.schedule(0 millis,HEARTBEAT_INTERVAL millis,self,SendHearBeat) } case SendHearBeat => { masterRef ! HeartBeat(WORKER_ID) } }}object Worker { val WORKER_ACTOR_SYSTEM = "WorkerSystem" val WORKER_ACTOR_NAME = "Worker" def main(args: Array[String]): Unit = { val workerHost = args(0) val workerPort = args(1).toInt val masterHost = args(2) val masterPort = args(3).toInt val workerMemory = args(4).toInt val workerCores = args(5).toInt val configStr = s""" |akka.actor.provider = "akka.remote.RemoteActorRefProvider" |akka.remote.netty.tcp.hostname = "$workerHost" |akka.remote.netty.tcp.port = "$workerPort" """.stripMargin val config = ConfigFactory.parseString(configStr) val actorSystem = ActorSystem(WORKER_ACTOR_SYSTEM, config) actorSystem.actorOf(Props(new Worker(masterHost,masterPort,workerMemory,workerCores)),WORKER_ACTOR_NAME) }}workinfo.scala
package com.season.rpc.akka/** * Created by Administrator on 2017/5/2 0002. */class WorkerInfo(val id : String , val memory : Int , val cores : Int) { var lastHeartbeatTime: Long = 0}信息类:
package com.season.rpc.akka/** * Created by Administrator on 2017/5/2 0002. */case class RegisterWorker(workerId: String , memory: Int ,cores: Int) extends Serializablecase class RegisteredWorker() extends Serializablecase class HeartBeat(workerId : String) extends Serializablecase object CheckTimeOutWorkercase object SendHearBeat
0 0
- 使用scala实现Akka底层的rpc通信
- Akka-使用Akka编写RPC通信
- Scala基于Akka的Remote Actor实现的简单RPC
- 用AKKA实现简单的RPC通信模型2
- scala 实现简单的RPC通信流程
- Spark:Akka实现简单RPC通信
- 使用Akka实现一个简单的RPC框架(一)
- 使用Akka实现一个简单的RPC框架(二)
- 基于akka与scala实现一个简单rpc框架
- 使用Scala模拟简单的RPC通信,Socket编程
- akka之RPC通信1
- 考察Hadoop的底层rpc通信(一)
- 考察Hadoop的底层rpc通信(二)
- Scala消息通信之akka,akka案例
- scala akka http基本使用
- Akka初体验之scala版word-count 的实现
- 用Scala模拟RPC通信
- Spark如何使用Akka实现进程、节点通信的简明介绍
- 126邮箱登陆 打印title
- Python:eval的妙用和滥用
- leetcode--Unique Binary Search Trees
- 注:Python中Scrapy爬虫框架的安装和pywin32安装的问题(py 3.x版本)
- 189. Rotate Array 旋转数组
- 使用scala实现Akka底层的rpc通信
- javascript中this 的指向问题(二)
- leetcode--Triangle
- commons-fileupload实现文件上传
- 523. Continuous Subarray Sum
- wprintf或_tprintf不显示问题
- NORMFACE:L2 hypersphere embedding for face Verification
- 【Java】synchronized
- BZOJ4802: 欧拉函数 pollard_pho