用AKKA实现简单的RPC通信模型2
来源:互联网 发布:知乎爱德华诺顿的长相 编辑:程序博客网 时间:2024/06/08 18:18
上一篇文章,简单地用AKKA实现了RPC通信,这篇文章在之前的基础之上,进行了更多地关于RPC通信的操作,包括传一些相关数据,包括心跳机制等
具体功能如下图:
代码结构:
WorkerInfo.scala代码
package cn.heres.rpc/** * Created by vinsuan on 2017/6/15 0015. */class WorkerInfo(val id: String,val memory:Int,val cores:Int) { //todo 上一次心跳 var lastHeartBeatTime : Long = _}
RemoteMessage.scala代码
package cn.heres.rpc/** * Created by vinsuan on 2017/6/15 0015. */trait RemoteMessage extends Serializable//worker->Mastercase class RegisterWorker(id:String , memory : Int ,cores:Int) extends RemoteMessagecase class Heartbeat(id:String ) extends RemoteMessage//Master->workercase class RegisteredWorker(masterUrl: String) extends RemoteMessage//worker->selfcase object SendHeartbeat//Master->selfcase object CheckTimeOutWorker
Worker.scala代码:
package cn.heres.rpcimport java.util.UUIDimport akka.actor.{Actor, ActorSelection, ActorSystem, Props}import akka.actor.Actor.Receiveimport com.typesafe.config.ConfigFactoryimport scala.concurrent.duration._/** * Created by vinsuan on 2017/6/13 0013. */class Worker(val masterHost : String ,val masterPost : Int,val memory: Int ,val cores :Int) extends Actor{var master : ActorSelection = _ val workerId = UUID.randomUUID().toString val HEARTBEAT_INTERVAL = 10000//建立连接 override def preStart(): Unit = { master = context.actorSelection(s"akka.tcp://MasterSystem@$masterHost:$masterPost/user/Master") master ! RegisterWorker(workerId,memory,cores) } override def receive: Receive = { case RegisteredWorker(masterUrl) => { println(masterUrl) //导入隐式转换 import context.dispatcher //启动定时器发送心跳 context.system.scheduler.schedule(0 millis,HEARTBEAT_INTERVAL millis,self,SendHeartbeat) } case SendHeartbeat => { println("send heartbeat to master") master ! Heartbeat(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 memory = args(4).toInt val cores = args(5).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) //创建Actor val worker = actorSystem.actorOf(Props(new Worker(masterHost,masterPort,memory,cores)),"Worker") actorSystem.awaitTermination() }}
Maser.scala代码:
package cn.heres.rpcimport akka.actor.{Actor, ActorSystem, Props}import com.typesafe.config.ConfigFactoryimport scala.concurrent.duration._/** * Created by vinsuan on 2017/6/13 0013. */class Master(val host:String,val port:Int) extends Actor { //workerId -> workerInfo val idtoWorker = new scala.collection.mutable.HashMap[String, WorkerInfo]() //workerInfo val workers = new scala.collection.mutable.HashSet[WorkerInfo]() val CHECK_INTERVAL = 15000 //超时检测的间隔 override def preStart(): Unit = { println("preStart invoked") //导入隐式转换 import context.dispatcher context.system.scheduler.schedule(0 millis, CHECK_INTERVAL millis, self, CheckTimeOutWorker) } //用于接收消息 override def receive: Receive = { case RegisterWorker(id, memory, cores) => { //判断一下,是不是已经注册过 if (!idtoWorker.contains(id)) { //把Worker的信息封装起来保存到内存中 val workerInfo = new WorkerInfo(id, memory, cores) idtoWorker(id) = workerInfo workers += workerInfo sender ! RegisteredWorker(s"akka.tcp://MasterSystem@$host:$port/user/Master") } } case Heartbeat(id) => { if (idtoWorker.contains(id)) { val workerInfo = idtoWorker(id) //报活 val currentTime = System.currentTimeMillis() workerInfo.lastHeartBeatTime = currentTime } } case CheckTimeOutWorker => { val currentTime = System.currentTimeMillis() val toRemove = workers.filter(x => currentTime - x.lastHeartBeatTime > CHECK_INTERVAL) for (w <- toRemove) { workers -= w idtoWorker -= w.id } println("还有几个活着的worker:" + workers.size) } }}object Master { def main(args: Array[String]) { 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) //ActorSystem 老大,辅助创建和监控下面的Actor ,它是单例的 val actorSystem = ActorSystem("MasterSystem", config) //创建Actor val master = actorSystem.actorOf(Props(new Master(host, port)), "Master") actorSystem.awaitTermination() }}
阅读全文
0 0
- 用AKKA实现简单的RPC通信模型2
- Spark:Akka实现简单RPC通信
- 使用scala实现Akka底层的rpc通信
- Scala基于Akka的Remote Actor实现的简单RPC
- 使用Akka实现一个简单的RPC框架(一)
- 使用Akka实现一个简单的RPC框架(二)
- JAVA通信(2)--实现简单的RPC框架
- scala 实现简单的RPC通信流程
- Akka-使用Akka编写RPC通信
- akka之RPC通信1
- 基于akka与scala实现一个简单rpc框架
- 简单的RPC实现
- 简单实现的RPC
- **通信-RPC模型**
- AKKA路由策略的简单实现
- D27 Akka实现,及自定义RPC
- 简单的RPC java实现
- 简单的RPC java实现
- 微信小程序图片的加载
- el
- python 字符串(str)和列表(list)的互相转换
- 网页前端架构师
- 链表值打印
- 用AKKA实现简单的RPC通信模型2
- 奇异值分解(SVD) --- 几何意义
- 【转】linux日志分析常用命令大全
- socket通信
- 微信小程序图片的加载
- Bootstrap 3.3.7学习笔记12
- 基于opencv的视频传输
- qwb与二叉树
- Charles抓取http接口数据