最近在学习akka,在看rpc相关的东西,有点脑子疼,哈哈

  1.需求:

    目前大多数分布式架构底层通信是通过RPC实现的,RPC框架非常多,

    比如我们学过的Hadoop项目的RPC通信框架,但是Hadoop在设计之初就

    是为了运行长达数小时的批量而设计的,在某些极端的情况下,

    任务提交的延迟很高,所有Hadoop的RPC显得有些笨重。

  2.特点

    Spark 的RPC是通过Akka类库实现的,Akka用Scala语言开发,

    基于Actor并发模型实现,

    Akka具有高可靠、高性能、可扩展等特点,使用Akka可以轻松

    实现分布式RPC功能

  3.Akka简介

    Akka基于Actor模型,提供了一个用于构建可扩展的(Scalable)、

    弹性的(Resilient)、快速响应的(Responsive)应用程序的平台

  4.一句话描述RPC:

    不同进程之间的通信调用叫做RPC,只要有网络通信即可

  5.进程和线程之间的关系

    一个进程包含多个线程,因为启动一个进程就相当于启动了

    一个jvm(虚拟机)

  6.重要的类的描述

    ActorSystem是这个进程中Actor的老大,负责和监控所有的actor,

    我们可以使用这个,ActorSystem创建很多个Actor,通常是

    一个单例对象,Actor负责通信

  7.关于一个简单的akka的小例子,自己给自己发送信息

package cn.xx.rpc

import akka.actor.{Actor, ActorSystem}
import akka.actor.Actor.Receive
import com.typesafe.config.ConfigFactory
import akka.actor.Props /**
* Created by XX on 2016/12/23.
*/
class Master extends Actor { println("constructor invoked") //用于接收消息
override def receive: Receive = {
case "connect" => {
println("a client connected")
}
case "hello" =>{
println("hello")
}
} override def preStart(): Unit = {
println("prestart invoked")
}
} object Master{
def main(args: Array[String]): Unit = {
val host = args(0)
val port = args(1).toInt
// 准备配置
val configStr =
s""" //这个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[Master],"Master")
master ! "hello"
actorSystem.awaitTermination()
}
}

  8.简单的不同通信之间的RPC的通行

  Master.scala

package cn.wj.rpc

import akka.actor.{Actor, ActorSystem}
import akka.actor.Actor.Receive
import com.typesafe.config.ConfigFactory
import akka.actor.Props /**
* Created by WJ on 2016/12/23.
*/
class Master extends Actor { println("constructor invoked") //用于接收消息
override def receive: Receive = {
case "connect" => {
println("a client connected")
sender ! "reply" //往发送给他消息的人回复一个消息
}
case "hello" =>{
println("hello")
}
} override def preStart(): Unit = {
println("prestart invoked")
}
} object 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)
//ActorSystem老大,辅助创建和监控下面的Actor,他是单例的
val actorSystem = ActorSystem("MasterSystem",config )
//创建Actor
val master = actorSystem.actorOf(Props[Master],"Master")
master ! "hello"
actorSystem.awaitTermination()
}
}

  Worker.scala

package cn.wj.rpc

import akka.actor.{Actor, ActorSelection, ActorSystem, Props}
import com.typesafe.config.ConfigFactory /**
* Created by WJ on 2016/12/23.
*/
class Worker(val mastHost:String,val mastPort:Int) extends Actor { var master : ActorSelection = _ //preStart执行方法的时机:构造器之后,receive之前
//与Master(Actor)建立连接
override def preStart(): Unit = {
//master已经是别的Master的引用了
// master = context.actorSelection(s"akka.tcp://MasterSystem@$mastHost:$mastPort/user/Master")
master = context.actorSelection(s"akka.tcp://MasterSystem@192.168.109.1:8888/user/Master")
//akka.tcp://MasterSystem@192.168.109.1:8888
master ! "connect"
} override def receive: Receive = {
case "reply" => {
println("a reply form master")
}
}
} object Worker{
def main(args: Array[String]): Unit = {
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 )
//创建Actor,此时调用该(Actor)的prestart以及receive方法
actorSystem.actorOf(Props(new Worker(masterHost,masterPort)),"Worker")
actorSystem.awaitTermination()
}
}

  9.通信业务逻辑

    首先启动Master,然后启动所有的Worker
    1.Worker启动后,在preStart方法中与Master建立连接,

     向Master发送注册,将Worker的信息

     通过case class封装起来发送给Master

    2.Master接受Worker的注册消息后将Worker的消息保存起来
    3.Worker定期向Master发送心跳,为了报活

初见akka-01的更多相关文章

  1. python 自动化之路 day 01 人生若只如初见

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 Python 注释 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式i ...

  2. Hibernate-ORM:01.Hibernate恍如隔世般初见

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 对于学过ORM框架的朋友来说,上手HibernateORM来说,既熟悉有有一点陌生,熟悉无非是灵魂相通,陌生的 ...

  3. 【maven学习笔记】 01 初见

    想学maven,maven是ant的替代品. 1:下载 maven是apache的顶级项目,在http://maven.apache.org/可以直接下载. 2:环境变量 下载完要配置环境变量,把bi ...

  4. [Nest] 01.初见nest.js

    github nest 介绍 Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架.它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人 ...

  5. spark Association failed with [akka.tcp:sparkMaster@ip:7077]

    今搭建spark集群, conf/spark-env.sh 配制如下 export SPARK_MASTER_IP=masterexport SPARK_MASTER_PORT=7077export ...

  6. akka简单示例-1

    刚刚开始接触akka,网上找了2个简单示例,并在公司运营机器上尝试,踩了一些坑,在此记录. 1. 本地hello world [torstan@sparkb5-i ~/akka_example/hel ...

  7. AKKA学习笔记

    AKKA学习笔记总结 01. AKKA 1. 介绍: Akka基于Actor模型,提供了一个用于构建可扩展的(Scalable).弹性的(Resilient).快速响应的(Responsive)应用程 ...

  8. Akka(13): 分布式运算:Cluster-Sharding-运算的集群分片

    通过上篇关于Cluster-Singleton的介绍,我们了解了Akka为分布式程序提供的编程支持:基于消息驱动的运算模式特别适合分布式程序编程,我们不需要特别的努力,只需要按照普通的Actor编程方 ...

  9. Akka(36): Http:Client-side-Api,Client-Connections

    Akka-http的客户端Api应该是以HttpRequest操作为主轴的网上消息交换模式编程工具.我们知道:Akka-http是搭建在Akka-stream之上的.所以,Akka-http在客户端构 ...

  10. (转)akka Router实例

    通常在分布式任务调度系统中会有这样的需求:一组actor提供相同的服务,我们在调用任务的时候只需要选择其中一个actor进行处理即可. 其实这就是一个负载均衡或者说路由策略,akka作为一个高性能支持 ...

随机推荐

  1. 一道Java集合框架题

    问题:某班30个学生的学号为20070301-20070330,全部选修了Java程序设计课程,给出所有同学的成绩(可用随机数产生,范围60-100),请编写程序将本班各位同学的成绩按照从低到高排序打 ...

  2. (转)轻松解决 MyEclipse、Eclipse 编译时提示 @Override The method of type must override a superclass method 即 @Override 标注问题

    刚才在把工程从其他地方导入到自己机子的 MyEclipse 下时,出现了 The method of type must override a superclass method ,提示的是实现类必须 ...

  3. Struts2_Action和Result总结

    Action 1.实现一个Actiond的最常用方式:从ActionSupport继承2.DMI动态方法调用3.通配符配置 *{1}{2}... a) *_*4.接收参数的方法(一般用属性或者Doma ...

  4. SPFieldLookupValue

    //得到查阅项的值SPWeb web = site.OpenWeb();SPList list = web.Lists["DemoList"];SPListItem item = ...

  5. 利用ASP.NET里自带的站点地图工具制作网站站点地图

    站点地图很方便能快速给我们导航我们要去访问的地址,能按层级关系分门别类,给用户一个很好的用户体验,很好的看到自己当前所在的网站位置 站点地图,又称网站地图,它就是一个页面,上面放置了网站上所有页面的链 ...

  6. centos 7(1611)安装笔记

    麻烦   前天我把双系统笔记本里的 deepin 的磁盘分区直接从 Windows 7 磁盘管理里格式化了,结果悲催了,开不了机了,显示: 我以为是 Windows 7 的引导没了,就进 PE 修复了 ...

  7. reactjs--父组件调用子组件的内部方法(转载)

    reactjs--父组件调用子组件的内部方法 发表于2016/10/11 9:21:37  965人阅读 1.引入相关js <script src="js/react.js" ...

  8. 使用shc加密bash脚本程序

    摘要以前写看到别人写的脚本用shc加密的,我也有就了解了下. SHC代表shell script compiler,即shell脚本编译器.通过SHC编译过的脚本程序对普通用户而言是不读的,因此如果你 ...

  9. P1217 [USACO1.5]回文质数 Prime Palindromes

    题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000 ...

  10. python打印对象所有属性

    print dict(对象名)