分布式系统:Akka 提供了构建分布式系统的支持。您可以将 Actor 部署在不同的节点上,这些节点可以是物理机器或虚拟机。...对共享内存在现代计算机架构上的误解 在多核CPU架构中,多线程之间不再有真正的共享内存,而是通过Cache行传递数据,使得共享变量的内存可见性成为问题。...这些问题突出了Actor模型的优势,因为它提供了一种更适应并发编程的方式,通过消息传递来解决上述挑战,而不是依赖于共享内存和传统的调用堆栈。 Actor模型在处理并发和分布式系统中已经得到验证。...Actor之间相互隔离,不共享内存,每个Actor拥有自己的私有状态变量。 每个Actor有自己的地址,通过地址相互发送消息来通信,消息是异步传递的。...Actor保持了封装性,因为消息的处理是串行的,不需要使用锁来同步多线程访问。 Actor的状态是本地的,不共享,通过消息传递数据,符合现代系统中内存工作方式。
在计算机科学中,Actor 模型是一种并发运算上的模型。...自己管理,避免了并发环境下的锁和内存原子性等问题。...所有 Actor 之间不共享数据,只通过消息沟通,因此不用关心传统并发程序编写过程中的并发安全问题(因为根本没有共享的数据)。...此外,由于 Actor 模型中万物都是 Actor,所以它是天然支持分布式的,即不同机器之间的 Actor 通讯和本地 Actor 之间的通讯没有实质上的区别。...akka-http:HTTP 组件,现代、快速、异步、流媒体优先的 HTTP 服务器和客户端。 akka-cluster:集群组件,包括集群成员管理、弹性路由等。
很多常用的设计实践和已经接受的程序模型不能解决一些重要的挑战,这些挑战通常是现代计算机体系结构中固有的。...为了帮助你处理上面提到这些现实的问题,Akka 提供了: 不使用低级并发结构的多线程,例如原子或锁;让你免于考虑内存可见性的问题。...例如,一个计算机的操作系统是这样一个reactive system,它不会停止运行,而总是反应用户给的输入,并且计算机中的各个组件之间要进行交流。...actor 模型贯穿整个 Akka 的库,能够让你更加容易的理解和使用它们,并且能够保证更好的完整性。...通过学习 Akka 和如何使用 actor 模型,你将访问到庞大和深入的工具集用来解决分布式并行系统中遇到的困难和挑战,通过统一的编程模型,其中所有的东西都能够紧密和高效的组合在了一起。
许多常见的实践和公认的编程模型并不能解决现代计算机体系结构所固有的重要挑战。为了取得成功,分布式系统必须在组件崩溃而没有响应、消息丢失而没有在线跟踪以及网络延迟波动的环境中进行处理。...这些问题经常发生在精心管理的数据中心内部环境中,在虚拟化架构中更是如此。...通过学习 Akka 以及如何使用 Actor 模型,你将能够熟练的使用大量的工具集,这些工具可以在统一的编程模型中解决困难的分布式/并行系统问题,在统一的编程模型中,所有东西都紧密且高效地结合在一起。...本入门指南提供了更高级别的信息,它涵盖了为什么 Actor 模型适合现代分布式系统的需要,并且包括一个有助于进一步了解 Akka 的教程。...这些主题包括: 为什么现代系统需要新的编程模型 Actor 模型如何满足现代分布式系统的需求 Akka 库和模块概述 一个基于 Hello World 示例的「更复杂的例子」以说明常见的 Akka 模式
我需要类似线程池的东西来限制线程数。只需一个简单的循环和线程数就可以了。该解决方案看起来很好,在架构上很?, 然后我意识到我忘记了错误处理。...在Akka之后,我感受到了类似的快乐。Akka基于actors,所以actors是什么? Actors actors给你带来: 简单和高级的并发和并行抽象。 异步,非阻塞和高性能的事件驱动编程模型。...非常轻量级的事件驱动进程(每GB堆内存数百万个actor)。 使用Akka非常容易。它可以作为依赖项添加到我们的project.Simple jar文件中。...示例来自Akka文档。...Akka中的所有内容都设计为在分布式环境中工作:actor的所有交互都使用纯消息传递,一切都是异步的。
正如我们在「调用栈的假象」中看到的,如果它期望返回值,那么发送 Actor 要么阻塞,要么在同一线程上执行另一个 Actor 的工作。相反,接收 Actor 在回复消息中传递结果。...数百万个 Actor 可以有效地安排在十几个线程上,从而充分发挥现代 CPU 的潜力。任务委托是 Actor 的天然执行方式。...Actor 的状态是本地的而不是共享的,更改和数据通过消息传播,消息是映射到现代内存架构的实际工作方式。在许多情况下,这意味着只传输包含消息中数据的缓存线,同时将本地状态和数据缓存在原始核心上。...我们需要考虑两种错误: 第一种情况是,由于任务中的错误(通常是一些验证问题,如不存在的用户 ID),目标 Actor 上的委派任务失败。...Akka 要求所有 Actor 都被组织成一个树形的结构,即一个创造另一个 Actor 的 Actor 成为新 Actor 的父节点。这与操作系统将流程组织到树中的方式非常相似。
Reactor:Apache Netty整体架构基于Reactor模式; 3. Actor:Akka是在JVM上的Actor模型的实现。...因此Actor在空间(分布式)和时间(异步驱动)上解耦的。而Akka是Lightbend(前身是Typesafe)公司在JVM上的Actor模型的实现。...在akka系统的官网上主要介绍了现代并发编程模型所遇到的问题,里面主要提到了三个点 (1) 在面向对象的语言中一个显著的特点是封装,然后通过对象提供的一些方法来操作其状态,但是共享内存的模型下,多线程对共享对象的并发访问会造成并发安全问题...加锁在编程语言层面无法防止隐藏的死锁问题 (2) Java中并发模型是通过共享内存来实现,cpu中会利用cache来加速主存的访问,为了解决缓存不一致的问题,在java中一般会通过使用volatile来标记变量...因此从某种意义上来说是没有共享内存的,而是通过cpu将cache line的数据刷新到主存的方式来实现可见。
二、Akka 中 Actor 模型 2.1 Actor模型介绍 Akka 处理并发的方法基于 Actor 模型。在基于 Actor的系统里,所有的事物都是 Actor。...但是有一个重要区别,那就是Actor模型是作为一个并发模型设计和架构的,而面向对象模式则不是。Actor 与Actor之间只能通过消息通信。...对并发模型进行了更高的抽象 异步、非阻塞、高性能的事件驱动编程模型 轻量级事件处理(1GB内存可容纳百万级别个Actor) 为什么 Actor 模型是一种处理并发问题的解决方案呢?...实际上说明了Dispatcher Message内部是一个线程池,receive()方法实际上是从自己的Mail Box中取出消息,内部类似于调用Runnable的run方法。...ServerToClientMessage("我听不懂你亲的意思,客服还在不断学习中哦~") } } } } //为了服务端能够独立运行,定义一个伴生对象 object ChatServer
技术背景 在产品不断发展的过程中,一个不可忽视的挑战是大数据带来的存储和计算问题,存储暂且不表(Akka不直接提供数据存储的方案,当然,在Akka的基础上也可以实现类似的分布式文件存储系统),我们来看看数据的计算问题...Akka是什么 Akka是一款高性能高容错性的分布式&并行应用框架,遵循Apache 2开源许可,底层通过JVM上另外一个流行的语言Scala实现,提供Java&ScalaAPI(本书采用Java进行代码演示...在ActorSystem基础上,Akka也提供了一些配套的组件,比如持久化,Http服务,网络服务等,他们都是构建高可用分布式应用不可或缺的部分,基本架构体系和周边产品如图1-4所示。 ?...图1-4 Akka基本架构体系及周边产品 Actor组件 在Akka中,Actor是一个高度抽象的对象引用,它包含以下几个要素: 引用(ActorReference) Actor的引用不同于普通对象的引用...在底层实现上,Actor是运行于线程池之上的,肯定会存在多个Actor共享同一个线程的情况,那么会不会出现并发问题呢?
RPC 远程过程调用协议(Remote Procedure Call Protocol, RPC)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。...RPC假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发分布式应用更加容易。RPC采用C/S架构。...Actor模型常见于并发编程,它由Carl Hewitt于20世纪70年代早期提出,目的是解决分布式编程中的一系列问题。其特点如下: 1)系统中的所有事物都可以扮演一个Actor。...AKKA的优势如下: 1)易于构建并行与分布式应用(simple concurrency & distribution):AKKA采用异步通信与分布式架构,并对上层进行抽象,如Actors、Futures...3)高性能(high performance):在单机中每秒可发送5000万个消息。内存占用小,1GB内存中可保存250万个actors。
可共享性:None 邮箱:任意,为每个 Actor 创建一个 用例:Bulkheading 驱动:任何akka.dispatch.ThreadPoolExecutorConfigurator。...请注意,同样的提示也适用于管理 Akka 中任何地方的阻塞操作,包括流、HTTP 和其他构建在其上的响应式库。...然后,Akka 中基于fork join池的调度器尝试通过向池中添加更多线程来补偿此阻塞(default-akka.actor.default-dispatcher 18,19,20,...)。...具体的大小应该根据你期望在此调度器上运行的工作负载以及运行应用程序的计算机的核数量(number of cores)进行微调。通常,核数周围的小数字是一个很好的默认值。...在Future上执行阻塞调用,确保在任何时间点对此类调用的数量上限,提交无限数量的此类任务将耗尽内存或线程限制。
文章目录 消息传递可靠性 一般规则 讨论:“至多一次”是什么意思? 讨论:为什么不保证传递? 讨论:消息排序 通信故障 在 JVM(本地)消息发送的规则 小心你对这部分的操作!...通常不令人担忧的死信 消息传递可靠性 Akka 帮助你构建可靠的应用程序,这些应用程序可以在一台机器中使用多个处理器核心(scaling up,纵向扩展)或分布在计算机网络中(scaling out,横向扩展...讨论:“至多一次”是什么意思?...你可以在「Erlang 文档」的第 10.9 节和第 10.10 节中了解更多关于这种方法的信息,Akka将密切关注它。...不建议依赖本节中更强的可靠性,因为它会将你的应用程序绑定到仅本地(local-only)部署:为了适合在计算机集群上运行,可能必须对应用程序进行不同的设计(而不是仅使用某些 Actor 本地的某些消息交换模式
Akka 和 Java 内存模型 使用 LightBend 平台(包括 Scala 和 Akka)的一个主要好处是简化了并发软件的编写过程。...本文讨论了 LightBend 平台,特别是 Akka 如何在并发应用程序中处理共享内存。 Java 内存模型 在 Java 5 之前,Java 内存模型(JMM)是定义有问题的。...当多个线程访问共享内存时,可能会得到各种奇怪的结果,例如: 线程看不到其他线程写入的值:可见性问题。 由于没有按预期的顺序执行指令而导致的观察其他线程发生“不可能”的行为:指令重新排序问题。...Actors 和 Java 内存模型 通过 Akka 中的 Actor 实现,多个线程可以通过两种方式在共享内存上执行操作: 如果消息发送给某个 Actor(例如由另一个 Actor)。...Actors 和共享可变状态 由于 Akka 在 JVM 上运行,所以仍然需要遵循一些规则。
何时何地使用 Akka 集群? 如果你打算使用微服务架构或传统的分布式应用程序,则必须进行架构的选择。这个选择将影响你应该如何使用 Akka 集群。...在微服务架构中,你应该考虑服务内部和服务之间的通信。...Cluster Sharding 将 Actor 分布在集群中的多个节点上,并支持使用其逻辑标识符与 Actor 进行交互,但不必关心它们在集群中的物理位置。...Cluster Client 从不是集群一部分的 Actor 系统到集群中某个地方运行的 Actor 的通信。客户端不必知道目标 Actor 正在哪个节点上运行。...Distributed Data 当需要在 Akka 集群中的节点之间共享数据时,Akka 分布式数据(Distributed Data)非常有用。
熟悉c和java并发编程的都会比较熟悉共享数据的策略,比如java程序员就会常用到java.util.concurrent包中同步、锁相关的数据结构。...0x01 基本概念 Actor是计算机科学领域中的一个并行计算模型,它把actors当做通用的并行计算原语:一个actor对接收到的消息做出响应,进行本地决策,可以创建更多的actor,或者发送更多的消息...在Actor理论中,一切都被认为是actor,这和面向对象语言里一切都被看成对象很类似。但包括面向对象语言在内的软件通常是顺序执行的,而Actor模型本质上则是并发的。...0x02 Akka中的Actor 我们会用到Akka框架提供的Actor,因此在这里先大致介绍一下Akka中的Actor使用方式。...Akka官方文档提供了说明Actor生命周期的图片,如下所示: ? 官网的图不好看,盗一张感觉不错的。大致能明白就好。 ?
前言一般来说,我们有两种策略来在并发线程中实现通信:共享内存和消息传递。...大多数传统语言,并发线程之间的通信使用的都是共享内存,共享内存最大的问题就是竞争,我们可以使用锁来解决竞争问题,但处理各种锁的问题让人头痛不已。...Actor 模型是一种基于消息模型,在 Actor 模型中,一切皆 Actor ;每个 Actor 有自己的状态和行为,但不共享状态,状态由自己维护和修改;Actor 之间通过消息进行通信, 但每个 Actor...适用场景共享内存模型更适合高吞吐量的、要求低延迟的订单处理场景,因为它允许直接访问共享状态。...实际使用中大多数场景会混合两种模式使用,比如一些电子商务系统,例如使用共享内存来管理订单的状态和库存,而使用 Actor 模型来处理异步通知、通信和与用户的交互。
相反,它的公共 API 是通过 Actor 处理的消息来定义的。这可以防止 Actor 之间共享状态;观察另一个 Actor 状态的唯一方法是向其发送请求状态的消息。...轻量级:Lightweight,每个实例只消耗几百个字节,这实际上允许数百万并发 Actor 存在于一个应用程序中。...消息应该是不可变的,因为它们在不同的线程之间共享。 将 Actor 的关联消息作为静态类放在 Actor 的类中是一个很好的实践,这使得理解 Actor 期望和处理的消息类型更加容易。...位置透明性意味着,无论是在正在运行 Actor 的进程内,还是运行在远程计算机上,ActorRef都可以保持相同语义。如果需要,运行时可以通过更改 Actor 的位置或整个应用程序拓扑来优化系统。...你可能想知道 Actor 在不处理消息的时候在做什么,比如,做什么实际的工作?实际上,它处于挂起状态,在这种状态下,它不消耗除内存之外的任何资源。同样,这也展示了 Actor 的轻量级和高效性。
而本书从基础的点到点链路开始,循序渐进地增加复杂度,逐步构建出共享内存、共识、信号量、事务等更为复杂而实用的分布式抽象,使我明白了分布式问题和算法之间的内在联系,加深了我对分布式算法的理解。...这给了我醍醐灌顶的感觉,原来,设计分布式算法就是在设计自动机如何处理事件啊! 这让我想起了分布式开源框架Akka及其采用的Actor模型。原来Actor模型就是本书所述的自动机模型!...不看这本书,我大概只能基于Akka框架工作,而学习了这本书之后,我不用看Akka的源码或架构文档,也能大概猜得出Akka框架的工作原理和定位——Akka框架就是一套自动机运行时环境,基于Akka框架编程就是在定义自动机如何处理事件...基于这一等价性,读者可以利用现代计算机的本地时钟、时钟同步协议以及原子钟等技术弥补网络的不足,即使在网络异步的情况下,也可以实现同步系统。...精彩书评 本书从算法与系统模型开始,详细论述了分布式系统涉及的链路、失败检测和选主、可靠广播、共享内存、共识、基于时钟的算法等核心内容,这些知识是构建大型分布式系统的底层架构时需要使用的,也是比较有难度和复杂性的内容
领取专属 10元无门槛券
手把手带您无忧上云