关于akka
akka是JAVA虚拟机JVM平台上构建高并发、分布式和容错应用的工具包和运行时。Akka用Scala语言写成,同时提供了Scala和JAVA的开发接口。
Akka处理并发的方法基于Actor模型。在Akka里,Actor之间通信的唯一机制就是消息传递。
Akka集群支持去中心化的基于P2P的集群服务,没有单点故障(SPOF)问题,它主要是通过Gossip协议和向量时钟(VECTOR CLOCKS)来实现。对于集群成员的状态,Akka提供了一种故障检测机制,能够自动发现出现故障而离开集群的成员节点,通过事件驱动的方式,将状态传播到整个集群的其它成员节点。
集群概念
• 节点(node):集群中的逻辑成员。允许一台物理机上有多个节点。由元组hostname:port:uid唯一确定。
• 集群(cluster):由成员关系服务构建的一组节点。
• 领导(leader):集群中唯一扮演领导角色的节点。
• 种子节点(seed node):作为其他节点加入集群的连接点的节点。实际上,一个节点可以通过向集群中的任何一个节点发送Join(加入)命令加入集群。
节点状态
关于节点迁移的状态转换,如图所示:
上图展示了状态转换的两个因素:动作和状态。
状态
• joining:节点正在加入集群时的状态。
• weekly up:配置了akka.cluster.allow-weakly-up-members=on时,启用的状态。
• up:集群中节点的正常状态。
• down:标记为已下线的状态。
• removed:墓碑状态,表示已经不再是集群的成员。
动作
• join:加入集群。
• leave:告知节点优雅的离开集群。
• down:标记集群为已下线。
akka集群demo
官方demo可参见:
自己的demo:
基于akka2.5.2官方的demo,结合业务上的需求,搭建了akka集群,
共分为两部分。第一部分为akka-client,负责消息的发送,第二部分
是akka-cluster,该集群包含seed-node,以及接收客户端发送消息
并进行路由的dispatcher。
使用
akka-cluster依赖akka-client,在akka-cluster中运行org.jrocky.akka.cluster.ClusterRunner,启动集群。
在akka-client中运行org.jrocky.akka.client.demo.Runner,向集群
发送消息,观察log如下图所示:
集群接收到来自akka-client Runner发送的消息
客户端接收到来自集群的消息反馈