2012-03-21 4 views
4

저는 셀러 리/AMQP를 처음 접했고 다음 요구 사항을 충족시키기 위해 작업/대기열/작업자 디자인을 제시하려고합니다.셀러리 디자인 도움말 : 동시에 실행되는 작업을 방지하는 방법

여러 가지 유형의 '사용자 별'작업이 있습니다 (예 : TaskA, TaskB, TaskC). 이러한 각 "사용자 별"작업은 시스템의 특정 사용자에 대한 데이터를 읽거나 씁니다. 따라서 주어진 시간에 User1_TaskA, User1_TaskB, User1_TaskC, User2_TaskA, User2_TaskB 등의 작업을 생성해야 할 수도 있습니다.에 대해 이 필요하고 작업 유형의 두 작업 이 동시에 실행되지 않아야합니다. 다른 어떤 작업자가 User1_TaskB 또는 User1_TaskC를 실행하는 것과 동시에 어떤 작업자도 User1_TaskA를 실행할 수없는 시스템이 필요하지만 User1_TaskA가 실행되는 동안 다른 작업자가 동시에 User2_TaskA, User3_TaskA 등을 실행하는 것을 차단해서는 안됩니다.

이것은 외부 잠금 메커니즘 (예 : DB)의 일종을 사용하여 구현할 수 있다는 것을 알았지 만, 더 우아한 작업/대기열/작업자 디자인이 효과가 있기를 바라고 있습니다.

대기열을 사용자 버킷으로 구현하여 작업자가 실행될 때 생성 할 버킷 수를 지정하고 각 "버킷 작업자"가 정확하게 하나의 버킷에 바인딩되도록 큐를 구현하는 것이 좋습니다. 그런 다음 "중간 작업자"는 주 작업 대기열에서 작업을 가져와 해시/수정 체계를 통해 버킷 대기열에 할당합니다. 따라서 UserA의 작업은 항상 같은 대기열에서 끝나고 UserA의 여러 작업은 서로 뒤떨어집니다. 나는이 방법을 좋아하지 않는다. 버킷의 수를 미리 정의해야하고, (쉽게) 노동자를 동적으로 추가하는 것을 막는 것처럼 보일 것이다. 내게는 더 좋은 방법이 있어야한다고 생각합니다. 제안은 크게 감사 할 것입니다.

답변

2

외부 잠금 메커니즘을 사용하면 어떤 점이 좋지 않습니까? 간단하고 직선적이며 효율적입니다. Celery here에서 분산 작업 잠금의 예를 찾을 수 있습니다. 사용자 당 잠금을 생성하여 확장하면 완료됩니다!

+0

로저 - 고마워요! – Matt

+0

업데이트 된 링크 : http://docs.celeryproject.org/ko/latest/tutorials/task-cookbook.html#ensuring-a-task-is-only-executed-one-at-a-time – Altaisoft

관련 문제