异步编程 - 14 异步、分布式、基于消息驱动的框架 Akka

news2025/1/16 6:54:28

文章目录

  • Akka概述
  • 传统编程模型存在的问题
    • 对封装特性的挑战
    • 对共享内存在现代计算机架构上的误解
    • 对调用堆栈的误解
  • Actor模型解决了传统编程模型的问题
    • Actor模型
    • 使用消息传递避免锁和阻塞
    • 使用Actor优雅地处理错误
  • 小结

在这里插入图片描述


Akka概述

Akka 是一个开源的并发、分布式、基于消息驱动的框架,用于构建高可伸缩性、可靠性和并发性强的应用程序。它是基于 JVM(Java虚拟机)的,主要使用 Scala 编程语言开发,但也提供了 Java API,因此可以在 Java 和 Scala 中使用。

以下是 Akka 框架的关键概念和特点:

  1. Actor 模型:Akka 的核心构建块是 Actor,它是一种轻量级并发原语。Actor 之间通过消息通信进行互动,每个 Actor 都有自己的状态和行为,它们之间是相互隔离的,这有助于构建高度可伸缩的系统。

  2. 并发性和并行性:Akka 允许开发人员轻松编写并发和并行代码,而不必担心底层线程管理。它处理所有与多线程编程相关的复杂性,并提供了抽象,以便开发人员可以专注于业务逻辑。

  3. 分布式系统:Akka 提供了构建分布式系统的支持。您可以将 Actor 部署在不同的节点上,这些节点可以是物理机器或虚拟机。Akka 提供了透明的消息传递,使得在分布式环境中发送消息就像在本地一样简单。

  4. 容错性:Akka 强调容错性,允许开发人员构建可靠的系统。它提供了监督策略,允许在 Actor 发生故障时采取自定义的恢复操作。这有助于系统在故障时继续运行,提高了系统的可用性。

  5. 事件驱动:Akka 是基于事件驱动的,它的响应式编程模型适合处理异步事件。它允许开发人员构建反应迅速的系统,适用于大量的并发事件和消息。

  6. 扩展性:Akka 具有良好的可伸缩性,可以根据需求轻松扩展系统。您可以添加更多的节点或 Actor 来处理更多的负载。

  7. 插件和扩展:Akka 提供了丰富的插件和扩展机制,可以轻松集成其他库和框架,如 Akka HTTP、Akka Streams 等,以构建全栈应用程序。


为了保持回弹性,Akka采用了“让它崩溃(Let it crash)”模型,该模型已在电信行业成功用于构建具有自我修复功能的应用程序和系统。Actor模型还提供对透明分发的抽象,以及真正可伸缩和容错的应用程序的基础。

下面看下Akka的特性:

  • 可以更简单地构建并发和分布式系统

    Akka基于Actor模型和Streams,让我们可以构建可伸缩的,并且可以高效使用服务器资源,使用多个服务器进行扩展的系统。

  • 回弹性设计

    遵守“反应式宣言”的原则,Akka让我们编写出可以在出现故障时能够自我修复,并保持响应能力的系统。

  • 高性能

    在单台计算机上可以处理高达每秒5000万条消息。内存占用少;每GB堆可以创建约250万个actor(参与者)。

  • 弹性和分散性

    分布式系统没有单点故障,具有跨节点的负载平衡和自适应路由。具有群集分片的事件源和CQRS(Command Query Responsibility Segregation,读写责任分离)。使用CRDT(Conflict-free Replicated Data Types,无冲突的复制数据类型)实现最终一致性的分布式数据。

  • 反应流数据

    具有回压的异步非阻塞流处理。完全异步和基于流的HTTP服务器和客户端为构建微服务提供了一个很好的平台。

在这里插入图片描述


传统编程模型存在的问题

对封装特性的挑战

  • 面向对象编程中的封装要求数据只能通过对象提供的方法间接访问,但多线程下多个线程同时修改对象内部数据会导致线程安全问题。
  • 解决线程安全问题的方式是使用锁,但锁的使用会影响性能、可能导致死锁,并且难以扩展到分布式系统中。

对共享内存在现代计算机架构上的误解

  • 在多核CPU架构中,多线程之间不再有真正的共享内存,而是通过Cache行传递数据,使得共享变量的内存可见性成为问题。
  • 使用volatile关键字或原子性数据结构可以解决共享变量的内存可见性问题,但会损害性能,需要谨慎选择需要修饰的变量。

对调用堆栈的误解

  • 传统的调用堆栈模型不适用于并发编程,因为异步任务无法通过调用堆栈传递异常或通知主线程。
  • 异步任务执行失败时,任务状态可能丢失,需要引入新的错误信令机制以及从故障中恢复的方法。

这些问题突出了Actor模型的优势,因为它提供了一种更适应并发编程的方式,通过消息传递来解决上述挑战,而不是依赖于共享内存和传统的调用堆栈。 Actor模型在处理并发和分布式系统中已经得到验证。


Actor模型解决了传统编程模型的问题

Actor模型

  • Actor模型用于处理并发计算,每个Actor代表一个基本的计算单元,可以接收消息并基于消息进行计算处理。
  • Actor之间相互隔离,不共享内存,每个Actor拥有自己的私有状态变量。
  • 每个Actor有自己的地址,通过地址相互发送消息来通信,消息是异步传递的。
  • Actor模型允许构建分布式系统,不限于单个JVM内。

在这里插入图片描述

【Actor系统图】

使用消息传递避免锁和阻塞

  • Actor之间通信通过消息传递而不是方法调用,不会导致发送消息的调用线程被阻塞。
  • Actor保持了封装性,因为消息的处理是串行的,不需要使用锁来同步多线程访问。
  • Actor的状态是本地的,不共享,通过消息传递数据,符合现代系统中内存工作方式。
  • Actor可以高效地处理大量消息,充分利用多核CPU的潜力。

使用Actor优雅地处理错误

  • Actor模型中不存在共享调用堆栈,因此错误处理方式不同。
  • 目标Actor可以回复错误消息,提示发生错误情况,错误作为普通消息处理。
  • Actor模型中采用树状层次结构的监督机制,父Actor可以对子Actor的故障进行监控和处理。
  • 监督程序可以决定是否重新启动子Actor或停止子Actor,确保系统的可恢复性和健壮性。

小结

总的来说,Akka 是一个强大的框架,适用于构建高度并发、分布式、可伸缩和容错性强的应用程序。它在金融、社交媒体、在线游戏等领域得到广泛应用,是构建响应式系统的有力工具。如果您需要构建这类应用程序,了解和使用 Akka 可能会非常有帮助。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1016398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈C++|类的封装篇

引子: C认为万事万物皆为对象,对象有其属性和行为。 人可以作为对象,属性有姓名,年龄,身高,体重等,行为有行走,吃饭,唱歌等。 车也可以作为一个对象,属性有轮…

学生信息登录系统(下)——判断循环语句(五)(for循环篇)

#include <iostream> using namespace std; int main() {bool student[46] 0; //student[0]空出不用int bianhao 0;cin >> bianhao;student[bianhao] 1;return 0; } /* 可是&#xff0c;这个程序只能执行一遍&#xff0c;一次只能录入一个学生&#xff0c;并…

网络请求【小程序】

一、get 二、post 1.获取相应数据 Page({/*** 页面的初始数据*/data: { inptValue:, isArr:[]},/*** 生命周期函数--监听页面加载*/onLoad(options) {},onSubmit(){// console.log(this.data.inptValue)//2.后台请求数据wx.request({url: https://tea.qingnian8.com/demoArt/…

esxi网卡直通后虚拟机无网

出现选网卡的时候无法选中&#xff0c;这里应该是一个bug。 解决方法如下&#xff1a; 1.先随便选择一个网卡 2.勾先取消再重新勾选 3.保存退出&#xff0c;重启虚拟机即可

机器学习 day34(机器学习项目的完整周期、精确度和召回率、F1)

机器学习项目的完整周期 第一步&#xff0c;决定项目是什么。第二步&#xff0c;收集数据。第三步&#xff0c;训练模型&#xff0c;进行错误分析并改进模型&#xff0c;可能会回到第二步。第四步&#xff0c;当模型足够好后&#xff0c;部署在生产环境中&#xff0c;继续监控…

竞赛选题 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的人脸专注度…

阿里云服务器上CentOS 7.6使用rpm包安装MySQL 8.0.31

我这里下载的是最新版本&#xff0c;需要到MySQL官网最新版本下载地址。 要是想要下载以前的版本需要到MySQL以前版本网址中。 1&#xff09;先使用wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.31-1.el7.x86_64.rpm-bundle.tar&#xff08;这个网址现在已经不…

【C语言】用冒泡排序实现my_qsort

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解如何用冒泡排序实现my_qsort&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 前言二. 冒泡排序三. 4个参数3.1 第一个参数void* base3.2 第二个参数…

驱动开发,stm32mp157a开发板的led灯控制实验(再优化),使用ioctl函数,通过字符设备驱动分步注册方式编写LED驱动,完成设备文件和设备的绑定

1.实验目的 编写LED灯的驱动&#xff0c;在应用程序中编写控制LED灯亮灭的代码逻辑实现LED灯功能的控制&#xff1b; 2. LED灯相关寄存器分析 LED1->PE10 LED1亮灭&#xff1a; RCC寄存器[4]->1 0X50000A28 GPIOE_MODER[21:20]->01 (输出) 0X50006000 GPIOE_ODR[10]-&…

CTyunOS安装MySQL8.0

CTyunOS安装MySQL8.0 1.yum安装2. 启动配置3.注意事项 最近天翼云搞活动&#xff0c;购了一台4U8G的服务器&#xff0c;这里讲解一下如何安装Mysql吧。 1.yum安装 yum install -y mysql yum install -y mysql-common yum install -y mysql-errmsg yum install -y mysql-libs y…

Jenkins :添加node权限获取凭据、执行命令

拥有Jenkins agent权限的账号可以对node节点进行操作&#xff0c;通过添加不同的node可以让流水线项目在不同的节点上运行&#xff0c;安装Jenkins的主机默认作为master节点。 1.Jenkins 添加node获取明文凭据 通过添加node节点&#xff0c;本地监听ssh认证&#xff0c;选则凭…

Ansible 自动化运维工具部署主从数据库+读写分离

文章目录 Ansible 自动化运维工具部署主从数据库读写分离一、主从复制和读写分离介绍二、准备工作&#xff08;1&#xff09;节点规划&#xff08;2&#xff09;修改主机名&#xff08;3&#xff09;免密&#xff08;4&#xff09;配置IP映射&#xff08;5&#xff09;安装ansi…

电荷型 和 IEPE/ICP型振动传感器的比较

PE(压电式)和IEPE(集成电路压电式,PCB公司叫做ICP)传感器的对比说明,供各位参考。 1. PE/IEPE传感器的敏感元件均为压电晶体,通过压电效应感受被测物理量。 2.PE传感器:输出电荷量,也叫电荷传感器。不需要供电,两根信号线,可直接接入电荷放大器进行测量。 优点―――结…

Java————List

一 、顺序表和链表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c; 常见的线性表&#xff1a;顺序表、链表、栈、队列… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直…

基础篇之SDK编译

文章目录 一、 Ubuntu系统固件下载1. 固件下载2 放入SDK根目录中 二、编译SDK三、说明 一、 Ubuntu系统固件下载 1. 固件下载 在资源下载页面下载Ubuntu Rootfs固件&#xff0c;文件夹有三个文件&#xff0c;其区别如下&#xff0c;根据情况进行选择下载 资源名称作用Ubuntu2…

【毕设选题】opencv 图像识别 指纹识别 - python

文章目录 0 前言1 课题背景2 效果展示3 具体实现3.1 图像对比过滤3.2 图像二值化3.3 图像侵蚀细化3.4 图像增强3.5 特征点检测 4 OpenCV5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往…

网络安全深入学习第三课——热门框架漏洞(RCE—Struts2远程代码执行)

文章目录 一、Struts2框架介绍二、Struts2远程代码执行漏洞三、Struts2执行代码的原理四、Struts2框架特征五、漏洞手工POC六、漏洞工具复现 一、Struts2框架介绍 ------ Struts2是apache项目下的一个web 框架&#xff0c;普遍应用于阿里巴巴、京东等互联网、政府、企业门户网…

Linux——Shell脚本编程(2)

一、Shell变量 Linux Shell 中的变量分为&#xff0c;系统变量 和 用户自定义变量 (这个用的比较多)。 系统变量 : $HOME、$PWD、$SHELL、$USER 等等&#xff0c;比如 : echo $HOME 等等.. 显示当前shell中所有变量 : set 举例说明&#xff1a; 二、设置环境变量 记得在注释…

ReactNative 网络库

What JS判断网络状态不准确 react-native-netinfo在Android中的结构 type-CellularGeneration&#xff1a;G网模式枚举 type-ConnectionType&#xff1a;网络连接类型 AmazonFireDeviceConnectivityPoller&#xff1a;Amazon设备网络适配&#xff0c;可忽略 BroadcastRec…