2014-12-21 2 views
1

DjangoRabbitMQCelery은 단일 시스템에서 작동합니다. 나는 here에서 지시를 따랐다. 이제는 함께 작동하도록하고 싶지만 다른 서버에있는 경우에 사용하십시오. DjangoCelery 또는 CeleryDjango에 대해 알고 있습니다.다른 머신 (서버)의 Django + RabbitMQ + Celery 모두

그래서, 기본적으로 난 그냥 RabbitMQ 큐 (아마도 ID, 작업의 종류, 어쩌면 다른 정보)에 어떤 메시지를 보낼 Django에서 원하는, 그리고 내가 RabbitMQ가에 Celery에 그 메시지 (의 수)를 게시 할 다른 서버. Celery/Django은 서로에 대해 알지 않아야합니다. 기본적으로 나는 그 중 하나를 대체하기 쉬운 아키텍처를 원합니다. (나는 DjangoCelery에 의존해서는 안 말했듯이)

는 지금은

create_project.apply_async(args, countdown=10)

내가 그 직접 RabbitMQ와 유사한 호출로 대체 할처럼 내 Django 여러 통화에 있습니다. 그런 다음 RabbitMQCelery (가능할 때)에 알리고 Celery은 해당 작업을 수행해야합니다 (아마도 Django과 상호 작용하지만 REST 인터페이스를 통해).

또한 두 개 이상의 서버에 Celery 명의 작업자가 있어야하며 메시지의 일부 필드에 따라 하나만 알려주고 싶습니다. 이게 복잡하다면 다음과 같은 일을 (다른 머신에서) 체크 할 수 있습니다 : 메시지의 IP 주소 필드를 확인하는 것과 같은 일이며, 태스크 실행만으로 끝나지 않으면됩니다.

어떻게하면됩니까? 가능하다면 이론적 설명이 아닌 코드 + 구성 예제를 선호합니다.

편집 :

나는 나의 유스 케이스 셀러리에 대한 총 오버 헤드라고 생각합니다. 맞춤 클라이언트로 라우팅하는 간단한 RabbitMQ 이 작업을 수행합니다. 난 이미 간단한 유스 케이스 (한 서버)를 시도하고 완벽하게 작동합니다. 은 멀티 서버 통신 준비가 쉬워야합니다. 나는 샐러리를 좋아하지 않는다. "마법"이라면 너무 많은 내용을 숨기고 구성하기 쉽지 않습니다. 그러나 저는 다른 사람들의 의견에 관심이 있기 때문에이 질문을 살아 있습니다.

답변

5

그것의 짧은

내가 어떻게 이것을 달성 할 수 있습니까?

셀러리는 작업 이름과 일련의 매개 변수 집합을 메시지 본문으로 만 보냅니다. 셀러리가 어떻게 운영되는지 당신의 시나리오가 절대적으로 맞습니다.

가능한 경우 이론적 설명이 아닌 코드 + 구성 예제를 선호합니다.그래서 같은 클라이언트 애플리케이션, 즉, 장고 앱

정의 스터브 작업 : 셀러리 처리

@task 
def foo(): 
    pass 

, 원격 서버에서, 실제 작업을 정의 실행한다.

@task 
def foo(): 
    pass 

작업 그렇지 않으면 셀러리는 실제 작업에 메시지를 일치 할 수 없습니다, 즉 app.tasks.py 양쪽 (동일한 파이썬 패키지에 거주하는 것이 중요합니다.

참고이 또한 당신이 장고 응용 프로그램에 로컬 셀러리 애플리케이션의이 tasks.py 사용할 수 있도록하지 않는 한이 CELERY_ALWAYS_EAGER=True을 설정 한 경우 의미 장고 응용 프로그램 검증 할됩니다. 심지어 간단한 대안

위 스텁 작업에 대한 대안은 작업을 by name를 보내는 것입니다 : 메시지 패턴에

>>> app.send_task('tasks.add', args=[2, 2], kwargs={}) 
<AsyncResult: 373550e8-b9a0-4666-bc61-ace01fa4f91d> 

는 또한

, 나는 두 개 이상의 서버에 셀러리 근로자가 필요하고 내가 원하는 RabbitMQ는 메시지의 일부 필드에 따라 그 중 하나만 알립니다.

RabbitMQ는 여러 메시징 패턴을 제공합니다. tutorials은 매우 잘 작성되어 있습니다. 원하는 것 (한 명의 작업자가 처리하는 하나의 메시지)은 간단한 대기열/교환 설정으로 쉽게 얻을 수 있습니다. 다른 작업을 수행하지 않는다면 셀러리가 최소한 기본 설정입니다. 특정 작업에 참여하거나 특정 메시지에 응답해야하는 특정 작업자가 필요하면 RabbitMQ의 대기열 및 교환 개념과 함께 작동하는 Celery의 작업 routing을 사용하십시오.

장단점

내 유스 케이스 셀러리에 대한 총 오버 헤드라고 생각합니다. 맞춤 클라이언트로 간단한 RabbitMQ 라우팅이 작업을 수행합니다. 난 이미 간단한 유스 케이스 (한 서버)를 시도하고 완벽하게 작동합니다.

당연히 RabbitMQ가 제공하는 저수준 API를 처리해야하는 부담없이 RabbitMQ를 즉시 사용할 수 있습니다. Celery는 본질적으로 단순한 Python 함수 또는 메소드를 사용하여 모든 제작자/소비자 시나리오를 작성하는 작업을 매우 간단하게 만드는 작업 추상화를 추가합니다. 당신은 셀러리를 사용하는 경우

  • , 당신은 아마의 유연성의 일부를 풀어 : 참여 트레이드 오프가, 항상 엔지니어링 결정에 -이 RabbitMQ 또는 셀러리 하나의 좋은/나쁜 판단하지 않습니다 RabbitMQ API를 사용하지만 개발 속도와 배포 복잡성을 줄이면서 손쉽게 개발할 수 있습니다. 기본적으로 작동합니다.

  • RabbitMQ를 직접 사용하면 유연성을 얻을 수 있지만 관리 복잡성이 따른다.

프로젝트 요구 사항에 따라 두 방법 중 하나가 유효 할 수 있습니다.

모든 충분히 고급 기술은 마법 ;-)

내가 셀러리를 좋아하지 않는에서 구별 할 수 있습니다. 그것은 "마법 같은"세부 사항을 너무 많이 숨기고 구성하기 쉽지 않습니다.

나는 동의하지 않을 것입니다. Arthur C. Clarke's 감각에서는 "마술"이 될 수 있지만 일반 RabbitMQ 설정과 비교해 보면 쉽게 구성 할 수 있습니다. 물론 RabbitMQ 설정을하는 사람이라면 실제로 아무것도 얻을 수없는 추상화 계층을 추가 할 수 있습니다. 어쩌면 당신의 개발자가 될 것입니까?

+0

답장을 보내 주셔서 감사합니다. – Igor

관련 문제