【问题标题】:Using groovy actors to maximise throughput from database?使用 groovy 演员来最大化数据库的吞吐量?
【发布时间】:2010-12-16 10:04:13
【问题描述】:

我正在使用 GPars 库,同时努力提高匹配系统的可扩展性。我希望能够在同时处理结果的同时查询数据库并立即查询数据库。瓶颈是从数据库中读取数据,所以我想让数据库保持全时忙碌,同时在结果可用时异步处理结果。我意识到我可能对演员框架的工作方式有一些基本的误解,我很乐意得到纠正!

在伪代码中,我正在尝试执行以下操作:

定义两个参与者,一个用于对数据库运行选择,另一个用于处理记录。

  1. queryActor 查询数据库并将结果发送到 processorActor
  2. queryActor 立即再次查询数据库,无需等待 processorActor 完成

我或许可以在不使用参与者的情况下实现简单的用例,但我的最终目标是拥有一个参与者池,该池始终处理具有潜在不同数据源的新查询,以便总体上提高系统的吞吐量。

处理Actor的速度总是比数据库查询快得多,所以我想将来同时查询多个副本。

      def processor = actor {
    loop {
      react {querySet ->
        println "processing recordset"
        if (querySet instanceof Object[]) {
          MatcherDataRowProcessor matcher = new MatcherDataRowProcessor(matchedRecords, matchedRecordSet);

          matchedRecords = matcher.processRecordset(querySet);
          reply matchedRecords
        }
        else {
          println 'processor fed nothing, halting processor actor'
          stop()
        }
      }
    }
  }

  def dbqueryer = actor {
    println "dbqueryer has started"

    while (batchNum.longValue() <= loopLimiter) {
      println "hitting db"
      Object[] querySet
      def thisRuleBatch = new MatchRuleBatch(targetuidFrom, targetuidTo)
      thisRuleBatch.targetuidFrom = batchNum * perBatch - perBatch
      thisRuleBatch.targetuidTo = thisRuleBatch.targetuidFrom + perBatch
      thisRuleBatch.targetName = targetName
      thisRuleBatch.whereClause = whereClause
      querySet = dao.getRecordSet(thisRuleBatch)
      processor.send querySet
      batchNum++
    }

    react { processedRecords ->
      processor.send false
    }
  }

【问题讨论】:

    标签: java database concurrency groovy parallel-processing


    【解决方案1】:

    我建议查看 GPars 用户指南的Dataflow Concurrency 部分中的数据流队列。您可能会发现 Dataflows 为您手头的问题提供了更好/更清晰的抽象。数据流也可以与参与者一起使用。

    我认为在这种情况下,actor 或数据流都可以工作,并且认为决定归结为哪一个提供的抽象更接近您想要完成的目标。对我来说,任务、队列、数据流的概念似乎更适合术语。

    【讨论】:

    • 感谢您的回答约翰。我正在查看 gpars 库中的各种模式,实际上我尝试的第一个模式是数据流模式。当时我还没有走那么远,但我应该完成那个实现,看看结果如何。
    【解决方案2】:

    经过更多研究,我发现 Gpars 中的 DataFlow 并发内容实际上是 Actor 支持的 built on top。 gpars java 演示分发中的 DataflowOperatorTest(我需要做一个 java 实现)似乎很适合我需要做的事情。主线程等待填充多个流输入,在我的例子中是并行数据库查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多