RabbitMQ
是一个高性能的分布式消息中间件。它由Erlang编写,这种语言天生支持分布式,并且性能极高(可是比较难上手)。node
RabbitMQ简单理解就是一个队列服务,咱们的生产者不断地往它投递消息,而消费者不断地从它那里获取消息。但相较于利用redis
的List这类简单队列,RabbitMQ的消息投递更灵活一点。首先须要知道一些RabbitMQ中的通讯概念:python
RabbitMQ中Exchange
相似于一个路由器,咱们的consumer
并不会把消息直接投递给队列,而是投递给exchange
,exchange
根据咱们投递时的路由键(routing key)再发送到特定的队列。这样的设计让消息能够灵活选路,发送到某一类的队列中,造成一对多的关系,而不单单是一对一。web
因此说RabbitMQ中的exchange
很方便,很强大,它有这样几种类型:redis
direct
交换器很简单,有时候咱们仅仅须要一个很简单的队列(消息投递到其中,而后不断消费它),这时候咱们就能够用direct
交换器,它的规则是:若是路由键匹配,消息就会被投递到对应的队列。docker
fanout
交换器忽略路由键,把消息同时发到一批队列。topic
则就是根据不一样路由键,把消息发送到某一类队列中。数据库
这里我使用docker安装RabbitMQ
docker-compose.yml数据结构
version: "2" services: mq: image: rabbitmq:3.7.8-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" - "56720:5672" environment: - CONTAINER_NAME=rabbitMQ - RABBITMQ_ERLANG_COOKIE=3t182q3wtj1p9z0kd3tb
rabbitmq.conftcp
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中设置了hostname
为mq1
)5672
端口映射到了宿主机的56720
端口,15672
端口映射到了宿主机的55672
端口分布式