诸如参与者和代理之类的消息处理模型的优点之一是,传统的并发问题(主要是共享状态的同步)不再是问题。actor可以保留私有状态,并可以不加锁地自由更新它。actor框架可确保一次仅处理一条消息。通过序列化处理,可以以无锁方式编写代码。
在用户保存表单的示例中,假设参与者正在保留每个表单中的一些数据的列表,则参与者可以在不加锁的情况下更新列表,因为该框架保证一次只能处理一个表单。传统上,您将必须锁定列表访问权限或使用并发列表。
并发策略是一个稍微不同的问题,仍然是您的责任(没有策略是最常见的策略)。为了稍微更改您的示例,假设两个用户都尝试同时更新SAME表单实例。如果没有并发策略,一个人的更改将覆盖另一个(可能是最后一个获胜)。没关系,但是充其量只能导致更改被覆盖的用户无法预期的行为。如果他们查看刚刚更改的表单,它将具有意外的值(来自其他用户)。在最坏的情况下(当我们不仅在讨论表单更新时,还在讨论运输订单之类的事情时)可能会导致各种损失(时间,收益等)。
使用并发策略有助于识别这些情况,并能够根据业务规则解决它们。例如,Optimistic Concurrency使用户发送要更新的表单的版本。当参与者执行更改时,它会注意到第二位用户认为该表单正在更新版本5,因为该表单实际上是版本6,因为第一个用户进行了更新。现在至少我们可以通知第二个用户,自他们开始编辑表格以来,该表格已经更改。或企业要在此处执行的任何规则。
在更新表单的情况下,您可能不太在乎并发(我想这取决于情况)。但是在其他情况下,至少能够检查和处理违规行为可能是非常重要的事情。您甚至可能要忽略并发冲突,例如如果用户更改了不同的部分(以继续表格类推)。或者,如果更改对业务有重大影响(大订单),则您要接受该更改并在以后解决小冲突(例如,年度联系信息更新尚未完成)。
我相信Akka还有很多其他方面,例如如何处理故障,主管等等,这些都是开发人员的重要考虑因素。