akka并发通信、actor模型的理解

1、利用akka进行多节点分布式通信 

val ROLE="follower"
//读取配置信息
val config=ConfigFactory.load("Actors.conf");
//创建ActorSystem,指定系统名称,所有节点上的actor所在的系统名必须相同
val actorSystem=ActorSystem("Megalith",config.getConfig(ROLE))
val Follower=actorSystem.actorOf(Props(new Follower()),ROLE)
//发消息
Follower ! "start"
actorSystem.awaitTermination()

//在actor组Megalith中查找指定地址和端口的名为role的actor,获取远程actor的引用
val actor=context.actorSelection(s"akka.tcp://Megalith@$IP:$Port/user/"+role)
//发送封装了数据的caseclass,注意caseclass必须继承Serializable
actor ! MyCaseClass(1,2,3)

2、actor模型特点

  • 每个actor独占一个线程
  • 每个actor的数据都由自己维护,不被其他actor修改
  • actor收到的消息都会存在FIFO的邮箱中,依次使用onReceive()处理。
  • actor向其他actor发送信息通常是异步非阻塞的

3、actor模型与多线程模型的区别

共同点:actor模型中,每个actor也是独占一个线程,可以独立执行任务

核心区别:

  • actor模型:线程间通过发送异步消息进行通信
  • 多线程模型:线程间通过主线程传入的共享对象通信

由于多线程的通信媒介的数据是共享的(堆内存的一片区域),因此会有锁的问题,且多线程必须在同一进程中。

而actor的数据都是各自独有的,因此可以分布在不同进程甚至不同服务器上,从而真正实现分布式作业。

 

你可能感兴趣的:(java)