最近在一些服务中使用了akka,主要用来做异步解耦和本地消息分发(路由),这里简单总结一下用法.

与spring集成

网上有不少集成的例子,要使用到spring的扩展.

我这边没有这样处理,而是简单把ActorSystem创建的actor的过程放在了spring configuration里,把ActorRef作为bean,毕竟actor本身不能为单例但是ref可以.

actor要使用一些bean的话就全部都由构造函数传入.

如下:

public class UserActor extends AbstractLoggingActor {

    private UserService userService;

    public static Props props(UserService userService) {
return Props.create(UserActor.class, () -> new UserActor(userService));
} public UserActor(UserService userService) {
this.userService = userService;
}

在java中使用

使用中能感觉和java还是有些隔阂的...

特别是容器(Collection)之间的转换和处理.

给出一些例子,可能是我没发现更方便的写法..

List<Routee> routees = new ArrayList<>();
senders.forEach(e -> {
try {
ActorRef ref = getContext().actorOf(createdProps.apply(e), prefix + "-" + e.getId());
routees.add(new ActorRefRoutee(ref));
} catch (InvalidActorNameException ex) {
log().error(ex, "name already in use");
}
});
router = new Router(new RoundRobinRoutingLogic(), routees);

这边本来用一个map就能解决了,但会要求类型强转Router的第二个参数是java.lang.Iterable<Routee>而不是java.lang.Iterable<? extends Routee>(ActorRefRoutee是其子类),再加上还要处理重名错误,还是用了这种错误的forEach使用方式.

    private void stopRoutee(Router router) {
List<Routee> routees = new ArrayList<>(seqAsJavaList(router.routees()));
routees.forEach(e -> {
ActorRefRoutee ae = (ActorRefRoutee) e;
ActorRef ref = ae.ref();
// 移除这个routee
router.removeRoutee(ae);
// 停止这个ref
context().stop(ref);
});
}

router.routees()返回的是个IndexSeq...和java的没有兼容和对应.

最开始找了一些,后来发现有scala.collection.JavaConversions可以做兼容...感受到了隔阂.

此外ask模式,akka为java提供了PatternsCS.这个类返回的是java的CompletionStage类型相比Patterns,比较友好.

使用误区

最容易误用的一点就是消息处理中有阻塞操作,比如直接在actor中进行数据库操作和处理网络请求,而使用的actor也没有和线程绑定,这种情况需要使用额外的线程池,这个其实和用netty是一样的情况,用来进行应用调度的线程数有限.

由于上面提到的点,于是在actor内可能就会存在一些回调,一不小心就可能直接调用/改变actor内部的状态(例如在回调直接访问field).

private List<String> list;
... ...
public Receive createReceive() {
return receiveBuilder()
.match(Message.class, e -> xxxx.onSuccess(r -> list.add(r)))
... ...

这样等于内部状态被多线程访问,破坏了actor内部的状态,正确的做法是在回调中给自己发送消息.

Akka实践一些总结的更多相关文章

  1. 《Akka应用模式:分布式应用程序设计实践指南》读书笔记9

    性能 这也是一个比较大的问题,因为性能不一定是Akka本身的问题,还可能是你代码写的有问题. 优化的第一步就是找出性能的瓶颈,隔离出应用程序里面比较耗时的部分,然后尝试对其优化,减少需要耗费的时间成本 ...

  2. DCOS实践分享(4):如何基于DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)

    这篇文章入选CSDN极客头条 http://geek.csdn.net/news/detail/71572 当前,要保证业务的市场竞争力,仅靠设计一个可用并且好看的产品,已经完全不能满足要求.全球消费 ...

  3. 翻译:AKKA笔记 - Actor消息 -1(二)

    消息 我们只是让QuoteRequest到ActorRef去但是我们根本没见过消息类! 它是这样的: (一个最佳实践是把你的消息类包装在一个完整的对象里以利于更好的组织) TeacherProtoco ...

  4. akka笔记

    Actor UntypedActor actor的基类,继承并实现onReceive方法就可以得到一个Actor. Props 配置类,用Props.create可以创建一个按指定配置生成的Actor ...

  5. Scala的Actor模式 & Akka框架

    今天学Spark的时候,看到Scala的actor模式是一个加分点.所以搜了一下,看了.主要参考下面两篇文章,还没有实验,有些地方领会的不深刻: http://nxlhero.blog.51cto.c ...

  6. Akka Cluster简介与基本环境搭建

      akka集群是高容错.去中心化.不存在单点故障以及不存在单点瓶颈的集群.它使用gossip协议通信以及具备故障自动检测功能. Gossip收敛   集群中每一个节点被其他节点监督(默认的最大数量为 ...

  7. 【原创】大叔经验分享(17)编程实践对比Java vs Scala

    scala 官方地址 https://www.scala-lang.org/ 本文尽可能包含了一些主要的java和scala在编程实践时的显著差异,展现scala的代码的简洁优雅:scala通吃< ...

  8. Akka系列---什么是Actor

    本文已.Net语法为主,同时写有Scala及Java实现代码 严肃的说,演员是一个广泛的概念,作为外行人我对Actor 模型的定义: Actor是一个系统中参与者的虚拟人物,Actor与Actor之间 ...

  9. [转] Akka实战:构建REST风格的微服务

    [From] http://www.yangbajing.me/2015/11/27/akka%E5%AE%9E%E6%88%98%EF%BC%9A%E6%9E%84%E5%BB%BArest%E9% ...

随机推荐

  1. Java自学教程视频

    BAT大咖助力 全面升级Android面试 BAT大牛亲授 基于ElasticSearch的搜房网实战 从天气项目看Spring Cloud微服务治理 Java企业级电商项目架构演进之路  Tomca ...

  2. Heap

    #include using namespace std; int heap[100010],cnt=0; void put(int x) { cnt++; heap[cnt]=x; int now= ...

  3. php中的session_id详解

    php中session_id()函数原型及说明session_id()函数说明:stringsession_id([string$id])session_id() 可以用来获取/设置 当前会话 ID. ...

  4. require.js配置路径的用法和css的引入

    前端开发在近一两年发展的非常快,JavaScript作为主流的开发语言得到了前所未有的热捧.大量的前端框架出现了,这些框架都在尝试着解决一 些前端开发中的共性问题,但是实现又不尽相同.通常一般的前端加 ...

  5. 深入理解SpringBoot之自动装配

    SpringBoot的自动装配是拆箱即用的基础,也是微服务化的前提.其实它并不那么神秘,我在这之前已经写过最基本的实现了,大家可以参考这篇文章.这次主要的议题是,来看看它是怎么样实现的,我们透过源代码 ...

  6. Math对象中比较常用的计算数学相关的三个方法

    Math类中提供了三个与取整有关的方法:ceil.floor.round,这些方法的作用与它们的英文名称的含义相对应,例如: ceil的英文意义是天花板,该方法就表示向上取整,所以,Math.ceil ...

  7. 什么是web service ?

    一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...

  8. SpringMVC中的文件上传

    1. 配置图片服务器 一般图片会单独保存在图片服务器上, 本文为简化处理, 在Tomcat中配置一个路劲用于专门存放图片 在tomcat上配置图片虚拟目录,在tomcat下conf/server.xm ...

  9. sqlserver两种分页方法比较

    -- 3000 page(从1开始) 10 pagesize -- 方法1(效率不高): SELECT TOP 10 * FROM [xxx].[oooo] WHERE id NOT IN (SELE ...

  10. CentOS6.7 mysql5.6.33修改数据文件位置

    问题:mysql存放的数据文件,分区容量较小,目前已经满,导致mysql连接不上, 解决方案: 1.删除分区里一个不需要用的数据,如:日志文件等(解决不了根本问题) 2.对某个磁盘扩容 3.修改数据存 ...