作者属于Scala、Akka技术爱好者,但苦于Akka没有关于设计模式的文章,偶尔搜到《Akka应用模式》一书,如获至宝。现整理一些读书笔记和自己的感悟,以供参考。

Actor模型

Actor模型感觉还是很给力的,要是按我以前学习actor模型,绝对会对他嗤之以鼻,这玩儿意能干啥。哈哈哈,只能说当时年轻气盛吧。

现实是最终一致的。

作者举了一个例子说明了一下,Actor模型的设计哲学:世界不同信息的交流是异步的。那为啥不基于现实世界来建模,尝试使用异步事件来构造软件系统呢?相信这对于大部分人来说,提供了另一种解决问题的思路。当然,全部都异步毕竟还是很困难的。

结构Actor模型

Actor模型的概念,很早就有了,各个语言都有各自的实现方式。但Actor模型需要遵循以下几个基本规则:

  • 所有的计算都是在actor中执行的
  • actor之间只能通过消息进行通信交流
  • 为了响应消息,actor可以进行下列操作
    • 更改状态或行为
    • 发消息给其他actor
    • 创建有限数量的子actor

第一点其实还是很好理解的,毕竟把状态和行为封装起来是OOP的设计哲学。但第二点说明了两者的根本区别。在OOP中一个对象与另一个对象的交互是通过对象公开的函数进行的,例如A调用B对象的某个方法就可以改变B对象的状态。但在actor世界中,只能通过消息进行交流。这一点是不是很像现实世界,就好像我跟你说一句话,总不能进入你的脑袋中去告诉听觉系统一样。
神奇的是第三点,为啥神奇呢?因为它没有说明对消息如何响应!如果一个actor只能更改自己的状态或行为、发消息给其他actor、创建有限数量的子actor,那要他有何用呢?哈哈哈,这也是我刚学的时候特别不理解的事情。

actor之间只能通过消息进行通信

这一点在上一节中已经说过了。每个actor都有一个邮箱(类似于消息队列一样),消息被投递到某个actor的邮箱后,actor就可以接收并处理这些消息,但是每次只能接收处理一条消息。what?!这听上去是不是很扯,一次只能处理一个消息,请问如何保持多线程时的效率!这个问题后面再聊,我们先看看他的好处。如果一次只能处理一个消息,那就意味着actor中单线程可以很完美的工作。actor可以自由、任意的修改自己的内部状态,完美的规避了并发的问题。看上去是不是也很扯?只是我刚学的时候也是这样认为的。
其实很多时候,线程、锁、并发无形中增加了系统的复杂性。而大部分程序员不一定能完美解决这个问题,要不然就不会有那么多关于解决死锁的文章了。actor缺消除了这一问题,当然这需要某种机制来保证。这一点后面再说。

actor可以创建子actor

这一点也跟OOP的对象不同。其实我对这一点的理解是,actor的并发问题垂直向下解决了。并发往往意味着多个线程并行执行,即在水平方向上的并发。然后actor可以创建子actor,那么意味着actor之间可以有一定的层级关系,有层级关系就意味着可以相互通信、父actor可以管理子actor(毕竟子actor都是它创建的)。而这种层级关系在故障恢复时非常有用。

actor可以改变自己的状态或行为

这一点跟OOP差不多。actor收到某条消息时可改变自己内部的状态或行为,但OOP中经常会改变状态,行为比较少改变。actor的这种特性在构造FSM时非常有用。

一切都是actor

其实这一点刚开始我理解的不是很清楚。怎么一切都是actor呢?一切都是actor是不是意味着行为也可以是actor呢?Actor基本规则中没有描述对消息的响应在哪里处理,只是说可以发消息给其他actor、创建子actor。这里又说一切都是actor,难道把行为也看成actor,由子actor去处理?嗯,这往往是一种很好的设计模式:某个子actor只接受一个或少量类型的消息,然后做应答,应答后立即销毁自身actor。既然可以创建有限数量的子actor,那就意味着可以并发的处理同类型的很多消息。这是不是把并发的问题垂直化处理了呢。

Actor模型的使用

actor看上去很完美,但也有其使用的场景。使用时需要考虑其使用的基本规范和场景。

定义清晰的边界。

这跟OOP一样,都需要定义清晰的边界。清晰的边界意味着对象或actor封装的足够好,实例之间只能通过接口或者消息进行通信,也就是高内聚低耦合。无论从业务上还是技术上,都会是一件完美的事情。

何时使用Actor模型

  • 对高并发有严格要求的同时又需要维护某种状态。毕竟维持并发状态是Actor模型里面最基本的属性。
  • 构建有限状态机
  • 需要高并发,同时也需要很小心的管理并发。

上面是书籍作者列举的三种情况,但并不限于此。其实简单点来说,需要处理高并发,又需要正确的维护某种状态时,就可以用actor。当然了对于我来说,那就是用actor解决一切高并发的问题,如果不能解决,那就是我的actor设计的不够好。哈哈哈,我相信以目前的工作内容来看,并发的问题全都可以用actor解决。

《Akka应用模式:分布式应用程序设计实践指南》读书笔记1相关推荐

  1. [你的灯亮着吗]读书笔记

    把自己当成比人:把别人当成自己:把别人当成别人:把自己当成自己 动手去解决问题之前,好好想想问题的来源 如何站在各个角度来看待面临的问题,以能够知道其真正所在:如何去尝试那个最难解决真正问题的方法,并 ...

  2. 你的灯亮着吗阅读笔记之一

    定义问题: 我们分析和解决问题时,首先要明确地定义问题.如书所云:"问题其实就是你期望的东西和你体验的东两之间的差别".我们需要搞清楚"问题是什么"和摆在你眼前 ...

  3. 你的灯亮着么阅读笔记3

    第五章问题从哪来的.我们要探寻问题的根源,而问题的根源往往出现在自身.因此我们要时常的反思自己,是否在团队中拖了后腿,而不是一味的去指责队友对自己的埋怨.只有发现自身的问题,才能改正自我. 第六章我们 ...

  4. 《你的灯亮着吗》 读书笔记三

    紧接<你的灯亮着吗>读书笔记二 4.这是谁的问题? 当别人可以妥善解决自己的问题时,不要越俎代庖,如果这是他们的麻烦,就让它成为他们的麻烦,如果一个人处于解决问题的位置,却并不受问题困扰, ...

  5. 《你的灯亮着吗》读书笔记3

    终于读完了<你的灯亮着吗>,其实从总体来看,这本书给了我很大的启示. 在理解问题之前,至少要做好准备接受三种可能的出错情况:或许还可以改变问题的表述来获得不同的解决方法:当你沉迷于寻找问题 ...

  6. 《你的灯亮着吗》读书笔记1

    你的灯亮着吗? 上帝说:"要有光."于是俺挑了这本只有50多页的书,在剩下的5天里,可以保证读完剩下的三章. 前几天我一口气看了三章,觉得这本书和<梦断代码>相比,上了 ...

  7. 《你的灯亮着吗?》读书笔记

    第3章 你的问题是什么? 问题就是理想状态和现实状态之间的差别. 噢,年轻人,你不需要自责的.等你到了我这个年纪,就知道我们在生活中重要的事情面前是多么无能为力了. 第6章 比利反思投标案 即使问题已 ...

  8. 202318读书笔记|《芭蕉·芜村·一茶:俳句三圣新译300》——樱花——让一整个春夜亮起来!

    202318读书笔记|<芭蕉·芜村·一茶:俳句三圣新译300>--樱花--让一整个春夜亮起来! <芭蕉·芜村·一茶:俳句三圣新译300>诗歌,词,短歌,俳句我都喜欢,读起来轻松 ...

  9. 读书笔记第四讲:《百万级并发商品服务架构解密》丁鸣亮

    本文是读书笔记第四讲:网易考拉海购商品中心2017年商品中心架构,百万级并发商品服务 架构解密,作者:丁鸣亮 文章目录 1.前言:电商平台的商品服务 2.考拉:商品服务的"黑历史" ...

  10. 《你的灯亮着吗》阅读笔记

    读了<你的灯亮着吗>,使我对问题的解决有了更深层次的见解.这本书告诉了我当面对问题时要发现问题的真正所在. 这本书首先提出了几个主题: 1)动手去解决问题之前,好好想想问题的来源: 2)如 ...

最新文章

  1. Spring MVC那点事儿
  2. TX的8B/10B编码功能
  3. 监控最佳实践--redis及业务接口
  4. 基于tensorflow2.0利用CNN与线性回归两种方法实现手写数字识别
  5. Mybatis学习笔记18 - 缓存
  6. 炒菜机器人放食材的顺序_2年要开1000家 碧桂园旗下千玺机器人餐厅开业
  7. netty 学习 (1)
  8. TensorFlow中tf.ConfigProto()配置Sesion运算方式
  9. 计算标准累积正态分布_神说要有正态分布,于是就有了正态分布。
  10. 利用Python高效自动化运维巡检网络设备
  11. Kettle连接Hadoop clusters 报错
  12. switch语句(C++)
  13. 了解MVP(最小可行产品) - 以及为什么我更喜欢最早的可测试/可用/可爱
  14. L2正则化和collection,tf.GraphKeys
  15. 行列式的定义及简单计算
  16. C#,图像二值化(20)——全局阈值的耶恩算法(Yen Thresholding)及源代码
  17. position详解
  18. 图像分割-种子区域生长
  19. MySQL 整体架构与 SQL 执行原理,数据库事务原理
  20. iWatch 的text和label

热门文章

  1. SQL代码-创建DeskInfo表
  2. 提高.net程序性能和稳定性-CLR Profile
  3. 【Android】MTK Android 源码开发环境搭建
  4. Exchange Server 2003多服务器安装以及管理工具介绍
  5. 【按住你的心】——Android开发CheckBoxRadioButton控件的简单使用
  6. kubernetes创建资源的两种方式
  7. Windows恶意软件API调用特征分析
  8. 芯盾时代:致力于身份认证安全的领军者
  9. C++编程易范的错误
  10. 细思极恐的2016智能交通!怎么回事?