我们有一个薄 Web 层 ( Scalatra ),它将传入的 HTTP 请求转换为发送到线程绑定(bind)事件处理参与者的事件(案例类)。某些事件包含聚合根的 id,由于各种原因我们需要对其进行变异。应用程序数据总量太大,无法容纳在内存中,因此我们需要在对其进行操作之前,通过其 ID 从数据源中检索聚合。当然,我们不希望事件处理 Actor 被阻塞,因此我们的想法是生成一个新的(基于事件?) Actor 来加载数据、对其进行变异并将其存储回数据中来源。理想情况下,我希望处理应用程序中的并发性,而不是依赖数据源的 ACID 功能。基本上我需要对每个聚合进行序列化/事务访问。
这可以通过 Actor 来实现吗? 最好的方法是什么? 在包含以聚合根 id 为键的参与者的事件处理参与者中保留 ConcurrentHashMap 吗?
或者我们是否必须涉及 STM:s (ScalaSTM/Akka) 或类似的东西?
最佳答案
您可以将您的“聚合根”表示为 Actor 。当您想要改变聚合根时,您可以从请求处理参与者发送一条消息来执行此操作。您还可以拥有一个中间代理 Actor,它将消息转发给正确的 Actor,并通过实例化表示按需数据的 Actor 并根据需要停止它们来管理聚合根 Actor 的缓存(按 id)。 如果您需要协调表示数据的参与者之间的突变,则需要 STM。
关于scala - 处理应用程序级并发 - 我有什么选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8391947/