AKKA 学习(一)--- AKKA 2.1 术语和概念
程序员文章站
2022-05-09 12:12:37
...
首先简单介绍一下 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