说明

最近想重新上RabbitMQ,主要目的还是为了分布式任务调度。在Kafka和RabbitMQ两者犹豫了一下,还是觉得RabbitMQ好一些。

在20年的时候有搞过一阵子的RabbitMQ,看了下当时的几篇文章,觉得其实想法一直没变过。
Python 全栈系列232 再次搭建RabbitMQ-LMLPHP
Python - 装机系列24 消息工具 RabbitMQ详细了解介绍了丢包的问题,这个估计是我当时放弃使用这个的直接原因。现在想来挺逗的,完全是因为测试服务器ubuntu使用wifi连接不稳定导致的。
文章参考RMQ官网,总结了7种队列工作模式。文章内还有使用pika进行测试的部分,我最主要使用模式2。
Python 全栈系列232 再次搭建RabbitMQ-LMLPHP
文章还提到了原来部署时的一些问题,之后可以参考。

【Python 全栈系列49 - Pika连接RabbitMQ的封装】这篇当时没有继续写,按照现在的风格,应该是封装为RabbitAgent。

Python 全栈系列6 -消息通信(RabbitMQ、Pika)介绍了RabbitMQ最基本的使用,包括消息的格式等。

建模杂谈系列38- 基于celery、rabbitmq、redis和asyncio的分布并行处理(概述)介绍了io并行和cpu并行的特点,以及使用celery+rabbitmq+flower进行分布式任务的样例。

本篇仅介绍RabbitMQ的(再次)搭建。

内容

1 变化

现在和几年之前,我的infrastructure还是变了很多。

  • 我用Redis Stream实现了一个简化版的消息队列(同时也实现了简单的分布式任务)
  • 实现了多种数据库的Agent: 所以应该基于Pika封装一个微服务(RabbitAgent)
  • 自己搭建了镜像仓库 :规范命名并上传保存
  • 建立了数据的存储规范(分片、分区、分块):可以用于任务的同步
  • 可以方便的进行文件同步:这样大数据不必放在消息队列,而是由worker执行远程同步拉取(这样也避免了worker没有多余公网端口的问题)

基于此,本次的实现将参考过去一些好的实践进行部署,之后也会借鉴RabbitMQ和Celery来完善自己的分布式任务。

2 搭建

拉取镜像
Python 全栈系列232 再次搭建RabbitMQ-LMLPHP
官网介绍的
Python 全栈系列232 再次搭建RabbitMQ-LMLPHP

# latest RabbitMQ 3.13
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.13-management

在本地创建文件夹,并分配两个端口给这个服务。

然后就可以启动服务了,输入默认用户密码 guest/guest就可以进行访问了。
Python 全栈系列232 再次搭建RabbitMQ-LMLPHP
我想起来,最初的时候我是直接在ubuntu系统上面装rabbitmq的,依稀记得装erlang的过程。那真是烦死了,还好有docker。

rabbitmq的官网页面有介绍配置用户密码的启动方式,暂时就先这样。

docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management

本地化的一些改造
首先将镜像本地化,这样以后锁定本地的版本就可以了

docker tag rabbitmq:3.13-management myregistry.domain.com:24052/tool.rabbitmq_3.13_management:v100
docker push myregistry.domain.com:24052/tool.rabbitmq_3.13_management:v100

一个较为完整的启动命令为

docker run -d\
 --restart=always \
 --name=rabbitmq \
 --hostname my-rabbit \
 -v /etc/localtime:/etc/localtime  \
 -v /etc/timezone:/etc/timezone\
 -v /etc/hostname:/etc/hostname \
 -e "LANG=C.UTF-8"\
 -e RABBITMQ_DEFAULT_USER=YOURS \
 -e RABBITMQ_DEFAULT_PASS=YOURS \
 -p 24091:5672\
 -p 24092:15672 \
 myregistry.domain.com:24052/tool.rabbitmq_3.13_management:v100

3 Next

开发RabbitAgent微服务,对RabbitMQ的操作进行简化。

借用RabbitMQ的队列模式,实现分布式任务。

使用celery+rabbitmq实现分布式任务。

03-06 06:25