分布式和并发模型的比较和讨论记录

参考资料

  • akka官方文档,https://doc.akka.io/docs/akka/current/typed/guide/introduction.html
  • akka官方中文文档,https://github.com/guobinhit/akka-guide/blob/master/README.md
  • https://www.lightbend.com/akka/developers
    • actor-fundamentals,https://akkademy.akka.io/learn/courses/21/actor-fundamentals
  • https://www.zhihu.com/question/279512440

akka和netty的比较

从Akka出现背景来说,它是基于Actor的RPC通信系统,它的核心概念也是Message,它是基于协程的,性能不容置疑;基于scala的偏函数,易用性也没有话说,但是它毕竟只是RPC通信,无法适用大的package/stream的数据传输,这也是Spark早期引入Netty的原因

那么Netty为什么可以取代Akka?首先不容置疑的是Akka可以做到的,Netty也可以做到,但是Netty可以做到,Akka却无法做到,原因是在软件栈中,Akka相比Netty要Higher一点,它专门针对RPC做了很多事情,而Netty相比更加基础一点,可以为不同的应用层通信协议(RPC,FTP,HTTP等)提供支持,在早期的Akka版本,底层的NIO通信就是用的Netty

Spark基于这个思想在上述的Network的基础上实现一套自己的RPC Actor模型,从而取代Akka。其中RpcEndpoint对于Actor,RpcEndpointRef对应ActorRef,RpcEnv即对应了ActorSystem。

https://www.cnblogs.com/snow-man/p/13404011.html

为什么现代系统需要新的编程模型解释了共享内存并发模型的缺点,通过消息传递实现协调

  • actor = 状态+行为+消息

关于akka和erlang/OTP的比较

在 Akka 库中,Actor 是用 Scala 或 Java 编写的,并运行在一个 ActorSystem 中。Akka 使用一个事件驱动的调度器来确保 Actor 能够高效地并发执行。Actor通常由用户空间的库来调度和管理,而不是由操作系统内核来管理。这意味着 Actor 的上下文切换开销较低,并且可以在单个 JVM 实例中支持大量的 Actor

Erlang 的进程(Processes)实际上实现了与 Actor 模型非常相似的行为。实际上,Erlang 的进程模型可以被认为是 Actor 模型的一个实例化版

比较Akka的Actor模式和Go的CSP模式

一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递。使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争。和共享数据方式相比,消息传递机制最大的优点就是不会产生数据竞争状态。实现消息传递有两种常见的类型:基于channel(golang为典型代表)的消息传递和基于Actor(erlang为代表)的消息传递。https://zhuanlan.zhihu.com/p/86460724

两者都是通过消息通信的机制来避免竞态条件

  • CSP的模式比较适合Boss-Worker模式的任务分发机制,侵入性没那么强,可以在现有的系统中通过CSP解决某个具体的问题。它并不试图解决通信的超时容错问题,需要发起方进行处理
  • 使用Actor要面临整个应用架构机制和思维方式的变更,比如容错,比如分布式

Akka是在线程池基础上实现调度的,但线程是有限的,所以Akka的Actor中要避免任何阻塞操作,要么用Akka提供的异步框架,要么通过Future-callback机制,转换成回调模式。而Goroutine是用户态的线程,创建和切换成本都比较小,可以把异步的callback机制转换为同步模式,对开发比较友好些

并发之痛 Thread,Goroutine,Actor讨论

https://jolestar.com/parallel-programming-model-thread-goroutine-actor/

Go的Channel和Java中的SynchronousQueue是一样的机制,如果有buffer其实就是ArrayBlockQueue

Go实现了M:N的调度,也就是说线程和Goroutine之间是多对多的关系。这点在许多GreenThread/Coroutine的调度器并没有实现。Java1.1版本之前的线程其实是GreenThread(这个词就来源于Java),但由于没实现多对多的调度,也就是没有真正实现并行,发挥不了多核的优势,所以后来改成基于系统内核的Thread实现了。

java21引入和Virtual Threads新特性。虚拟线程是一种轻量级的线程,它适用于 I/O 密集型的任务。对于CPU密集型任务(如大量计算),平台线程可能是更好的选择

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

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

相关文章

电信网关配置管理系统 upload_channels.php 文件上传致RCE漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…

STM32H503开发(2)----STM32CubeProgrammer烧录

STM32H503开发----2.STM32CubeProgrammer烧录 概述硬件准备视频教学样品申请源码下载参考程序自举模式BOOT0设置UART烧录USB烧录 概述 STM32CubeProgrammer (STM32CubeProg) 是一款用于编程STM32产品的全功能多操作系统软件工具。 它提供了一个易用高效的环境,通过…

计算机【基础篇】

-- 选择偶然 操作系统,是程序员写出来的一个用于操控机器硬件的 所谓电脑就是第一台计算机,计算机就是能够接受用户输入的指令和资料,并且通过计算机的中央处理器(CPU是计算机的大脑)进行数学和逻辑运算后&#xff0c…

Unity Shader分段式血条

Unity Shader分段式血条 前言项目ASE连线 前言 要给单位加一个类似LOL的分段式血条,用ASE实现并记录一下。里面加了旋转和颜色的渐变。 项目 ASE连线

Android笔记(三十五):用责任链模式封装一个App首页Dialog管理工具

背景 项目需要在首页弹一系列弹窗,每个弹窗是否弹出都有自己的策略,以及哪个优先弹出,哪个在上一个关闭后再弹出,为了更好管理,于是封装了一个Dialog管理工具 效果 整体采用责任链模块设计,控制优先级及弹…

【SpringMVC】——Cookie和Session机制

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:实践 1:获取URL中的参数 (1)PathVariable 2&…

ROS2humble版本使用colcon构建包

colcon与与catkin相比,没有 devel 目录。 创建工作空间 首先,创建一个目录 ( ros2_example_ws ) 来包含我们的工作区: mkdir -p ~/ros2_example_ws/src cd ~/ros2_example_ws 此时,工作区包含一个空目录 src : . └── src1 directory, …

MySQL查询数据被截断

说明:本文记录一个MySQL查询,返回数据被截断的问题; 场景 假设有个用户查询列表,查询条件中有个用户类型(普通用户、大会员、黄金大会员、铂金大会员、至尊大会员),是个下拉列表,可…

华为云计算HCIE-Cloud Computing V3.0试验考试北京考场经验分享

北京试验考场 北京考场位置 1.试验考场地址 北京市海淀区北清路156号中关村环保科技示范园区M地块Q21楼 考试场选择北京,就是上面这个地址,在预约考试的时候会显示地址,另外在临近考试的时候也会给你发邮件,邮件内会提示你考试…

GDPU Android移动应用 Broadcast Receiver

聆听广播,跟着节拍吧。 计时器 新建一个名为PhoneStateMonitor的工程; 实现一个应用运行时长的计时器,并在界面上刷新计数器,要求包括: (1)在Layout中包含两个TextView控件,横向分…

数据库SQL——什么是实体-联系模型(E-R模型)?

目录 什么是实体-联系模型? 1.实体集 2.联系集 3.映射基数 一对一(1:1) 一对多(1:n) 多对一(n:1) 多对多(m:n) 全部参与: 4.主码 弱实体集&#xf…

共筑开源技术新篇章 | 2024 CCF中国开源大会盛大开幕

在这个技术革新日新月异的时代,开源精神如同点燃创新火焰的火种,照亮了无数技术探索者的征途。2024年11月9日,备受瞩目的2024 CCF中国开源大会在深圳这座充满活力的创新之城盛大开幕。这场开源领域的顶级盛事,以“湾区聚力 开源启…

[极客大挑战 2019]Secret File 1

[极客大挑战 2019]Secret File 1 审题 看到题目应该是一道简单的按照要求找flag的题目 知识点 跟着题目走 解题 一,查看源码 找到网站进入 点开发现 【注意它说没看清吗】 二,使用BP抓包试试 发现新出现了/action.php 抓到后放到Repeater中响应 得…

初识Electron 进程通信

概述 Electron chromium nodejs native API,也就是将node环境和浏览器环境整合到了一起,这样就构成了桌面端(chromium负责渲染、node负责操作系统API等) 流程模型 预加载脚本:运行在浏览器环境下,但是…

语义分割实战——基于DeepLabv3+神经网络头发分割系统源码

第一步:准备数据 头发分割数据,总共有1050张图片,里面的像素值为0和1,所以看起来全部是黑的,不影响使用 第二步:搭建模型 DeepLabV3的网络结构如下图所示,主要为Encoder-Decoder结构。其中&am…

c# 开发web服务 webserver

024-11-10<<<<<<<<<<<<<<<<<<<<<<<<<< 开始插件前Cyber_CallWeb acajax_dac_database_viewer 2024-11-10<<<<<<<<<<<<<<<<<<<<…

「C/C++」C/C++ 预处理 之 常用预处理宏

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

Javascript中如何实现函数缓存?函数缓存有哪些应用场景?

#一、是什么 函数缓存&#xff0c;就是将函数运算过的结果进行缓存 本质上就是用空间&#xff08;缓存存储&#xff09;换时间&#xff08;计算过程&#xff09; 常用于缓存数据计算结果和缓存对象 解释 const add (a,b) > ab; const calc memoize(add); // 函数缓存…

Maven的依赖管理、传递、冲突、父子工程的继承和聚合

目录 一、基于IDEA 进行Maven依赖管理 (一)依赖管理概念 (二)Maven工程核心信息配置和解读&#xff08;GAVP&#xff09; (三)Maven工程依赖管理配置 1.依赖管理和依赖添加 2.依赖版本统一提取和维护 (四)依赖范围 (五)Maven工程依赖下载失败错误解决&#xff08;重点…

iOS SmartCodable 替换 HandyJSON 适配记录

前言 HandyJSON群里说建议不要再使用HandyJSON&#xff0c;我最终选择了SmartCodable 来替换&#xff0c;原因如下&#xff1a; 首先按照 SmartCodable 官方教程替换 大概要替换的内容如图&#xff1a; 详细的替换教程请前往&#xff1a;使用SmartCodable 平替 HandyJSON …