【问题标题】:akka: sharing mutable stateakka:共享可变状态
【发布时间】:2011-09-05 11:14:12
【问题描述】:

我需要一个很少更改的全局变量(单例)。实际上它只在actor重新启动时改变,并重新初始化变量。由于我无法使用伴生对象中的单例 val 执行此操作,因此我必须将其声明为 var(可变)。

object UserDatabase {
    var dbConnection = "" // initializing db connection
}

我阅读的许多指导方针总是反对共享可变状态。所以我将变量移动到类并使用消息传递来检索变量。

class UserDatabase extends Actor{
    val dbConnection = "" // initializing db connection locally
    def receive = {case GetConnection => self.reply(dbConnection)}
}

问题是,dbConnection 被很多..很多参与者非常频繁地访问,并且不断发送消息会降低性能(因为 akka 进程邮箱一个接一个)。

我不知道如何在不牺牲性能的情况下做到这一点。任何的想法?

【问题讨论】:

    标签: scala functional-programming akka


    【解决方案1】:

    【讨论】:

    • 我只是浏览了文档,我认为这就是我需要的。谢谢 !无论如何,我想,由于不推荐使用 akka 持久性,许多开发人员都在努力为 akka DAO 找到一些流行数据库的最佳设计模式。如果有教程会很高兴。
    • 我推荐做 EventSourcing
    【解决方案2】:

    首先,您是否实际测量/注意到性能下降?由于消息传递是轻量级的,因此对于您的应用程序来说可能已经足够快了。

    然后,一个可能的解决方案:如果“全局”状态很少写入,但经常访问,您可以选择 push 策略。每次更改时,UserDatabase 演员都会将更新后的值发送给感兴趣的演员。然后,您可以使用发布/订阅方法、依赖参与者注册、使用参与者池等。

    class UserDatabase extends Actor{
        var dbConnection = "" // initializing db connection locally
        def receive = {
          case SetConnection( newConnection ) if dbConnection != newConnection => {
            dbConnection = newConnection
            sendUpdatedConnection(); // sends the change to every relevant actor
          }
        }
    }
    

    【讨论】:

    • 是的,有减少。我使用 10000 Future 做了简单的并发测试,结果很明显。发布者-订阅者模式将涉及保存订阅者列表。我想说这不能满足我的需要,因为我的大多数演员都是短暂的(因此注册-注销很多)。我想关键是我不需要串行读取/同步那个演员的提供。我需要并发读取,串行写入。
    【解决方案3】:

    如果您在任何情况下都不需要经常使用该变量,则将其设为java.lang.concurrent.atomic.AtomicReference 或将其每次访问都包装在synchronized 块中(在变量上)可能更简单、更有效.演员并不总是总是让事情变得更容易和更安全,只是通常。

    【讨论】:

    • 如果你想要高吞吐量,synchronized 可能不是一个好的解决方案。原子和显式锁都可以:ibm.com/developerworks/java/library/j-jtp11234
    • @paradigmatic - 我指定了一个低争用案例。如果竞争激烈,我同意 atomics 或 ReentrantReadWriteLocks(或将价值广播给需要它的演员)更好。
    • OP 专门要求高争用案例。
    【解决方案4】:
    1. 创建多个 Actor 作为 RoundRobinRouter 的路由。
    2. 让每个参与者处理一个连接并实际处理数据库逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2023-03-22
      相关资源
      最近更新 更多