나는 몽고의 작업 대기열을 구현하고 싶습니다. 전체 소프트웨어 시스템은 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 컬렉션으로 옮길 가치가 있습니까? 컬렉션에서 문서 크기가 크게 변하지 않으십니까?
처리 된 많은 양의 (완료가 취소 실패) 것인가, 처리되지 않은 작업 대, 결국 작업 집합 메모리는 작업 컬렉션에 필요한이 증가 할? 처리되지 않은 작업에 대한 액세스 시간이 올바른 색인을 사용하더라도 더 느리게됩니까?
스키마 디자인으로 할 수있는 대안과 장단점은 무엇입니까?
나는 Mongo에서 문서 삽입이 강조되었음을 동의합니다. 필자의 경우 * payload * 필드를 포함시키지 않으면 ** jobs ** 콜렉션에 각 문서의 저장 용량이 증가하므로 읽기 시간이 단축됩니까? – abargnesi
케이스에 포함 시키면 읽기 시간이 크게 줄어들지 않지만 (필요한 필드의 하위 집합을 읽을 수 있음) 의심 할 여지없이 쿼리 수가 줄어 듭니다. – g1zmo
포함하면 문서 크기가 증가합니다. 그러나 나는 그 변형이 정말로 크지 않다고 추측하고있다. (1MB에서 5MB가 아님) 처리 된 데이터를 자주 조회하지 않으려면 작업 세트가 증가하지 않습니다. 그렇지 않으면 작업 세트의 일부입니다. 팁 : 일부 데이터를 저장하려면 _id ObjectId를 제출 된 시간으로 활용할 수 있습니다. – Marc