@xtccc
2017-01-17T14:52:27.000000Z
字数 1860
阅读 3473
Akka
参考链接:
目录:
Akka remoting告诉actor system:
a). 我希望你在一个remote host上创建一个actor
val ref = system.actorOf(FooActor.props.withDeploy(Deploy(scope = RemoteScope(address))))
或者
b). 我希望得到一个remote host上已有actor的reference:
val remoteFooActor = context.actorSelection("akka.tcp://actorSystemName@10.0.0.1:2552/user/fooActor")
Akka remoting实在是太具体的一个操作了,因为你得指定remote host的IP,但是我们一般并不太关心在哪个remote host上创建actora —— 我们希望能在云中创建一个actor就行了。
Clustering则允许你在一个cluster中创建actor,而不需要指定该actor到底在哪个node上运行(该cluster中的所有nodes都共享同一个actor system)。
参考 :
在启动actor之前,在配置文件application.conf里面填入akka.cluster.seed-nodes
,然后该actor启动之后,就会自动加入到对应的nodes中。当然,前提是这些seed nodes要已经在运行(特别是第一个seed node必须在运行)。
当某个actor启动之后,也可以通过代码来加入到一个指定的node:
Cluster(context.system).join(Address("akka.tcp", systemName, ip, port)
或者加入若干个nodes
Cluster(context.system).joinSeedNodes(nodes_list)
如果某个actor在启动时没有为它配置seed-node,那么它首先要加入自己,然后才能加入指定的seed node。
如果当前actor已经加入了某个node a,但是这时它想加入到另外一个node b(例如a挂掉了):
Cluster(context.system).join(Address("akka.tcp", systemName, b-ip, b-port)
此时,actor会脱离node a(即使node a 仍然在正常运行),然后加入到node b。
假设Actor X 加入了2个seed nodes: A和B。
那么,当A挂掉时,X会收到有限的几条消息:
Association with remote system [akka.tcp://XiaoTao@127.0.0.1:3100] has failed
虽然A挂掉了,但是B还在运行,所以X仍然在cluster中正常运行。
但是如果此时B也挂掉了,那么X就会一直收到消息:
Association with remote system [akka.tcp://XiaoTao@127.0.0.1:3200] has failed
因为最后一个seed node也挂了,X此时就不能在集群中了。
现在,A和B这两个seed nodes都挂了,actor X也会不断地收到错误消息。
如果A恢复呢?一旦A恢复,就会看到X的错误消息就停止输出,X也能正常与A进行通信。并且,在A崩溃期间内如果X在给A发送消息的话,那么当A恢复后,这些积累的消息并不会被A收到。