scala - 处理应用程序级并发 - 我有什么选择?

标签 scala concurrency transactions actor aggregateroot

我们有一个薄 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/

相关文章:

scala - Scala 中的捆绑导入

scala - 如何找到两个 Option[Int] 的 min() 或 max()

sql - 你如何处理多线程的陈旧数据?

java - Spring @Transactional 不工作

scala - 在 Scala 的构造函数上重新分配一个 var 参数

scala - 如何将具有值的 Map 对象数组转换为单个 Map

.net - redis在用户注册时如何处理并发写请求

c# - 如何在 BlockingCollection<T> 实例上进行可中断等待?

java - Spring数据redis并发问题

java - 以编程方式在 Spring 回滚事务