메세지 또한 마찬가지로 헤더와 바디로 구성되어있다. 헤더에는 해당 데이터의 content type, 인코딩 정보가 담겨있다. content type은 일반적으로 해당 메세지를 직렬화하는데 사용한 serialization 정보이다.
body
{
'task': 'myapp.tasks.add',
'id': '54086c5e-6193-4575-8308-dbab76798756',
'args': [4, 4],
'kwargs': {}
}
바디의 구성은 위와 같다. 위에서부터 실행될 task, task의 id, task에 실행할 매개변수들이다.
메세지가 Exchange로 전달되게 되면 다르게 구현/사용된 라우팅 방법에 따라 1개 이상의 queue로 전달되게 된다. 따라서 메세지를 올바르게 전달하고 받기 위해서는 3가지 조건을 만족시켜야 한다.
1. Exchange 생성
2. Queue 생성
3. Queue와 Exchange를 연결할 binding rules
샐러리는 자동적으로 task를 실행할 queue들을 생성한다. 하지만 task가 다양해지고 각 task마다 특성이 달라짐에 따라 이들을 분리하고 서로 다른 queue를 사용하여 분리할 필요가 있다.
샐러리에서는 task_queues 설정을 통해 queue를 정의할 수 있다.
default_exchange = Exchange('default', type='direct')
media_exchange = Exchange('media', type='direct')
app.conf.task_queues = (
Queue('default', default_exchange, routing_key='default'),
Queue('videos', media_exchange, routing_key='media.video'),
Queue('images', media_exchange, routing_key='media.image')
)
app.conf.task_default_queue = 'default'
app.conf.task_default_exchange = 'default'
app.conf.task_default_routing_key = 'default'
3개의 다른 queue 설정의 예이다. 각각의 queue는 비디오, 이미지 그리고 나머지 task들을 전달 받는다.
app.conf.task_default_queue는 구체적인 라우팅이 명시되지 않은 task가 라우팅되는 queue이다.
default_exchange와 default_routing_key는 기본적으로 라우팅에 사용되는 라우팅키와 exchange type을 명시한다. 이러한 기본 값은 app.conf.task_queue에 명시되어 있다.
https://docs.celeryq.dev/en/stable/userguide/routing.html#exchanges-queues-and-routing