2011-12-25 2 views
1

데이터베이스에 Feed 개체가 여러 개 있는데 매 시간마다 각 피드를 업데이트하려고합니다. 내 문제는 여기에 중복 업데이트가 없는지 확인해야합니다. 한 시간에 한 번 이상 발생해야합니다.하지만 피드가 업데이트하는 데 2 ​​시간을 기다리지 않기를 바랍니다. (매시간 +/- 몇 분 간격으로 발생하더라도 괜찮습니다. 그러나 몇 분 안에 두 번 잘못됩니다.)Django 모델 인스턴스마다주기적인 셀러리 작업을 예약하는 방법은 무엇입니까?

Amazon SQS에서는 브로커로 장고와 셀러리를 사용하고 있습니다. 피드 업데이트 코드가 셀러리 작업으로 설정되어 있지만 여러 노드에서 실행중인 셀러리와 호환되는 상태에서 중복을 방지하는 방법을 찾지 못했습니다.

threshold = datetime.now() - timedelta(seconds=3600) 
for f in Feed.objects.filter(Q(last_update_scheduled__lt = threshold) | 
          Q(last_update_scheduled = None)): 
    updateFeed.delay(f) 
    f.last_update_scheduled = now 
    f.save() 

이 동기화 문제의 숫자에 민감하다 :

나의 현재 솔루션 (의사 코드) 다음 작업을 5 분마다 피드 모델에 last_update_scheduled 속성을 추가하고 실행하는 것입니다. 예를 들어, 작업 대기열이 백업되면이 작업이 동시에 두 번 실행되어 중복 업데이트가 발생할 수 있습니다. 이것 (예 : Celery's recipean adaptation on Stack Overflow)에 대한 몇 가지 해결책을 보았습니다. 그러나 memcached 솔루션은 신뢰할 수 없습니다. memcached를 다시 시작하거나 메모리가 부족하여 오래된 데이터를 제거 할 때 중복이 발생할 수 있습니다. 간단히 말해서 memcached를 생산 구성에 추가해야 할 필요는 없습니다.

완벽한 세계에서

, 내가 말할 수 있도록하고 싶습니다 :

@modelTask(Feed, run_every=3600) 
def updateFeed(feed): 
    # do something expensive 

그러나 지금까지 나의 상상은 장식을 구현하는 방법에 저를 실패합니다.

답변

0

셀러리 레시피는 memcached 자체를 사용하지 않고 Django의 캐싱 미들웨어를 사용합니다. memcached의 단점이 없으면 사용자의 요구에 맞는 다양한 캐싱 메소드가 있습니다. 자세한 내용은 the Django caching documentation을 참조하십시오.