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

简介:  作者属于Scala、Akka技术爱好者,但苦于Akka没有关于设计模式的文章,偶尔搜到《Akka应用模式》一书,如获至宝。现整理一些读书笔记和自己的感悟,以供参考。Actor模型Actor模型感觉还是很给力的,要是按我以前学习actor模型,绝对会对他嗤之以鼻,这玩儿意能干啥。

 

作者属于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解决。

目录
相关文章
|
9月前
|
消息中间件 监控 Java
Apache Kafka 分布式流处理平台技术详解与实践指南
本文档全面介绍 Apache Kafka 分布式流处理平台的核心概念、架构设计和实践应用。作为高吞吐量、低延迟的分布式消息系统,Kafka 已成为现代数据管道和流处理应用的事实标准。本文将深入探讨其生产者-消费者模型、主题分区机制、副本复制、流处理API等核心机制,帮助开发者构建可靠、可扩展的实时数据流处理系统。
819 4
|
安全 JavaScript 前端开发
HarmonyOS NEXT~HarmonyOS 语言仓颉:下一代分布式开发语言的技术解析与应用实践
HarmonyOS语言仓颉是华为专为HarmonyOS生态系统设计的新型编程语言,旨在解决分布式环境下的开发挑战。它以“编码创造”为理念,具备分布式原生、高性能与高效率、安全可靠三大核心特性。仓颉语言通过内置分布式能力简化跨设备开发,提供统一的编程模型和开发体验。文章从语言基础、关键特性、开发实践及未来展望四个方面剖析其技术优势,助力开发者掌握这一新兴工具,构建全场景分布式应用。
1110 35
|
12月前
|
分布式计算 Java 大数据
Java 大视界 —— 基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用进展(176)
本文围绕基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用展开,剖析行业现状与挑战,阐释技术原理,介绍其在数据处理及天气预报中的具体应用,并结合实际案例展示实施效果。
Java 大视界 -- 基于 Java 的大数据分布式存储在视频监控数据管理中的应用优化(170)
本文围绕基于 Java 的大数据分布式存储在视频监控数据管理中的应用展开,分析管理现状与挑战,阐述技术应用,结合案例和代码给出实操方案。
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
机器学习/深度学习 存储
DeepSeek进阶开发与应用4:DeepSeek中的分布式训练技术
随着深度学习模型和数据集规模的扩大,单机训练已无法满足需求,分布式训练技术应运而生。DeepSeek框架支持数据并行和模型并行两种模式,通过将计算任务分配到多个节点上并行执行,显著提高训练效率。本文介绍DeepSeek中的分布式训练技术,包括配置与启动方法,帮助用户轻松实现大规模模型训练。数据并行通过`MirroredStrategy`同步梯度,适用于大多数模型;模型并行则通过`ParameterServerStrategy`异步处理大模型。DeepSeek简化了分布式环境配置,支持单机多卡和多机多卡等场景。
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
374 5
|
监控
Saga模式在分布式系统中保证事务的隔离性
Saga模式在分布式系统中保证事务的隔离性
380 4