性能

  这也是一个比较大的问题,因为性能不一定是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. airfoil polar data during post stall stages (high AOA)

    airfoil polar data during post stall stages (high AOA) Table of Contents 1. airfoil polar during pos ...

  2. [UOJ48] 核聚变反应强度

    QUQ 思路 求出a1的所有约数,与a1.ai放入同一数组: 求出gcd(a1,ai): 枚举约数,得出ans; 代码实现 #include<cmath> #include<cstd ...

  3. 通过代码学习python之@property,@staticmethod,@classmethod

    URL: https://www.the5fire.com/python-property-staticmethod-classmethod.html #coding=utf-8 class MyCl ...

  4. Hadoop2.0之开启日志

    配置 修改 mapred-site.xml <property> <name>mapreduce.jobhistory.address</name> <val ...

  5. Html5离线缓存简介

    一. 什么是manifest 首先manifest是一个后缀名为minifest的文件,在文件中定义那些需要缓存的文件,支持manifest的浏览器,会将按照manifest文件的规则,像文件保存在本 ...

  6. VCS 一次使用。

    One database was down today. So I login the server try to check and fix it. I found the Oracle home ...

  7. Canopy算法计算聚类的簇数

    Kmeans算是是聚类中的经典算法.步骤例如以下: 选择K个点作为初始质心 repeat 将每一个点指派到近期的质心,形成K个簇 又一次计算每一个簇的质心 until 簇不发生变化或达到最大迭代次数 ...

  8. 在psql客户端中修改函数

    \ef 创建一个新的函数. \df 显示已经创建的函数. \df+    somefunc 显示这个函数的详细定义 \ef   somefunc 编辑这个函数, 编辑保存退出之后,要执行 \g ,刚才 ...

  9. androidannotations的background和UiThread配合使用參考

    简单介绍 androidannotations在开发中的代码规范思考:(MVC思考)时间太紧,先贴代码: Activity的代码: package edu.njupt.zhb.main; import ...

  10. Python基础--高速改造:字符串

    Python的字符串值得一说. 先看: >>>"Hello world!" 'Hello world!' 我们写是双引號,可是打印出来后是单引號. 差别何在? 答 ...