RabbitMQ二三事

RabbitMQ概览

RabbitMQ是一个高性能的分布式消息中间件。它由Erlang编写,这种语言天生支持分布式,而且性能极高(但是比较难上手)。

通信概念

RabbitMQ简单理解就是一个队列服务,我们的生产者不断地往它投递消息,而消费者不断地从它那里获取消息。但相较于利用redis的List这类简单队列,RabbitMQ的消息投递更灵活一点。首先需要知道一些RabbitMQ中的通信概念:

  • exchange(交换器)
  • queue(队列):消息队列载体,每个消息都会被投入到一个或多个队列。
  • binding(绑定):它的作用就是把exchange和queue按照路由规则绑定起来。
  • routing key(路由关键字):exchange根据这个关键字进行消息投递。
  • vhost(虚拟主机):不同的vhost下,数据完全隔离,默认vhost为“/”
  • channel(信道):在一个tcp连接下,可建立多个channel,每个channel代表一个会话任务。
  • producer(生产者)
  • consumer(消费者)

RabbitMQ中Exchange类似于一个路由器,我们的consumer并不会把消息直接投递给队列,而是投递给exchangeexchange根据我们投递时的路由键(routing key)再发送到特定的队列。这样的设计让消息可以灵活选路,发送到某一类的队列中,形成一对多的关系,而不仅仅是一对一。

Exchange

所以说RabbitMQ中的exchange很方便,很强大,它有这样几种类型:

  • direct
  • fanout
  • topic
  • headers(几乎用不到)

direct交换器很简单,有时候我们仅仅需要一个很简单的队列(消息投递到其中,然后不断消费它),这时候我们就可以用direct交换器,它的规则是:如果路由键匹配,消息就会被投递到对应的队列。
python-one-overall.png

fanout交换器忽略路由键,把消息同时发到一批队列。
exchanges.png
topic则就是根据不同路由键,把消息发送到某一类队列中。
python-five.png

快速安装

这里我使用docker安装RabbitMQ
docker-compose.yml

version: "2"
services:
  mq:
    image: rabbitmq:3.8.12-management
    restart: always
    mem_limit: 2g
    hostname: mq1
    volumes:
      - ./mnesia:/var/lib/rabbitmq/mnesia
      - ./log:/var/log/rabbitmq
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
    ports:
      - "55672:15672"
      - "5672:5672"
    environment:
      - CONTAINER_NAME=rabbitMQ
      - RABBITMQ_ERLANG_COOKIE=3t182q3wtj1p9z0kd3tb

rabbitmq.conf

loopback_users.guest = false
listeners.tcp.default = 5672
default_pass = WbsWebZVOzE5A1Bd
default_user = test
hipe_compile = false
management.listener.port = 15672
management.listener.ssl = false

注意,5672端口是AMQP Client(也就是我们程序使用的)端口,15672是管理插件的web端口。
mnesia文件夹是RabbitMQ存放数据的地方。
关于RabbitMQ的一个重要注意事项是它根据所谓的节点名称存储数据,默认为主机名。
当前节点会在该目录下建立一个rabbit@node-name的文件夹,用来存放节点数据,node-name就是节点名字,默认为hostname(其实mnesia数据库是Erlang内置的一个DBMS,可以直接存储Erlang的各种数据结构),在上述例子中,这个目录名为rabbit@mq1(因为docker-compose中设置了hostnamemq1
5672端口映射到了宿主机的56720端口,15672端口映射到了宿主机的55672端口


Salamander
上帝在我很小的时候送给我了两个苹果,一个红苹果,一个蓝苹果。红苹果代表疯狂,蓝苹果代表思考
1 篇内容引用
6.7k 声望
407 粉丝
0 条评论
推荐阅读
Java AtomicInteger类使用
这个问题发生的原因是++counter不是一个原子性操作。当要对一个变量进行计算的时候,CPU需要先从内存中将该变量的值读取到高速缓存中,再去计算,计算完毕后再将变量同步到主内存中。这在多线程环境中就会遇到问...

pigLoveRabbit2阅读 2.3k

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木66阅读 6.2k评论 16

如何使用 PHPStorm 进行优雅的项目开发?
PHP Storm 这个开发工具,很多 phper 应该有所耳闻,甚至也有不少人使用其作为生产工具,但是很多人都没有最大限度的使用它,本文就来总结一些优雅开发的小技巧。

唯一丶45阅读 4.8k评论 7

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木44阅读 7.5k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木33阅读 6.3k评论 9

从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木34阅读 4.6k评论 9

怎样用 PHP 来实现枚举?
在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,...

唯一丶25阅读 6.4k评论 4

6.7k 声望
407 粉丝
宣传栏