【问题标题】:Handling application level concurrency - what's my options?处理应用程序级并发 - 我有什么选择?
【发布时间】:2011-12-05 21:13:10
【问题描述】:

我们有一个瘦 Web 层 (Scalatra),它将传入的 HTTP 请求转换为发送到 线程绑定 事件处理参与者的事件(案例类)。一些事件包含聚合根的 id,由于各种原因我们需要对其进行变异。应用程序数据的总量太大而无法放入内存,因此我们需要在对其进行操作之前通过其 id 从数据源中检索聚合。当然,我们不希望事件处理参与者阻塞,因此我们的想法是生成一个新的(基于事件的?)参与者来加载数据、对其进行变异并将其存储回数据中来源。理想情况下,我想在应用程序中处理并发,而不是依赖数据源的 ACID 功能。基本上我需要对每个聚合进行序列化/事务访问。

这可以使用演员来实现吗? 最好的方法是什么? 在事件处理参与者中保留ConcurrentHashMap,其中包含以聚合根 ID 为键的参与者?

或者我们是否必须涉及 STM:s (ScalaSTM/Akka) 或类似的东西?

【问题讨论】:

    标签: scala concurrency transactions actor aggregateroot


    【解决方案1】:

    您可以将您的“聚合根”表示为参与者。当您想要改变聚合根时,您可以从您的请求处理参与者发送消息来执行此操作。您还可以拥有一个中间代理 Actor,它将消息转发给正确的 Actor,并通过实例化一个表示按需数据的 Actor 并根据需要停止它们来管理 聚合根 Actor(按 id )的缓存如果您需要在代表数据的参与者之间协调突变,则需要 STM。

    【讨论】:

    • 无论聚合 id 是什么,broker actor 在加载/缓存数据时仍然需要阻塞,对吧?
    • 如果我可以将所有数据保存在内存中,那么在每个聚合根周围包装一个参与者会很容易。将一些数据保存在数据库中,而将一些数据缓存在内存中,会使情况变得非常复杂。我担心处理(并发)LRU 缓存很难正确处理。也许我应该有一组固定的演员并使用循环?这当然需要使用例如对聚合根 id:s 进行分区。模数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多