美文网首页
Akka Extensions

Akka Extensions

作者: Queen〇fLaponia | 来源:发表于2020-02-02 21:53 被阅读0次

  如果你想在Akka之上添加feature,一个优雅灵活的工具是Akka Extensions,它属于Utilities实用工具集。Extensions 包括两个构件:Extension 和 ExtensionId[T <: Extension] —— 后者用于对接你的T和Akka Extensions.

百望山 若无闲事挂心头,便是人间好时节

  Extension是单例/ActorSys(不是集群单例,是本地单例)、每ActorSystem只加载一次,需要自己保证线程安全,注意它是由Akka托管的。可以配置你的Extension是按需加载还是随ActorSystem的创建自动加载

  你需要先定义你的业务T:Extension,为了让应用能找到你的Extension还需要创建一个ExtensionId,酌情实现三个模板方法:

  1)lookup方法:用于定位ExtensionId、返回自身即可,这样当ActorSystem启动时即可找到Extension ;

  2)createExtension方法:供Akka调用、实例化我们的Extension;

  3)供Java调用的get方法,用于获取Extension实例,可以不写;

2020-02-02

  使用时只要调用ExtensionId(actorSys)即可得到Extension、之后调用你的业务方法即可,在actor内部亦可使用,实际上Extensions的基本意图就是为系统内actor提供一个方便的可供调用的业务单例,扩展用法可以说就随心所欲了。这个单例内的方法不适合actor style实现,比如需要实现一个long running 的Server,监听端口,以IO TCP为例:

    object Tcp extends ExtensionId[TcpExt] with ExtensionIdProvider;

    class TcpExt(system: ExtendedActorSystem) extends IO.Extension

  使用时借助akka.io.IO工具对象:IO(Tcp)直接得到TcpExt(通过ExtensionId.apply方法),IO工具对象做了两点定制:

  1、单独实现了自己的IO.Extension extends akka.actor.Extension ,很简单只是定义了一个manager: ActorRef,Akka IO对所有IO交互协议都要求必须具备唯一的manager Actor;

  2、IO对象的apply方法直接返回这个manager Actor.

  实际上我们在开发actor项目的时候,我们不止需要actor style部分,我们还不能完全扔掉传统程序,有可能会遇到两种特殊需求:

  1、需要一个long running Server:至少得有一个线程监听端口,同时它还要能无缝地与ActorSys打交道、与各个actor通讯、反之各个actor也要能够与它通讯,它充当actorSys与外部系统之间通讯的桥梁;

  2、需要在actor中动态控制一个Server,但是又不能阻塞这个actor;

  Extension就可以实现这种需求,而且它实际上很灵活:The sky is the limit! By the way, did you know that Akka’sTyped Actors,Serializationand other features are implemented as Akka Extensions?

  比如我们要实现自己的某种Server,也可以按照Extension 方式来实现,比如ChanaMQ的Amqp Server.  实现方式除了Extensions还有一种,那就是在引导程序部分来做,也就是在创建ActorSystem的Main程序中,除了启动ActorSystem,还可以启动其他Server.

  把应用特定配置作为Akka配置的例子:

这是一段应用myapp独有的配置

我们可以写一个如下的Extension :

系统中的任何actor都可以十分方便地拿配置

  再为它写一个如下ExtensionId :

ExtensionId是面子、Extension是里子;面子千篇一律、里子才是你的内容; 在actor中就可以用了,不用你说我也知道这很鸡肋其实你可以直接:system.settings.config.getConfig("myapp");这个例子只是给你演示在你的actor中可以随时随地访问Extension

  还有一种情况是一些第三方库可以利用这个机制默认直接注册到ActorSys,启动即加载:

        akka.library-extensions += "docs.extension.ExampleExtension"

GP项目脚本单独启动一个master时的重要输出:

listening on addresses :[akka.tcp://master@127.0.0.1:3000]

InMemoryKVService: We cannot find group gearpump_kvservice_master_group

AppManager: Application Manager started. Ready for application submission...

ClusterSingletonProxy: Singleton identified at [akka://master/user/singleton/masterwatcher/master]

相关文章

网友评论

      本文标题:Akka Extensions

      本文链接:https://www.haomeiwen.com/subject/avvesftx.html