最近在一些服务中使用了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. sharesdk for android集成调试的几个问题

    1.一定要下载最新版,这个东西目前版本升级很频繁,证明产品本身还不稳定,最新版bug会少一点 2.下载最新版SDK的时候,跟随下载最新Sample,官网文档的示例代码及时性很差. 3.调试的几个Key ...

  2. python3学习笔记3---引用http://python3-cookbook.readthedocs.io/zh_CN/latest/

    2018-03-01数据结构和算法(3) 1.11 命名切片 假定你有一段代码要从一个记录字符串中几个固定位置提取出特定的数据字段(比如文件或类似格式): ###### 012345678901234 ...

  3. Windows下对拍

    What is 对拍 Tool: 你的程序 可以输出正解的暴力程序 数据生成器 输出对比器 RP 用来干什么? 用来造数据,检验你的程序的正确性,以方便修改和出现未考虑到的情况 如何工作? 数据生成器 ...

  4. linux配置https站点

    配置https站点呢,那就需要https证书,证书从何而来,花钱买?no,no,no,阿里有免费的,只是比较难发现,下面就图文解说一下怎么买免费的阿里https证书 首先阿里云,登录,购买链接———— ...

  5. 洛谷 P2725 解题报告

    P2725 邮票 Stamps 题目背景 给一组 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K -- 表示信封上能够贴 K 张邮票.计算从 1 到 M 的最大连续可贴出的邮资. 题目描 ...

  6. wireshark使用方法

    抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接口.点击Capture Opti ...

  7. MyBatis缓存详解

    MyBatis缓存分为一级缓存和二级缓存 http://www.cnblogs.com/zemliu/archive/2013/08/05/3239014.html mybatis 二级cache h ...

  8. 最值得收藏的java技术博客(Java篇)

    第一个:java_my_life 作者介绍:找不到原作者信息.大概做了翻阅全部是2012年的博客. 博客主要内容:主要内容是关于Java设计模式的一些讲解和学习笔记,在相信对学习设计模式的同学帮助很大 ...

  9. Mysql 30条军规

    一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...

  10. [ Java面试题 ]持久层篇

    1.什么是ORM?  对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术: 简单的说,ORM是通过使用描 ...