最近在学习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. jQueryMobile(一)

    一].jQuery Mobile 页面 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta ...

  2. python类的反射

    反射 通过字符串映射或者修改程序运行时的状态.属性.方法, 有一下4个方法 小例子--根据用户输入调用方法: class Dog(object): def __init__(self,name): s ...

  3. 心得整理之一--RDLC多数据源多表

    我将项目中的一部分提炼出来,写了这个Demo. 先说一下需求, 从 API接口, 获取数据源, 调用RDLC 生成PDF文件. (后面还有涉及到使用福昕PDf阅读器进行设置文件自定义内容,以供外部程序 ...

  4. 微信小程序又一爆炸功能上线-云开发

    云开发介绍 开发者可以使用云开发开发微信小程序.小游戏,无需搭建服务器,即可使用云端能力. 云开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开 ...

  5. sql注入【手工及一些工具】

    Sql注入原理分析: 网站程序存在可控传递参数,参数未进行过滤直接带入数据库查询,导致攻击者可通过传递恶意sql语句代码进行执行攻击. Sql注入产生条件 1.必须有参数传递 2.参数值带入数据库查询 ...

  6. vos语音业务规范操作承诺函

    语音业务规范操作承诺函 *****网络科技有限公司: 我司开通固话2000线,话务价格为0.045元/分钟(仅拨打中国移动网内电话).为防止投诉.网外电话.欠费等语音话务风险,我司承诺如下:在业务上遵 ...

  7. 获取文件绝对路径:__FILE__与$_SERVER[SCRIPT_FILENAME'']的区别

    1.获取路径 (1)__FILE__ 获取某文件在本地目录中的绝对路径,(也就是说,哪个文件执行这行代码,它就获取哪个文件的绝对路径) (2)$__SERVER['SCRIPT_FILENAME'] ...

  8. April 18 2017 Week 16 Tuesday

    Every light has darkness to balance it out. 有光明的地方,必定有黑暗予以平衡. I strive to get a balance between life ...

  9. 如何获得C4C里某个code字段对应的描述信息

    通过我这篇文章介绍的方法使用C4C OData服务去取服务订单数据(Sales Order): 如何用代码的方式取出SAP C4C销售订单创建后所有业务伙伴的数据 https://www.jiansh ...

  10. Cmake 01

    1. sdsf(single direction single file) 1.1  The directory tree /* ./template | +--- build | +---main. ...