https://blog.youkuaiyun.com/Dante_003/article/details/79377159
Rabbitmq是常用的消息中间件之一,其它常见的消息中间件如activemq、kafka、zeromq,各个消息中间件各有各自的适合用的场景。
这里我们说下Rabbitmq,rabbitmq是基于AMQP(Advanced Message Queuing Protocol)协议使用erlang开发的消息中间件。amqp具有更加灵活的消息转发功能,同时erlang又是专门针对于线程安全和分布式开发的语言,所以rabbitmq在消息转发功能和分布式性能上具有很明显的优势。rabbitmq支持多种语言的客户端,java、python、c++、js、c#、php、go等。
如果你有业务高并发、消息处理量大的需求,可以选择使用rabbitmq,rabbitmq可以很容易的组成集群来应对连接多、高并发、消息量大的难题,而且消息转发模式也多种多样。
AMQP
一套确定的消息交换功能,也就是“高级消息交换协议模型”。AMQP模型包括一套用于路由和存储消息的功能模块,以及一套在这些模块之间交换消息的规则。
在服务器中,三个主要功能模块连接成一个处理链完成预期的功能:
“exchange”接收发布应用程序发送的消息,并根据一定的规则将这些消息路由到“消息队列”。
“message queue”存储消息,直到这些消息被消费者安全处理完为止。
“binding”定义了exchange和message queue之间的关联,提供路由规则。
使用这个模型我们可以很容易的模拟出存储转发队列和主题订阅这些典型的消息中间件概念。
Rabbitmq
下面说下rabbitmq消息中间件里面的概念和功能。
上图基本概括了rabbitmq里面所有的角色。
publisher(生产者)
生产者,生产消息的功能。
consumer(消费者)
消费者,消息的处理者。
broker
消息中间件所在的主机
virtual host
一个rabbitmq里面可以开启多个virtual host,类似于spring mvc里面filter的过滤,可以根据host的路径来过滤权限。
connection(连接)
生产者、消费者连接virtual host的tcp连接。
channel(通道)
一个连接里面可以开启多个channel,达到复用连接的作用。
exchange(消息分发)
路由交换消息。生产者生产的消息会发送给exchange,exchange来觉得这个消息发送给哪个或哪几个队列,作为消息分发的角色。
rabbitmq消息转发模式的多样性也是在exchange上提现出来的。
这里需要注意的地方,exchange只是消息转发,不会存储消息。
routing key(消息分发依据)
exchange根据routing key在进行消息分发,分发到不同的队列
queue(队列,存储消息的容器)
经过exchange路由后,消息会存储到queue中,默认情况下,消息会先存储到内存,而后会持久化到硬盘
注意,在消息转发时,队列不是必须的,可以省略掉队列,从exchange直接到消费者,消息不会存储到rabbitmq上。
部署
部署这里我采用docker,使用docker实在太方便。
docker run -d --name rabbitmq \
--restart=always --hostname my-rabbit -p 5672:5672 -p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin \
rabbitmq:3.6-management
- 1
- 2
- 3
- 4
rabbitmq使用两个端口
5672 : 生产者、消费者连接rabbitmq的端口
15672 :rabbitmq管理web页面的端口