关于akka:Flink之再说组件通信
组件间的近程通信、组件内的本地通信以及组件内的状态在并发状况下的保护,都是基于Akka Actor来实现的 1、Akka与Actor模型Akka是构建高并发、分布式、可扩大利用的框架。Akka让开发者只须要关注业务逻辑,不须要写底层代码来反对可靠性、容错和高性能。Akka带来了诸多益处,比方 : 提供新的多线程模型,不须要应用低级的锁和原子性的操作来解决内存可见性问题提供通明的近程通信,不再须要编写和保护简单的网络代码提供集群式、高可用的架构,不便构建真正的响应式模式的利用Akka是基于Actor模型实现的,Actor模型相似于Erlang的并行模型,能使实现并发、并行和分布式应用更加简略Actor是Actor模型中最重要的形成局部,作为最根本的计算单位,能接管音讯并基于其执行计算。 每个Actor都有本人的邮箱,用来存储接管到的音讯。每个Actor维持公有的状态,来实现Actor之间的隔离每个Actor都是由单个线程负责从各自的邮箱拉取音讯,并间断解决接管到的音讯。对于接管到的音讯,Actor能够更改其外部的状态,或者将其传给其余Actor,或者创立新的ActorActorSystem是Actor的工厂和管理者。ActorSystem会为其Actor提供调度、配置和日志等公共服务。多个ActorSystem能够共存于同一台机器中。如果一个ActorSystem是以RemoteActorRefProvider的形式启动的,则它能够被近程ActorSystem拜访到。ActorSystem能主动判断Actor音讯是出自同一个ActorSystem的Actor还是来自近程ActorSystem的Actor。本地的Actor间通信,音讯通过共享内存传递;而近程的Actor间通信,音讯通过网络栈传递2、理解Actor的创立、启动以及音讯的发送Server端RemoteServerActor通过继承AbstractActor来实现Actor,并实现AbstractActor的 createReceive办法,来实现接管到音讯的解决逻辑 : 接管到String的音讯,将音讯内容打印到控制台。 public class RemoteServerActor extends AbstractActor { @Override public Receive createReceive() { return receiveBuilder() .match(String.class, message-> { System.out.println(message); }) .build(); }}RemoteServerActorLauncher类首先通过加载remote.conf的配置(其中配置的provider为 RemoteActorRefProvider),来创立名为remote、反对近程通信的ActorSystem;再通过 actorSystem调用actorOf办法创立并启动名为remoteServerActor的Actor实例,并返回Actor地址 (ActorRef);最初通过ActorRef调用tell办法向RemoteServerActor发送音讯 RemoteServerActorLauncher启动Actor和发送音讯 public class RemoteServerActorLauncher { public static void main(String[] args) { Config config = ConfigFactory.load("remote.conf"); ActorSystem actorSystem = ActorSystem.create("remote", config); ActorRef actor = actorSystem.actorOf(Props.create(RemoteServerActor.class), "remoteServerActor"); actor.tell("hello!", ActorRef.noSender()); } }remote.conf配置 : akka { actor { provider = "akka.remote.RemoteActorRefProvider" } remote { enabled-transports = ["akka.remote.netty.tcp"] netty.tcp { hostname = "127.0.0.1" port = 50050 } } }在这个示例中,整个Actor创立与音讯发送的流程具体步骤如下 : 1) 创立近程的ActorSystem2) 创立并启动RemoteServerActorLauncher实例,返回ActorRef,创立音讯并通过ActorRef发送音讯3) ActorRef将音讯委托给Dispatcher发送到Actor4) Dispatcher把音讯暂存在邮箱中,Dispatcher中封装了一个线程池,用于音讯派发,实现异步音讯发送的成果5) 从邮箱中取出音讯,委派给RemoteServerActorLauncher中通过createReceive办法创立的Receive实例来解决 ...