2012-11-17 3 views
3

나는 몽고의 작업 대기열을 구현하고 싶습니다. 전체 소프트웨어 시스템은 Mongo를 기반으로하므로 자연스럽고 잠재적으로 적합합니다.작업 큐에 대한 올바른 몽고 스키마 디자인은 무엇인가?

작업 수집 저장 문서로 각 작업 상태입니다. 나는 이것을 나의 쿼리 요구에 기초한 uncapped collection으로 상상한다. 수집 될 작업에 대한

{ 
    "_id" : ObjectId("50a6742ee4b0a9a1c2cb4fd4"), 
    "type" : "archive_job", 
    "state" : 2, 
    "priority" : 1, 
    "timing" : { 
     "submitted": ISODate(...), 
     "running": ISODate(...), 
     "completed": ISODate(...), 
     "failed": null, 
     "cancelled": null 
    }, 
    payload: { 
     ...job-specific JSON... 
    } 
} 

일반적인 액세스 패턴 : 기록한 작업은 다음과 같이

  • 유형, 상태에 따라 실행되지 않은 작업을 찾을 수 , 우선에 가능한 범위 쿼리 previo보다 큰 timing.submitted 우리는 상태가 을 실행하는 경우 (
  • 이 _id하여 특정 직업을 찾을
  • 찾을 모든 처리되지 않은 (제출, 실행) 작업을 모두 처리 (완료, 실패, 취소) 취업을하고 페이로드를 검색하는 시간을
  • 읽기)

대량의 쿼리는 실행이 필요한 처리되지 않은 작업을 찾는 것입니다. 가치가 있습니까 페이로드jobs_payload 컬렉션으로 옮길 가치가 있습니까? 컬렉션에서 문서 크기가 크게 변하지 않으십니까?

처리 된 많은 양의 (완료가 취소 실패) 것인가, 처리되지 않은 작업 대, 결국 작업 집합 메모리는 작업 컬렉션에 필요한이 증가 할? 처리되지 않은 작업에 대한 액세스 시간이 올바른 색인을 사용하더라도 더 느리게됩니까?

스키마 디자인으로 할 수있는 대안과 장단점은 무엇입니까?

답변

0

페이로드를 jobs_payload 모음으로 옮겨 문서 크기가 작업 모음에서 크게 변하지 않는 동안 가치가 있습니까?

일반적으로 mongodb에 삽입하는 것이 좋습니다. 귀하의 경우에는 괜찮습니다.

많은 양의 처리 된 (완료, 실패한, 취소 된) 대 처리되지 않은 작업은 결국 작업 모음에 필요한 작업 집합 메모리를 증가시킬 것입니까? 는 처리되지 않은 작업에 대한 액세스 시간은 실행 속도가 느린 경우에도 올바른 지표로 할 수 있습니까?

데이터베이스가 메모리 둔화에 적합하지 않은 것으로 나타났습니다.

당신 스키마 확인을 보인다. 예를 들어 celery (mongodb 백엔드가 있음) 스키마를 볼 수 있습니다.

+0

나는 Mongo에서 문서 삽입이 강조되었음을 동의합니다. 필자의 경우 * payload * 필드를 포함시키지 않으면 ** jobs ** 콜렉션에 각 문서의 저장 용량이 증가하므로 읽기 시간이 단축됩니까? – abargnesi

+0

케이스에 포함 시키면 읽기 시간이 크게 줄어들지 않지만 (필요한 필드의 하위 집합을 읽을 수 있음) 의심 할 여지없이 쿼리 수가 줄어 듭니다. – g1zmo

+0

포함하면 문서 크기가 증가합니다. 그러나 나는 그 변형이 정말로 크지 않다고 추측하고있다. (1MB에서 5MB가 아님) 처리 된 데이터를 자주 조회하지 않으려면 작업 세트가 증가하지 않습니다. 그렇지 않으면 작업 세트의 일부입니다. 팁 : 일부 데이터를 저장하려면 _id ObjectId를 제출 된 시간으로 활용할 수 있습니다. – Marc