2013-10-30 3 views
1

몇 가지 데이터 마이그레이션 작업을 실행하려는 데이터베이스 문서 집합 (수천 개)이 있습니다. 이 문서들 각각은 Windows 파일 시스템에서 다른 파일에 대한 참조를 보유합니다. 이러한 파일은 공유 폴더를 통해 액세스되는 파일 서버에 저장됩니다. 파일에서 파일의 다른 위치로 파일을 이동하고 문서의 속성을 기반으로 파일을 다시 정렬합니다.Akka는 사용 가능한 리소스를 기반으로 배우를 규제합니까?

나는 다음과 같은 설계의 생각 :

  1. 데이터베이스를 조회하고 그
  2. 이 배우의 각각은 자신의 관련 파일을 복사 할 책임이 될 문서 당 하나의 배우로 급부상 한 배우을 가지고 그 이 배우의 각각의 작업을 완료하면, 어떤 예외
  3. 처리의 새로운 위치, 그것은 결과의 중앙 배우를 알려줍니다 (성공/실패)

이것은 순진한 디자인입니까? 얼마나 많은 액터가 생성되는지를 조절해야합니까, 아니면 Akka가 프로세서 가용성에 따라 할당 된 리소스를 조절해야합니까? 너무 많은 요청을 동시에 활성화하는 파일 시스템 측면에 문제가있을 수 있습니까?

+0

offtopic :이 특별한 경우에는 병렬 컬렉션을 사용하는 것이 좋습니다. –

+0

@ om-nom-nom : 흥미 롭습니다. (sourcePath, destinationPath) 요소를 가진 콜렉션을 가졌다가 복사 연산의 결과에 따라 성공/실패를 반환하는 함수로 매핑하는 것을 의미합니까? – Eduardo

+0

예, 다소 차이가 있습니다 :'val xs = Seq (src -> dst, ...); xs.par.map {시도 (...)}'+ [병렬 힌트] (http://stackoverflow.com/q/14207762/298389) - 배우의 무리보다 간단해야합니다 –

답변

2

akka의 기본 스레드 풀/실행 컨텍스트/디스패처에는 코어 당 하나의 스레드와 같은 것이 있습니다. 파일 이동은 아마도 차단 작업 일 수 있으므로 코어가있을 때만 파일을 이동할 수 있습니다. 그 시간 동안 다른 배우가 호출되지 않습니다.

더 많은 병렬 작업을 수행하기 위해 더 많은 스레드를 사용하도록 디스패처를 구성하거나 파일 이동 액터를 다른 액터와 간섭하지 않는 특정 디스패처에 배치 할 수 있습니다.

문서를 시스템을 통과하는 메시지로 보는 것이 더 좋을지도 모릅니다. 한 끝에서 각 문서를 메시지로 열거하고 파일의 속성을 구문 분석하여이를 파일로 전달하는 액터로 보내십시오. 실제 움직이는 배우. 이렇게하면 디스크의 처리량에 따라 파서 - 액터 인스턴스 수와 무버 - 액터 인스턴스 수를 결정할 수 있습니다.

관련 문제