首先简单介绍一下 AKKA:
Akka是一个开发库和运行环境,可以用于构建高并发、分布式、可容错、事件驱动的基于JVM的应用。使构建高并发的分布式应用更加容易。
在本章中,我们尝试建立一些共同的术语,来为akka的目标并发和分布式系统的交流打一个坚实基础。值得注意的是,对于许多术语并没有一致的定义。我们仅仅简单地寻求在akka文档的范围中能使用的定义。
2.1.1 并发与并行
并发和并行是两个相近的概念,但是又有微小的差别。并发性是指两个或多任务正在运行,但是它们可能不会被同时执行。例如时间分片技术,任务被划分为小的片并且与其他任务片混合,然后按照顺序执行。并行则是真正的同时的执行。
2.1.2 异步与同步
如果调用者直到该方法返回一个值或抛出异常之前都无法继续处理,我们认为方法调用是同步的。相反,异步调用则允许调用者继续处理后续的逻辑,当该方法调用 完成的时候可通过一些额外的机制(它可能是callback, Future, message)来发出信号通知调用者。 一个同步的API可以使用阻塞来实现同步,但这并不是必需的。一个CPU密集型的任务,可能会达到阻塞类似的效果。在一般情况下,优选使用异步API,因 为它们保证系统能继续运行。Actors天然就是异步的:一个Actors发送消息后,不必等待消息实际交付可以继续运行。
2.1.3非阻塞与阻塞
如果一个线程的延迟可以无限期地推迟其他的线程,我们认为是阻塞的。一个很好的例子是在互斥场景下可供一个线程使用的某项资源。如果一个线程无限期的持有 资源(例如:无限循环)等待该资源的其他线程则不能继续运行。相比之下,无阻塞意味着没有线程能够无限期地拖延其他线程。
相比阻塞,优先选择无阻塞的操作,因为当包含阻塞操作时系统处理的整体进度明显不能得到保证。
相比阻塞,优先选择无阻塞的操作,因为当包含阻塞操作时系统处理的整体进度明显不能得到保证。
2.1.4 死锁与饥饿与活锁
若干竞争参与者都在等待对方达到特定的状态才能继续运行,称为死锁。由于在其他参与者没有到达特定状态时,没有任何参与者可以继续运行(“第二十二条军 规”的问题),所有受影响的子系统将会阻塞。死锁与阻塞是密切相关的,一个参与的线程能够无限的延缓其他线程的进度。 在死锁的场景中,没有参加者可以继续处理,相比之下饥饿发生时,有参与者能继续处理,但可能有一个或多个则不能。典型的场景是一个简单调度算法,总是选择高优先级任务优先低优先级任务运行。如果高优先级任务的数量不断增加,低优先级的任务将被永远不会处理。
与死锁类似,活锁同样是没有一个参与者可以继续运行。所不同的是,它不是等待其他线程导致状态被阻塞,而是参与者不断地改变自己的状态。一个示例场景 是,当两个参与者有两个相同的可用资源。它们各自尝试获取资源,但同时它们也检查是否对方也需要改资源。如果该资源同时被对方参与者请求,他们则试图获得 另一个的资源的实例。在不幸的情况下,它可能导致两个参与者在两种资源之间“来回的请求”,但是总是屈从于对方。始终没法获得它,
2.1.5竞争条件(Race Condition)
假设一组事件的顺序可能被外部不确定性的因素影响我们把它叫做竞争条件。竞争条件经常出现在当多个线程共享可变状态,并且线程对状态操作可能由于意外行为 发生会交错。虽然这是一种常见的情况,但是共享的状态不是竞争条件的必要条件。举例:客户端发送无序的数据包(例如UDP数据报)P1,P2到服务器。数 据包可能经由不同的网络路径,服务器先接收到P2之后收到P1。如果发送的信息没有包含其发送顺序,服务端就无法确定消息的顺序。根据报文的内容这可能会 导致竞争条件。
2.1.6 非阻塞的保障(Non-blocking Guarantees)
如在前面的章节中讨论的,导致阻塞有几种原因,包括危险的死锁和系统吞吐量减少。在下面的章节中,我们讨论各种非阻塞的特性。- 无等待(Wait-freedom)
如果每次调用可以保证在有限步骤内完成,则该方法是无等待的(wait-free)。如果方法的步骤有一个有限的上限,则该方法为有限的无等待(bounded wait-free)。
从这个定义可以得出:无等待的方法永远不会阻塞,因此死锁是不可能发生的。此外,因为每个参与者都可以经过有限步骤后继续运行(当调用完成),无等待的方法也不会发生饥饿。
从这个定义可以得出:无等待的方法永远不会阻塞,因此死锁是不可能发生的。此外,因为每个参与者都可以经过有限步骤后继续运行(当调用完成),无等待的方法也不会发生饥饿。
- 无锁(Lock-freedom)
无锁相比无等待是一种更弱的属性。在无锁的情况下,无绝大部分方法在有限步骤内完成。这个定义意味着,无锁的方法不能产生死锁。另一方面,部分调用在有限的步骤内完成并不能保证所有的都可以最终完成。换句话说,无锁不足以保证不产生饥饿。
- 无障碍 (Obstruction-freedom)
无障碍是这里讨论的最弱无阻塞的属性。如果在一个时间点后,方法隔离执行(其它线程没有任何执行,例如:暂停),并且它在有限数量的步骤内完成,该方法被称为梗阻免费的。所有无锁的对象是无障碍的,但相反则不成立。
乐观并发控制(Optimistic concurrency control (OCC) )的方法通常是无障碍的。OCC的做法是,每一位参与者试图执行共享对象上的操作,但是如果检测到来自其他参与者的冲突,则修改回滚,并按照一定的时间表再次尝试。如果在某一个时间点,其中的参与者是唯一一个尝试的线程,操作就会成功。
2.1.7文献推荐
• The Art of Multiprocessor Programming, M. Herlihy and N Shavit, 2008. ISBN 978-0123705914
• Java Concurrency in Practice, B. Goetz, T. Peierls, J. Bloch, J. Bowbeer, D. Holmes and D. Lea, 2006. ISBN 978-0321349606
• Java Concurrency in Practice, B. Goetz, T. Peierls, J. Bloch, J. Bowbeer, D. Holmes and D. Lea, 2006. ISBN 978-0321349606
相关推荐
akka-kryo-serialization, 基于Kryo的Akka序列化 akka-kryo-serialization-- Scala 和Akka基于kryo的序列化程序这个库为 Scala 和Akka提供定制的基于kryo的序列化程序。 它可以用于更高效的akka远程处理。它还可以...
akka-persistence-sql-async, 一个用于akka持久性的日志和快照存储 akka-persistence-sql-async 的日志和快照存储插件( akka持久化插件。 Akka-persistence-sql-async执行由 scalikejdbc异步查询,它提供非阻塞api来...
赠送jar包:akka-actor_2.11-2.5.19.jar; 赠送原API文档:akka-actor_2.11-2.5.19-javadoc.jar; 赠送源代码:akka-actor_2.11-2.5.19-sources.jar; 赠送Maven依赖信息文件:akka-actor_2.11-2.5.19.pom; 包含...
在使用`akka-actor-1.0-RC2.jar`时,可能还需要其他的依赖包,如Scala库(如果使用Scala编写Actor),或者其他Akka模块如`akka-cluster`(用于构建分布式系统)和`akka-logback`(日志集成)。确保正确配置这些依赖...
`akka-typed-actor-1.0-RC2.jar`是Akka Typed Actor的特定版本库,包含了该版本的所有功能。在项目中引入此jar包,即可使用其中的类和API来开发和运行Typed Actor应用。 总结,Akka Typed Actor通过引入强类型的...
总之,"akka-http-1.0-RC2.jar.zip"是一个包含了构建和运行高性能HTTP服务所需的关键组件的压缩包,它是基于Akka框架的,具有响应式、流式处理、路由定义和Actor系统集成等优势,是开发现代Web应用程序的有力工具。
《Akka in Action》是一本深入探讨Akka框架的书籍,源代码提供了书中示例的实现,便于读者理解和实践。Akka是用Scala语言编写的,用于构建高度并发、分布式和反应式的应用程序。它基于Actor模型,是Lightbend公司...
- **akka-stream** 和 **akka-stream-testkit**:Akka 流处理库及其测试工具。 通过对源码的深入阅读,我们可以学习到 Akka HTTP 如何实现高效的 HTTP 服务器和客户端,以及如何利用 Akka Streams 和 actor 模型...
Akka-Persistence-Dynamodb akka-persistence-dynamodb将日记和快照条目写入DynamoDB。 它实现了完整的akka-persistence-query API,因此对于使用Akka和Scala来创建React性应用程序来实现DDD风格的应用程序模型...
akka-data-replication, 在Akka集群中,复制 CRDTs Akka分布式数据这个库的( akka-data-replication ) 已经包含在Akka中,在模块中分发数据。英镑不在/akka-data-replication中维护。 所有 Bug 修复和新功能将在 ...
标题中的"akka-stm-1.0-RC2.jar.zip"是一个压缩文件,它包含了一个名为"akka-stm-1.0-RC2.jar"的Java档案(JAR)文件。这个JAR文件是Akka STM(Software Transactional Memory,软件事务内存)的一个特定版本,版本...
总结,"akka-streams-kafka-examples-源码.rar"包含的源码实例为我们展示了如何利用Akka Streams的强大功能和Kafka的分布式能力,构建出高可用、高性能的数据处理解决方案。通过研究这些示例,开发者能够更好地掌握...
兼容性Scala 2.12和Akka 2.5.x 使用0.9.0以上的版本resolvers += Resolver.jcenterRepo // Adds Bintray to resolvers for akka-persistence-redis and rediscalalibraryDependencies ++= Seq(...
akka-docker-cluster-example, 支持 Docker 支持的akka集群项目示例 akka-docker-cluster-example支持 Docker 支持的akka集群项目示例。 请参见博客文章 。 使用 SBT本机打包程序。:如何运行在SBT中,运行 docker:...
标题"akka-kryo-serialization.zip"表明这是一个关于 Akka 使用 Kryo 进行序列化的项目。这个项目很可能是为了提高 Akka 中对象序列化的效率和性能,因为 Kryo 比标准的 Java 序列化要快得多。Kryo 的序列化方式也更...
在实际项目中,使用“akka-actor-1.1.2.jar.zip”时,开发者通常会结合Akka的其他模块,如Akka Streams(用于处理数据流)、Akka Persistence(用于持久化Actor状态)等,构建出高度灵活和可扩展的应用程序。...
Akka-Persistence-Mongo 通过集成 Akka Persistence 和 MongoDB,为开发者提供了一种高效且可靠的分布式系统状态持久化方案。它充分利用了 MongoDB 的灵活性和性能,以及 Akka 的反应式编程模型,是构建大规模、容错...