性能

  这也是一个比较大的问题,因为性能不一定是Akka本身的问题,还可能是你代码写的有问题。

  优化的第一步就是找出性能的瓶颈,隔离出应用程序里面比较耗时的部分,然后尝试对其优化,减少需要耗费的时间成本。其实有时候对性能进行度量往往比优化性能还重要,因为你在度量性能的时候,已经在思考哪些可能是性能瓶颈了,这过程中就会不由自主的对其进行了优化。性能测试往往是找出那些超出预期的性能问题。

隔离瓶颈

  性能优化的第一步就是识别瓶颈,这是一个技术活。

优化Akka

  只有在确定了是Akka的问题之后再动手优化Akka,但大部分情况优化的都是业务逻辑和代码逻辑,跟Akka本身关系不大。

减少或隔离阻塞型操作

  个人感觉使用Akka就一定要遵守Actor模型的几个约束,其中一个很重要的约束就是每条消息处理一定要快,且最好是异步通信。这一点对于Akka新手来说,并不太好理解,或者理解的不够深刻。如果一个操作耗时不长,就没必要用Actor模型了,如果耗时太长,Actor又要求尽量要快,这不就是矛盾么?还要Akka干啥。其实这是我刚开始学Akka时候的疑问和不解。不过用下来才发现,如果你有一个目标:Actor消息处理一定要快。你就会无形中对一个操作尽可能的拆分,使其异步、短小,当然了带来的问题就是消息类型比较复杂。

  使用Akka时,不可避免的用到JDBC或文件等IO操作,这类操作有可能很慢且都是阻塞性操作,但并不代表不能把他设计成异步、非阻塞的。比如有一个流程如下:1.写数据库;2.写入成功后执行后续操作。我们往往是同步、阻塞的操作,但其实可以用future或异步JDBC将其拆分成两步:写数据库、成功后执行操作。比如把写入消息发送给单独的actor,该actor收到写入消息,对其进行写入然后把结果异步的返回给原来的actor,原actor收到写入成功的消息后执行后续操作。虽然并不一定解决阻塞的问题,但把阻塞的问题进行了隔离,因为阻塞只有在数据库actor才会有。但原actor却可以处理更多的消息。由于写数据库相关的消息都被封装到单独的actor,那么我们可以采取批量的方法,把数据插入数据库,以提高插入的性能和吞吐量。如果还与原actor的业务逻辑混到一块,就很难优化了。

  再进一步,还可以将插入数据库的actor放到单独的派发器,提高原actor的并发量。

缩短消息处理时间

  这和你显然是一句废话。但确实一个优化的方向,如何缩短呢?还是那个“分而治之”的思想,具体的方法大家就各自参悟吧,^_^。

增加处理消息的actor

  这其实也是一个好方法,无形中增加了并行数量。当然前提是各个actor没有争用资源,即使有争用也要对其进行解耦,减少争用时间和范围。Akka集群中增加actor数量,还可以充分利用各个节点的资源。当然了,这会增加系统的复杂性,不过使用Akka本身就是解决复杂系统的,简单的系统用Akka好像没啥必要。

派发器

  派发器是优化Akka的关键组件。这一点需要对派发器有深入的理解,刚开始时候我并没有认识到这一点,导致系统性能不太好。关于派发器建议大家读一下官方的文档。

标准派发器

  这是最常用、通用的派发器。默认是fork-join。还可以配置成thread-pool的形式。不过具体情况可以具体分析。但要认识到线程的让步都会执行一次上下文的切换,如果经常发生切换,对于系统来说是一个比较昂贵的开销。你看其他语言创建了自己的线程调度器就知道优化的必要了。

固定派发器

  固定派发器不再为actor使用线程池,而是每个actor分配一个固定线程,这样就不会有上下文切换的问题了。这种只对actor比较少的系统有用。

平衡派发器

  平衡派发器通过使用共享邮箱来执行这样的重分配操作。不常用,就不分析了。

calling-thread派发器

  主要用于测试。它不会分配线程池,所有操作都在发送消息的同一个线程上执行。

何时使用单独的派发器

  根据我的经验来看,前期不要考虑这个问题,先实现业务逻辑,等有性能问题的时候再考虑。但有一个却可以提前考虑,那就是与数据库相关的阻塞操作可以使用单独的派发器,这样不会影响原有actor的线程吞吐量。

提高并行性

  提高并行性是对业务的优化,就是提前考虑算法能否用“分而治之”的思想进行拆分,然后并行处理。但并不是所有的算法都能拆分,这点就靠大家自行分析了。

结论

  Akka是一个好的框架,它基本考虑了分布式 环境下遇到的所有方面的问题。Akka的很多高级特性都是基于最基础的Actor模型,可以使用它构建高并发、稳定的分布式系统,但有一点大家需要注意。Akka是一个分布式框架,系统的很多功能都需要自行设计,而且系统的稳定性和质量都取决于有没有合理的使用Actor模型。该书虽然描述了最重要的actor模式,但并不详细,很多章节都需要我们根据自己的实际场景来设计的。目前并没有关于Akka最佳实践的材料,即使有也都在各公司内部。所以我准备在未来的时间内写一点关于Akka最佳实践的博客,希望大家捧场。

《Akka应用模式:分布式应用程序设计实践指南》读书笔记9的更多相关文章

  1. HTTP权威指南读书笔记

    HTTP权威指南笔记 读书有两种境界,第一种境界是将书读薄,另一种是读厚.本篇文章就是HTTP权威指南的读书笔记,算是读书的第一重境界,将厚书读薄.文章对HTTP的一些关键概念做了比较详细的概述,通读 ...

  2. css权威指南读书笔记

    今天翻手机,翻到了许久之前看css权威指南时的笔记,遂移到博客中来. 1.属性选择器p.one class名为one的p元素p[class][name] 含有class和name属性的p元素p[cla ...

  3. 经典的性能优化最佳实践 web性能权威指南 读书笔记

    web性能权威指南 page 203 经典的性能优化最佳实践 无论什么网络,也不管所用网络协议是什么版本,所有应用都应该致力于消除或减 少不必要的网络延迟,将需要传输的数据压缩至最少.这两条标准是经典 ...

  4. css权威指南读书笔记-第10章浮动和定位

    这一章看了之后真是豁然开朗,之前虽然写了圣杯布局和双飞翼布局,有些地方也是模糊的,现在打算总结之后再写一遍. 以下都是从<css权威指南>中摘抄的我认为很有用的说明. 浮动元素 一个元素浮 ...

  5. Hadoop权威指南读书笔记

    本书中提到的Hadoop项目简述 Common:一组分布式文件系统和通用I/O的组件与接口(序列化.javaRPC和持久化数据结构). Avro:一种支持高效.跨语言的RPC以及永久存储数据的序列化系 ...

  6. JavaScript权威指南读书笔记

    JavaScript 1.变量 变量是一个表示值的符号,是一个名字,他的本质是值: var x; //----声明一个变量: 值通过等号“=”赋给变量,x = 16; 对象是名/值对的集合,或字符串到 ...

  7. Java性能优化权威指南-读书笔记(五)-JVM性能调优-吞吐量

    吞吐量是指,应用程序的TPS: 每秒多少次事务,QPS: 每秒多少次查询等性能指标. 吞吐量调优就是减少垃圾收集器消耗的CPU周期数,从而将更多的CPU周期用于执行应用程序. CMS吞吐调优 CMS包 ...

  8. Java性能优化权威指南-读书笔记(四)-JVM性能调优-延迟

    延迟指服务器处理一个请求所花费的时间,单位一般是ms.s. 本文主要讲降低延迟可以做的服务器端JVM优化. JVM延迟优化 新生代 新生代大小决定了应用平均延迟 如果平均Minor GC持续时间大于应 ...

  9. Java性能优化权威指南-读书笔记(三)-JVM性能调优-内存占用

    新生代.老年代.永久代的概念不多说,这三个空间中任何一个不能满足内存分配请求时,就会发生垃圾收集. 新生代不满足内存分配请求时,发生Minor GC,老年代.永久代不满足内存分配请求时,发生Full ...

  10. Java性能优化权威指南-读书笔记(二)-JVM性能调优-概述

    概述:JVM性能调优没有一个非常固定的设置,比如堆大小设置多少,老年代设置多少.而是要根据实际的应用程序的系统需求,实际的活跃内存等确定.正文: JVM调优工作流程 整个调优过程是不断重复的一个迭代, ...

随机推荐

  1. Docker从入门到实践

    一般说来 SPA 的项目我们只要启一个静态文件 Server 就可以了,但是针对传统项目就不一样了,一个项目会依赖很多服务端程序.之前我们的开发模式是在一台开发机上部署开发环境,所有人都在这台开发机上 ...

  2. dock helloworld

    Docker Hello World Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序. 输出Hello world runoob@runoob: ...

  3. 升级 HTTPS,价值何在?

    HTTPS 实质上是一种面向安全信息通信的协议.从最终的数据解析的角度上看,HTTPS 与 HTTP 没有本质上的区别.对于接收端而言,SSL/TSL 将接收的数据包解密,将数据传给 HTTP 协议层 ...

  4. [国家集训队2010]小Z的袜子

    ★★★   输入文件:hose.in   输出文件:hose.out   简单对比 时间限制:1 s   内存限制:512 MB [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜 ...

  5. 【BZOJ4514】数字配对(费用流)

    题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci× ...

  6. 用XAMPP+Wordpress搭建个人博客

    http://biancheng.dnbcw.info/php/456308.html http://jingyan.baidu.com/article/f71d60376ba9571ab641d11 ...

  7. Mysql 使用delete drop truncate 删除数据时受外键约束影响解决方案

    先禁用数据库的外键约束: set foreign_key_checks=0; 进行删除操作 delete.drop.truncate 恢复数据库外键约束: set foreign_key_checks ...

  8. SAP Portal 上传资源到WRR

    Uploading Resources to the Web Resource Repository Prerequisites You have been assigned the Content ...

  9. 模拟赛 Problem 2 不等数列(num.cpp/c/pas)

    Problem 2 不等数列(num.cpp/c/pas) [题目描述] 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”.问在所有排列中,有多少个排列恰好有 ...

  10. POJ 2485 Highways &amp;&amp; HDU1102(20/200)

    题目链接:Highways 没看题,看了输入输出.就有种似曾相识的感觉,果然和HDU1102 题相似度99%,可是也遇到一坑 cin输入居然TLE,cin的缓存不至于这么狠吧,题目非常水.矩阵已经告诉 ...