RabbitMQ概述RabbitMQ是一个高性能的分布式消息中间件。它是用Erlang编写的,Erlang是一种天生分布式且性能极佳(但难以学习)的语言。通信概念的简单理解RabbitMQ是一个队列服务。我们的生产者不断地向它传递消息,而消费者不断地从它那里获取消息。但是相对于使用redis的List等简单队列,RabbitMQ的消息传递更加灵活。首先,你需要知道RabbitMQ中的一些通信概念:交换(exchange)队列(queue):消息队列的载体,每条消息都会被放入一个或多个队列中。绑定(binding):其作用是根据路由规则绑定exchange和queue。路由键(routingkey):exchange根据这个key传递消息。vhost(虚拟主机):在不同的vhost下,数据是完全隔离的。默认vhost为“/”通道(channel):一个tcp连接下可以建立多个通道,每个通道代表一个会话任务。RabbitMQ中的生产者(producer)消费者(consumer)Exchange类似于路由器。我们的消费者不会将消息直接传递给队列,而是传递给交换器。发送到特定队列。这种设计使得消息可以灵活地路由并发送到某种类型的队列中,形成一对多的关系,而不仅仅是一对一。Exchange所以RabbitMQ中的exchange是非常方便和强大的。它有几种类型:directfanouttopicheads(几乎没用过)directexchange很简单,有时候我们只需要一个很简单的队列(消息投递给它,然后不断地消费它),这时候我们可以使用directexchange,它的规则是:如果routingkey匹配,则将消息投递到对应的队列中。fanoutexchange忽略路由键,同时向一批队列发送消息。topic是根据不同的routingkey将消息发送到某一类队列。快速安装这里我使用docker安装RabbitMQdocker-compose.ymlversion:"2"services:mq:image:rabbitmq:3.8.12-managementrestart:alwaysmem_limit:2ghostname:mq1volumes:-./mnesia:/var/lib/rabbitmq/mnesia-./log:/var/log/rabbitmq-./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf端口:-“55672:15672”-“5672:5672”环境:-CONTAINER_NAME=rabbitMQ-RABBITMQ_ERLANG_COOKIE=3t182q3wtj1p9z0kd3tbrabbitmq.confloopback_users.guest=falselisteners.tcp.default=5672default_pass=WbsWebZVOzE5A1Bddefault_user=testhipe_compile=falsemanagement.listener.port=15672management.listener.ssl=false注意,5672端口是AMQPClient(也就是我们程序使用的)端口,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
