2011-04-27 3 views
0

나는 데이터베이스에서 100 개의 레코드를 선택하고 루비 데몬을 가지고 작업을 수행한다.Ruby에서 여러 프로세스간에 작업을 배포하려면 어떻게해야합니까?

더 빠르게 만들려면 대개 동일한 데몬의 인스턴스를 3 개 만듭니다. 그리고 각각은 mysql LIMITOFFSET을 사용하여 다른 데이터를 선택합니다.

문제는 동일한 데이터 레코드로 2 ~ 3 번 작업이 수행되는 경우가 종종 있습니다.

그래서 데이터베이스 LIMITOFFSET만을 신뢰한다고해서 충분하지 않습니다 ... 2 개 이상의 데몬이 동일한 데이터를 동시에 수집 할 수 있기 때문에 가끔씩입니다.

어떻게 안전하게 처리 할 수 ​​있습니까? 2 개 인스턴스를 피하는 것은 동일한 데이터를 선택

  • 데몬 1 => 선택 1
  • (100) 데몬의 레코드 2 => 선택 101
  • (200) 데몬의 레코드 3 => 201 300에 레코드를 선택

답변

3

자신의 솔루션을 롤링하는 대신 Resque (개인 즐겨 찾기)과 같은 백그라운드 작업 처리를위한 기존 솔루션을 살펴볼 수 있습니다. Resque를 사용하면 웹 사이트의 링크와 같이 응용 프로그램에서 의미가있는 트리거를 사용하여 각 행에 대한 작업을 대기열에 추가 할 수 있습니다. 항상 X 개의 작업자를 계속 실행하고 (귀하의 경우 3 개) Resque가 대기열 관리 작업을 수행합니다. Resque는 Redis를 백엔드로 사용하므로 게이트에서 원자 밀어 내기/팝 아웃을 지원합니다 (더 이상 이중 처리가 필요 없음).

Resque는 작업 및 작업자를 모니터링하기 위해 매우 직관적이고 사용하기 쉬운 웹 인터페이스를 제공합니다.

+0

현재 저는 Ruby의 Daemons gem (github.com/mikehale/daemons)을 사용하고 있습니다. 내가하는 일은 실행중인 인스턴스 수를 확인하고 각 데몬 인스턴스에 LIMIT 및 OFFSET이있는 PARAMS를 전달하는 것입니다. 그래서 ... 1000 개의 이메일을 보낼 경우 각 데몬 인스턴스는 100 개의 데이터베이스 행을 선택합니다. 하지만 때로는 2 ~ 3 번 배달되는 행이나 이메일을 받고 있습니다. 두 데몬의 인스턴스가 동일한 데이터베이스 행을 선택한다는 것을 의미합니다. – newx

+0

나는 당신의 문제가 무엇인지 이해합니다. 내가 말하고자하는 것은 당신이이 논리를 다루는 당신의 시간을 낭비하지 말아야한다는 것입니다. 사람들은 이미 배경 작업을 처리하는 데 큰 도움이되는 도서관을 만들기 위해 수 시간의 시간을 투자했습니다. 당신은 일 자체에 집중해야합니다. 즉, 당신은 방금 SQL에서 버그를 발견했습니다. – bloudermilk

+0

답변 해 주셔서 감사합니다 ... 지금 Resque를 검토하여 응용 프로그램을 개선 할 수있는 방법을 알려드립니다 ... 감사합니다. – newx

관련 문제