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