在 python中 通过 celery向rabbitmq 发送数据时, 可以设置 queue(队列),message(队列中的消息),exchange(交换机) 持久化和非持久化;
概念:
持久化或非持久化: 只 存磁盘 或者存 内存中; 前者 rabbitmq重启数据仍然存在,后者数据会丢失;
exchange:根据规则 分发消息到哪个队列
queue: 消息队列,用来存储 消息;
message: 消息,存放在队列中;
queue和message的关系: message依赖于queue,如果 队列非持久化,即使消息持久化 也没用,因为 存消息的容器 没了,还怎么永久化消息; 在 队列 持久化基础上,可以对 消息 进行有效设置;
队列设置持久化或非持久化
通过 durable 参数进行设置,默认为 持久化(True) ,非持久化为(False)
1.celery配置更新时
celery_config['CELERY_QUEUES'] = [Queue(item, durable=False) for item in ['a_queue', 'b_queue']]
celery.conf.update(celery_config)
2.声明 调用远程任务时(第11行代码)
from celery.canvas import signature
from celery.task import Task
from kombu import Queue
from app import celery
class Aqueue(Task):
"""基于celery.task的 任务的类"""
item = "a_queue"
queue = Queue(item, durable=True)
def delay(self, *args, **kwargs):
"""
调用 远程的接口
:param args:
:param kwargs:
:return:
"""
return self.apply_async(args, kwargs, queue=self.queue)
def signature(self, args=None, *starargs, **starkwargs):
"""
:param args:
:param starargs:
:param starkwargs:
:return:
"""
starkwargs.setdefault('app', self.app)
return signature(self, args, *starargs, queue=self.queue, **starkwargs)
@celery.task(name="tasks.a_queue", base=Aqueue, ignore_result=False)
def matrix_buy_untreated(*args, **kwargs):
"""
调用 任务
:param args:
:param kwargs:
:return:
"""
pass
消息设置持久化或非持久化
通过 参数 delivery_mode 进行设置,默认为 2(持久化) ,1(非持久化)
1. 在 声明调用远程任务时(倒数第9行);
from celery.canvas import signature
from celery.task import Task
from kombu import Queue
from app import celery
class Aqueue(Task):
"""基于celery.task的 任务的类"""
item = "a_queue"
queue = Queue(item, durable=True)
def delay(self, *args, **kwargs):
"""
调用 远程的接口
:param args:
:param kwargs:
:return:
"""
return self.apply_async(args, kwargs, queue=self.queue)
def signature(self, args=None, *starargs, **starkwargs):
"""
:param args:
:param starargs:
:param starkwargs:
:return:
"""
starkwargs.setdefault('app', self.app)
return signature(self, args, *starargs, queue=self.queue, **starkwargs)
@celery.task(name="tasks.a_queue", base=Aqueue, ignore_result=False, delivery_mode=2)
def matrix_buy_untreated(*args, **kwargs):
"""
调用 任务
:param args:
:param kwargs:
:return:
"""
pass
交换机 持久化或非持久化
第11行 的Exchange对象, durable表示 交换机是否持久化, delivery_mode表示 消息是否持久化 ; 参数值含义参考如上2种
from celery.canvas import signature
from celery.task import Task
from kombu import Queue, Exchange
from app import celery
class Aqueue(Task):
"""基于celery.task的 任务的类"""
item = "a_queue"
queue = Queue(item, durable=True, exchange=Exchange(item, durable=True, delivery_mode=1))
def delay(self, *args, **kwargs):
"""
调用 远程的接口
:param args:
:param kwargs:
:return:
"""
return self.apply_async(args, kwargs, queue=self.queue)
def signature(self, args=None, *starargs, **starkwargs):
"""
:param args:
:param starargs:
:param starkwargs:
:return:
"""
starkwargs.setdefault('app', self.app)
return signature(self, args, *starargs, queue=self.queue, **starkwargs)
@celery.task(name="tasks.a_queue", base=Aqueue, ignore_result=False, delivery_mode=2)
def matrix_buy_untreated(*args, **kwargs):
"""
调用 任务
:param args:
:param kwargs:
:return:
"""
pass
注意点:
同一个队列,消息 或 交换机 在 所有 生产者 消费者连接 时 持久化或 非持久化 必须相同,否则 后面 非创建 客户端 会连接失败;