2010-12-16 4 views
2

일치하는 시스템의 확장 성을 개선하기 위해 노력하면서 GPars 라이브러리를 가지고 놀고 있습니다. 나는 결과를 동시에 처리하는 동안 데이터베이스를 쿼리하고 즉시 데이터베이스를 쿼리 할 수 ​​있기를 원합니다. 병목 현상은 데이터베이스에서 읽는 중입니다. 따라서 데이터베이스를 항상 사용중인 상태로 유지하면서 사용 가능한 경우 비동기 적으로 결과를 처리하고 싶습니다. 액터 프레임 워크가 어떻게 작동하는지에 대한 근본적인 오해가있을 수 있으며 수정 될 수있어서 기쁩니다. 의사 코드에서그루비 액터를 사용하여 데이터베이스의 처리량을 극대화 하시겠습니까?

나는 다음을 수행하려고 해요 :

두 배우, 레코드를 처리하는 데이터베이스에 대해 선택을 실행하기위한 하나의 또 다른 정의.

  1. queryActor querys 데이터베이스와는 processorActor로 결과를 전송
  2. queryActor 즉시 행위자를 사용하지 않고

아마 간단한 사용 사례를 달성 할 수있는 마무리 processorActor을 기다리지 않고 다시 데이터베이스를 querys

  • 하지만 내 최종 목표는 일반적으로 시스템의 처리량을 증가시키기 위해 잠재적으로 다른 데이터 소스로 새로운 쿼리를 작업하는 액터 풀이 있어야합니다.

    처리 액터는 항상 데이터베이스 쿼리보다 훨씬 빠르며 앞으로 여러 복제본을 동시에 쿼리하고 싶습니다.

     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 
        } 
        } 
    
  • 답변

    1

    나는 GPars에 대한 사용자 가이드의 Dataflow Concurrency 섹션에서 데이터 흐름 대기열에서 살펴 본다 제안했다. Dataflow는 더 나은 /보다 깨끗한 추상화를 제공합니다. 데이터 흐름은 액터와 함께 사용할 수도 있습니다.

    나는이 상황에서 배우 나 데이터 흐름 중 하나가 작동한다고 생각하고 달성하려고하는 것과 더 가까운 추상화를 제공하는 결정이 내려 졌다고 생각합니다. 나에게 태스크, 큐, 데이터 흐름의 개념은 용어에 더 가깝다.

    +0

    답변 해 주셔서 감사합니다. gpars 라이브러리의 다양한 패턴을보고 있었고 실제로 시도한 첫 번째 패턴은 데이터 흐름 패턴이었습니다. 나는 그 때 그걸로 멀리 가지 못했지만 그 결과를보기 위해 그 구현을 마무리해야합니다. – barrymac

    0

    더 많은 연구를 한 후 Gpars의 DataFlow 동시성 항목이 실제로 built on top이라는 액터를 지원한다는 사실을 발견했습니다. gpars java 데모 배포판의 DataflowOperatorTest (Java 구현을 수행해야 함)는 내가해야 할 일과 잘 어울리는 것 같습니다. 메인 스레드는 필자의 경우 병렬 데이터베이스 쿼리 인 여러 스트림 입력이 채워지기를 기다립니다.

    관련 문제