初见akka-01
最近在学习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的更多相关文章
- python 自动化之路 day 01 人生若只如初见
本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 Python 注释 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式i ...
- Hibernate-ORM:01.Hibernate恍如隔世般初见
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 对于学过ORM框架的朋友来说,上手HibernateORM来说,既熟悉有有一点陌生,熟悉无非是灵魂相通,陌生的 ...
- 【maven学习笔记】 01 初见
想学maven,maven是ant的替代品. 1:下载 maven是apache的顶级项目,在http://maven.apache.org/可以直接下载. 2:环境变量 下载完要配置环境变量,把bi ...
- [Nest] 01.初见nest.js
github nest 介绍 Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架.它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人 ...
- spark Association failed with [akka.tcp:sparkMaster@ip:7077]
今搭建spark集群, conf/spark-env.sh 配制如下 export SPARK_MASTER_IP=masterexport SPARK_MASTER_PORT=7077export ...
- akka简单示例-1
刚刚开始接触akka,网上找了2个简单示例,并在公司运营机器上尝试,踩了一些坑,在此记录. 1. 本地hello world [torstan@sparkb5-i ~/akka_example/hel ...
- AKKA学习笔记
AKKA学习笔记总结 01. AKKA 1. 介绍: Akka基于Actor模型,提供了一个用于构建可扩展的(Scalable).弹性的(Resilient).快速响应的(Responsive)应用程 ...
- Akka(13): 分布式运算:Cluster-Sharding-运算的集群分片
通过上篇关于Cluster-Singleton的介绍,我们了解了Akka为分布式程序提供的编程支持:基于消息驱动的运算模式特别适合分布式程序编程,我们不需要特别的努力,只需要按照普通的Actor编程方 ...
- Akka(36): Http:Client-side-Api,Client-Connections
Akka-http的客户端Api应该是以HttpRequest操作为主轴的网上消息交换模式编程工具.我们知道:Akka-http是搭建在Akka-stream之上的.所以,Akka-http在客户端构 ...
- (转)akka Router实例
通常在分布式任务调度系统中会有这样的需求:一组actor提供相同的服务,我们在调用任务的时候只需要选择其中一个actor进行处理即可. 其实这就是一个负载均衡或者说路由策略,akka作为一个高性能支持 ...
随机推荐
- 《Cron表达式详解》
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth Month ...
- Yii2.0 安装yii2-queue并在Linux启动守护进程监听消息
一.什么是yii2-queue? Yii2-queue是Yii2.0 PHP框架下一个消息队列拓展插件,支持基于DB, Redis, RabbitMQ, AMQP, Beanstalk 和 Gearm ...
- nginx的安装及简单负载均衡配置
Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性.本人目前所在公司也使用nginx,主要用来做负载均衡服务器.同时也可以作为邮件代理服务器. 1. nginx的安装.本 ...
- CODESOFT条码设计软件如何隐藏数据源方法
作为强大的条码标签设计软件,用户在用CODESOFT设计条码标签时,有时需要根据实际情况,将条码数据源隐藏,也就是使设计与打印出来的条形码下不带有数据.那么这要怎么在CODESOFT中实现呢?下面,小 ...
- TP5.1:连接数据库(全局配置、动态配置、DSN配置)
前提: (1)在app\index\controller文件下新建一个名为Connect.php的控制器文件 (2)建立一个名为user_curd数据库,里面有一张user表,表内容为: 通过全局配置 ...
- April 15 2017 Week 15 Saturday
Attitude is a little thing that makes a big difference. 小态度,大不同. Attitudes can make a big difference ...
- 在写EF 时把时间格式化的做法
SELECT COUNT(l.LogSeq), date_format(l.CreateDate,'%Y-%m') CreateDateByMonth FROM LOL l WHERE l.Creat ...
- CPU体系结构
http://blog.csdn.net/liuxc0116/article/details/17004313 1.算术逻辑单元ALU(Arithmetic Logic Unit)ALU是运算器的核心 ...
- 2017.10.28 针对Java Web应用中错误异常处理方法的运用
针对Java Web应用中错误异常处理方法的运用 在javaweb中其异常都需要对Checked Exception之下的Exception进行继承,并且有选择地对发生的错误和异常进行处理.Java同 ...
- 当Java遇见了Html--Jsp详解篇
###一.什么是Jsp jsp是一种基于文本的程序,全名java server page,其特点是html和java程序共存.执行时jsp会被运行容器编译,编译后的jsp跟servlet一样,因此js ...