celery+rabbitmq queue,message,exchange设置持久化或非持久化

在 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

注意点:

同一个队列,消息 或 交换机  在 所有 生产者 消费者连接 时 持久化或 非持久化 必须相同,否则 后面 非创建 客户端 会连接失败;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值