RabbitMQ 是一个由 erlang 开发的基于 AMQP(Advanced Message Queue)协议的开源实现,是当前最流行的消息中间件之一.
1、安装
1.1、添加签名私钥
wget -O - 'https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc' | sudo apt-key add -
1.2、添加源
# ubuntu16.04LTS
echo "deb https://dl.bintray.com/rabbitmq/debian xenial main erlang" | sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list
# ubuntu18.04LTS
echo "deb https://dl.bintray.com/rabbitmq/debian bionic main erlang" | sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list
1.3、安装Erlang和RabbitMQ
sudo apt update
sudo apt install erlang-nox
sudo apt install rabbitmq-server
2、使用
2.1、激活Management WEB
sudo rabbitmq-plugins enable rabbitmq_management
2.2、创建用户
sudo rabbitmqctl add_user {username} {password}
2.4、创建虚拟host
sudo rabbitmqctl add_vhost test
2.3、设置管理员
sudo rabbitmqctl set_user_tags {username} administrator
2.4、设置权限
# 向虚拟host:test设置权限
sudo rabbitmqctl set_permissions -p test {username} ".*" ".*" ".*"
2.5、访问WEB
使用上面创建的用户访问http://localhost:15672
即可.
3、Celery使用RabbitMQ
RabbitMQ是celery官方推荐的Broker.
Celery一些基本配置如下:
BROKER_URL = 'amqp://{username}:{password}@localhost:5672/{vhost}'
CELERY_RESULT_BACKEND = 'redis://:password@host:port/db_number'
CELERYD_CONCURRENCY = 20 # 并发worker数
CELERYD_FORCE_EXECV = True # 非常重要,有些情况下可以防止死锁
CELERYD_MAX_TASKS_PER_CHILD = 100
CELERY_TIMEZONE = 'UTC'
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 12 # 任务过期时间
CELERY_TASK_PROTOCOL = 1
队列及路由:
CELERY_DEFAULT_QUEUE = 'default'
CELERY_QUEUES = (
Queue(name='default', exchange=Exchange('default'), routing_key='default'),
Queue(name='task_A', exchange=Exchange('task_A_queue', ), routing_key='task_A_key')
)
CELERY_ROUTES = {
'parser.task_A': {'queue': 'task_A_queue', 'routing_key': 'task_A_key'}
}
定时任务:
# import
CELERY_IMPORTS = (
'parser.task_A',
'parser.task_B'
)
# schedules
CELERYBEAT_SCHEDULE = {
'taskA-every-hour': {
'task': 'parser.task_A',
'schedule': crontab(minute=0, hour='*/1'),
'options': {'queue': 'task_A_queue', 'routing_key': 'task_A_key'}
},
'loves-every-day': {
'task': 'parser.task_B',
'schedule': crontab(minute=0, hour='*/1'),
'options': {'queue': 'default', 'routing_key': 'default'}
}
}
celery启动:
# 启动worker,指定app名称
celery -A parser worker -l info
# 启动worker,且指定处理相应队列的任务
celery -A parser worker -l info -Q task_A_queue
# 启动定时任务的producer
celery -A parser beat -l info