akka实践之应用的扩展性问题和actor模型

article/2025/6/7 23:08:46

如何解决应用的扩展性问题

当一个应用需要处理海量并发请求时,传统的开发模式往往显得力不从心,为什么应用需要扩展性?

  • 需求增长: 用户量激增,数据量爆炸式增长。
  • 资源限制: 服务器、带宽、存储等资源有限。
  • 复杂性增加: 代码逻辑、系统架构日益复杂。
  • 成本考量: 资源投入与收益不成正比。

面对这些挑战,我们通常会怎么做?传统方法的困境

  • 线程与锁,低效并发,易死锁,管理复杂
  • RPC,同步调用阻塞,异步回调地狱
  • 数据库,共享状态,事务管理,性能瓶颈
  • 混合编程模型,多种技术混杂,难以统一管理和优化

有没有一种更优雅、更统一的方式来应对这些挑战呢?答案是肯定的,这就是Akka。

The Reactive Manifesto (www.reactivemanifesto.org) is an initiative to push for the design of systems that are more robust, more resilient, more flexible, and better positioned to meet modern demands.

  • Blocking I/O limits opportunities for parallelism, so nonblocking I/O is preferred.Synchronous interaction limits opportunities for parallelism, so asynchronous interaction is preferred.

  • Polling reduces the opportunity to use fewer resources, so an event-driven style is preferred.

  • If one node can bring down all other nodes, that’s a waste of resources. So you need isolation of errors (resilience) to avoid losing all your work.

  • Systems need to be elastic: if there’s less demand, you want to use fewer resources. If there’s more demand, use more resources, but never more than required.

  • Complexity is a big part of cost. So if you can’t easily test your system, change it, or add new features, you’ve got a big problem.

核心理念是一次编写,随处扩展。以下是传统方法和akka的对比

在这里插入图片描述

举个例子

一个传统业务聊天应用程序的发展历程,如何变得越来越复杂?以及actor如何解决扩展性问题。

  • team对象是user构成的,许多user可以成为conversation的一部分,message对象是消息的集合。所有对象保存在内存中,只能在单机部署,重启应用会丢失状态。
  • 在生产环境中,将app扩容到两个副本,增加负载均衡器,状态从内存迁移到数据库中管理。状态变化从内存操作变成了网络通信,错误概率增加。测试变得复杂。性能开销增加。还要完全重构代码。线程锁和表锁结合使用会变得复杂。
  • 用户量进一步增加,大量资源用于seri和deseri。计划增加新功能Mentions,解析消息将提及的user添加到notification表中,应用检索notification表并通知对应的user。增加了单独的Mentions(包含通知表和用户表的一个副本)和消息队列,app和Mentions使用消息队列通信。而且app需要轮询数据库获得提及的用户。

  • 增加新功能,通过TeamFinder对象增加自动补全user名称能力,TeamFinder会调用外部的接口。为了避免TeamFinder导致的级联失败,创建新的TeamFinder服务。现在有4个逻辑,用于内存中的线程,用于数据库操作,用于 Mentions 消息队列,用于联系人 Web 服务。
  • 如果请求量进一步增加,将机器扩容到100个又会出现哪些问题?

接下来是akka如何解决此问题

  • conversion持久化问题。Conversation actor向database log发送 MessageAdded 事件,以记录内存中添加的每个消息。所有变化都作为事件序列进行保存,可以通过重放内存中的 Conversation 事件来重建Conversation 的当前状态。
  • 分片以扩展数据。将conversation以可预测的方式分割到服务器上,或者跟踪每个对话的位置。
  • 推送消息而非轮询。直接发送消息来通知事件。还可以通过发送事件消息作为内部信号来执行特定任务。

在这里插入图片描述

  • 异步解耦。Mentions和TeamFinder组件的失败此时不会影响到正常的chat功能,使用消息事件驱动而非直接调用方法进行对象通信,消息必须是不可变的。
  • 监控和守护。Supervisor 监视组件并在组件崩溃时采取行动。当组件失败时,它可以向 Supervisor 发送消息,而Supervisor 可以向组件发送消息以停止或尝试重启

在这里插入图片描述

Actor模型

Akka的核心是Actor模型,它提供了一种单一的抽象来处理并发和分布式问题,akka设计思想如下:

  • Actor 模型,统一的并发和分布式编程模型。
  • 消息传递,异步通信,解耦组件,提高灵活性。
  • 弹性伸缩,自动适应负载变化,高效利用资源。
  • 简化复杂性,降低并发和分布式编程的复杂度。

Actor模型到底是什么?

  • Actor,轻量级进程,封装状态和行为。封装了自己的状态和行为,外界无法直接访问其内部状态,只能通过发送消息来与其交互
  • 消息,不可变数据结构,Actor 间通信的媒介。一旦创建就不能被修改,这大大简化了并发处理的复杂性
  • 信箱 (Mailbox),Actor 接收消息的队列,保证消息顺序。每个Actor都有一个信箱,也就是Mailbox,所有发给它的消息都会先进入这个队列,然后由调度器Dispatcher按顺序取出并交给Actor处理。
  • 调度器 (Dispatcher),负责将消息分发给 Actor。

Actor能做什么呢?主要就是四大核心操作

  • 创建 (reate),Actor 可以创建其他 Actor。例如,Supervisor Actor可以创建多个子Actor来管理不同的业务模块
  • 发送 (Send),Actor 通过消息与其他 Actor 通信。这也是Actor之间唯一的交互方式。
  • 指定行为 (Designate Next Behavior),Actor 可以根据消息动态改变自身行为。
  • 监督 (Supervise),Actor 可以监督其创建的子 Actor,并处理异常。如果子Actor发生故障,父Actor可以决定是重启它还是终止它,从而实现容错和恢复

Akka实现Actor模型

在这里插入图片描述

  • ActorSystem,Actor 的容器,管理 Actor 的生命周期,包括创建、停止和监控Actor。其他的功能例如remote和persistent等,大多数功能都是以Akka扩展的形式提供的,可以针对所讨论的ActorSystem进行特定配置的模块
  • ActorRef,Actor 的引用,用于发送消息。创建actor时会收到ActorRef,可以把它理解为Actor的地址或引用
  • ActorPath,每个Actor都有一个唯一的ActorPath,类似于URL路径,用来精确定位它。
  • Mailbox,Actor 的信箱,存储待处理的消息。
  • Dispatcher,消息分发器,负责将消息分发给actor,Akka提供了多种Dispatcher类型,可以根据需要进行配置和优化。

Akka相比传统方法,有哪些显著的优势呢?

  • 简化并发,无需手动管理线程和锁,降低并发编程难度。
  • 提高灵活性,消息传递机制解耦组件,易于扩展和修改。
  • 提升性能,异步非阻塞 I/O,高效利用资源,弹性伸缩。
  • 增强可靠性,监督机制和容错能力,保障系统稳定运行。

akka入门实践

  • remote Actor: Akka将远程Actor的消息传递到目标机器,并返回结果。
  • 配置驱动: 仅需配置远程Actor引用的查找方式,代码无需改动。
  • 无缝扩展: 从垂直扩展(scale up)到水平扩展(scale out),代码保持不变。
  • 核心优势: Actors提供更高的灵活性和可扩展性,简化应用架构。

akka的核心理念,以Actor为中心,简化并发编程,提升系统可扩展性


http://www.hkcw.cn/article/TdwasMiZrE.shtml

相关文章

Starrocks Full GC日志分析

GC日志样例: [2025-06-03T07:36:06.1770800] GC(227) Pause Full (G1 Evacuation Pause) [2025-06-03T07:36:06.1960800] GC(227) Phase 1: Mark live objects [2025-06-03T07:36:06.9480800] GC(227) Cleaned string and symbol table, strings: 47009 processed,…

mapbox高阶,生成并加载等时图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️Fill面图层样式1.4 ☘️symbol符号图层…

防火墙在OSI模型中的层级工作(2025)

1. 物理层(L1)& 数据链路层(L2) 传统防火墙:通常不处理L1/L2(由交换机/网卡负责)。 现代演进: MAC地址过滤:部分防火墙支持基于MAC地址的粗粒度策略(如禁…

帝可得 - 运营管理APP

Android模拟器 本项目的App客户端部分已经由前端团队进行开发完成,并且以apk的方式提供出来,供我们测试使用,如果要运行apk,需要先安装安卓的模拟器。 可以选择国内的安卓模拟器产品,比如:网易mumu、雷电…

关于list集合排序的常见方法

目录 1、list.sort() 2、Collections.sort() 3、Stream.sorted() 4、进阶排序技巧 4.1 空值安全处理 4.2 多字段组合排序 4.3. 逆序 5、性能优化建议 5.1 并行流加速 5.2 原地排序 6、最佳实践 7、注意事项 前言 Java中对于集合的排序操作,分别为list.s…

自然语言处理(NLP)的系统学习路径规划

文章目录 一、基础准备阶段(1-2个月)1. 数学基础2. 编程基础3. 语言学基础 二、核心技术阶段(3-4个月)1. 经典NLP技术2. 深度学习模型3. 预训练模型入门 三、进阶实战阶段(2-3个月)1. 热门任务实战2. 大模型…

CSS3美化页面元素

1. 字体 <span>标签 字体样式⭐ 字体类型&#xff08;font-family&#xff09; 字体大小&#xff08;font-size&#xff09; 字体风格&#xff08;font-style&#xff09; 字体粗细&#xff08;font-weight&#xff09; 字体属性&#xff08;font&#xff09; 2. 文本 文…

便签软件哪个好用,最好用的免费便签软件介绍

在快节奏的工作和生活中&#xff0c;一款好用的便签软件能帮助我们高效记录灵感、管理待办事项&#xff0c;甚至成为个人生产力系统的核心工具。2025年&#xff0c;市面上涌现了许多优秀的免费便签软件&#xff0c;它们各具特色&#xff0c;能满足不同用户的需求。便签软件哪个…

如何轻松删除 Android 上的文件(3 种方法)

Android 手机是非常强大的设备&#xff0c;可让我们存储大量的个人数据&#xff0c;从照片和视频到应用程序和文档。然而&#xff0c;随着时间的推移&#xff0c;您的设备可能会因不再需要的文件而变得混乱。删除这些文件有助于释放空间并提高性能。在本指南中&#xff0c;我们…

鸿蒙简易版影视APP案例实战

目录 1. 案例效果 2. 资源初始化和资源文件 2.1. string.json (en_US) 2.2. string.json (zh_CN) 2.3. constants 3. 视频列表 3.1. 顶部导航 3.1.1. TobBar 组件 3.1.2. TopBar 数据源 3.2. 全部分类内容页面 3.2.1. 全部分类组件 3.2.2. 轮播图组件 3.2.3. 图片列…

对于python中“FileNotFoundError: [Errno 2] No such file or directory”的解决办法

写在前面 最近在使用 vscode 写代码 (python) 时发现使用相对路径读取文件以及写入文件时&#xff0c;想要直接在当前目录下读写一直提示没有该文件&#xff0c;需要返回根目录。并且使用 vscode 自带调试"F5"以及 Code Runner 扩展即右上角三角形都是如此。参考了许…

VS2022中配置Anaconda3环境和scikit-learn库

VS2022中配置Anaconda3环境和scikit-learn库 安装Anaconda安装scikit-learn库在VS2022中配置该环境 安装Anaconda 1.双击应用程序开始安装 2.点击Next 3.I Agree 4.Just Me 5.修改安装路径到D盘 6.没有选择自动配置环境变量&#xff0c;点击Install安装 7.安装完成 8.进…

Q:知识库-文档的搜索框逻辑是怎样的?

【回到目录】~~~~【回到问题集】 Q&#xff1a;知识库-文档的搜索框逻辑是怎样的? dify知识库的关键字检索响应速度很快,效果如上图 A&#xff1a;查看源代码&#xff0c;搜索逻辑是通过搜索框查看 document_segments.content字段满足条件的记录 , 程序逻辑参考 datasets_se…

Manus AI与多语言手写识别的创新革命:从技术突破到行业赋能

文章目录 一、Manus AI技术架构&#xff1a;从像素到语义的端到端进化1. 动态多尺度卷积网络&#xff08;Dynamic Multi-Scale CNN&#xff09;2. 跨语言注意力机制&#xff08;Cross-Lingual Attention&#xff09; 二、多语言挑战与突破&#xff1a;从数据到算法的全面创新1.…

【ISAQB大纲解读】LG 1-8:区分显性陈述和隐性假设(R1)

软件架构师&#xff1a; 应明确提出假设或先决条件&#xff0c;从而防止隐性假设 知道隐性假设可能会导致利益相关方之间的潜在误解 1. 应明确提出假设或先决条件&#xff0c;防止隐性假设 为什么重要&#xff1f; 隐性假设是架构风险的温床 例如&#xff1a;假设“所有服务都…

Dify-5:Web 前端架构

本文档提供了 Dify Web 前端架构的技术概述&#xff0c;包括核心组件、结构和关键技术。它解释了前端如何组织、组件如何通信以及国际化功能如何实现。 技术栈 Dify 的 Web 前端基于现代 JavaScript 技术栈构建&#xff1a; 框架&#xff1a;Next.js&#xff08;基于 React …

T/CCSA 663-2025《医疗科研云平台技术要求》标准解读与深度分析

参考地址:https://www.doc88.com/p-30280431175529.html 引言 随着医疗信息化建设的深入推进,医疗行业正经历从"业务驱动"向"数据驱动"的转型。在这一背景下,中国通信标准化协会(CCSA)于2025年发布了T/CCSA 663-2025《医疗科研云平台技术要求》标准,并…

基于PostGIS的GeoTools执行原生SQL查询制图实践-以贵州省行政区划及地级市驻地为例

目录 前言 一、空间相关表简介 1、地市行政区划表 2、地市驻地信息表 3、空间查询检索 二、GeoTools制图实现 1、数据类型绑定 2、WKT转Geometry 3、原生SQL转SimpleFeatureCollection 4、集成调用 5、成果预览 三、总结 前言 在当今这个信息爆炸的时代&#xff0c…

[yolov11改进系列]基于yolov11引入自集成注意力机制SEAM解决遮挡问题的python源码+训练源码

【SEAM注意力机制介绍】 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM&#xff0c;SEAM&#xff08;Spatially Enhanced Attention Module&#xff09;注意力网络模块旨在补偿被遮挡面部的响应损失&#xff0c;通过增强未遮挡面部的响应来…

第35次CCF计算机软件能力认证-5-木板切割

原题链接&#xff1a; TUOJ 我自己写的35分正确但严重超时的代码 #include <bits/stdc.h> using namespace std; int main() {int n, m, k;cin >> n >> m >> k;vector<unordered_map<int, int>> mp(2);int y;for (int i 1; i < n; …