Celery: 实现集群消费和广播消费

集群消费

集群消费类似于负载均衡,生产产生的消息只会被一个worker消费一次
在这里插入图片描述

代码
  • worker
from kombu import Queue
from kombu import Exchange
from kombu.common import Broadcast

import logging
from celery import Celery

# logging
logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s %(levelname)s %(message)s'
                        )
logger = logging.getLogger(__name__)


# mq config
app = Celery("node_worker")
app.conf.task_queues = [
    Queue(f'write-mysql', routing_key='write-mysql')
]
app.conf.task_routes = {
    "write-mysql": {
        'queue': 'write-mysql',
        'routing_key': 'write-mysql'
    }
}
# rabbit mq的信息
app.conf.broker_url = 'amqp://user:password@127.0.0.1:5672/celeryhost'

# task
@app.task(name=f"write-mysql")
def write_sql_task(message):
    logger.error(message)
  • 启动worker
# 启动worker 1
celery -A workerOne worker -l info -S one/ -n one@%h
# 启动worker 2
celery -A workerOne worker -l info -S two/ -n two@%h
  • 进行测试
# 调用代码
from workerOne import write_sql_task

write_sql_task.apply_async(args=["is one"])
# 因为使用的是集群消费, 所以你会看到第一次是第一个worker消费, 第二次是第二个worker消费
广播消费

广播消费就是群发的概念,消息被消费的次数取决于有多少个worker
在这里插入图片描述

  • worker
from kombu import Queue
from kombu.common import Broadcast

import logging
from celery import Celery

# logging
logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s %(levelname)s %(message)s'
                        )
logger = logging.getLogger(__name__)


# mq config
app = Celery("node_worker")
app.conf.task_queues = [
    Broadcast(f'write-mysql-broadcast')
]
app.conf.task_routes = {
    "write-mysql-broadcast": {
        'queue': 'write-mysql-broadcast'
   }
}
app.conf.broker_url = 'amqp://user:password@127.0.0.1:5672/celeryhost'

# task

@app.task(name=f"write-mysql")
def write_sql_task(message):
    logger.error(message)
  • 启动worker
# 启动worker 1
celery -A workerOne worker -l info -S one/ -n one@%h
# 启动worker 2
celery -A workerOne worker -l info -S two/ -n two@%h
  • 进行测试
# 调用代码
from workerOne import write_sql_task

write_sql_task.apply_async(args=["is one"], queue='write-mysql-broadcast')
# 因为是广播消费,所以每次发送消息,都会被消费两次
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值