什么是消息队列
进行大量的远程调用时,传统的Http方式容易造成阻塞,所以引入了消息队列的概念,即让消息排队,按照队列进行消费。
它能够将发送方发送的信息放入队列中,当新的消息入队时,会通知接收方进行处理,一般消息发送方称为生产者,接收方称为消费者。
这样所有的请求,都可以丢到消息队列中,再由消费者取出,不再是直接连接消费者的形式了,而是加了一个中间件,这是一种很好的解耦方案。并且在高并发的情况下,由于消费者能力有限,消息队列也能起到一个削峰填谷的作用,堆积一部分的请求,再由消费者来慢慢处理,而不会像直接调用那样请求蜂拥而至。
消息队列组件
ActiveMQ、RabbitMQ、RocketMQ、Kafka是目前主流的消息队列组件。它们的特点如下:
综合以上因素,这里选择RabbitMQ作为消息队列组件进行演示。原因如下:
- 吞吐量虽然不高,但中小型项目完全足够。
- 时效性强。延迟达到微妙级别,较同类产品延迟最低。
- 可用性强。提供了完善的高可用实现机制。
- 可靠性强。基本不会丢包。
- 并发能力强。基于Erlang开发,提供了丰富的交换机功能,性能好、延时低。
- 开源免费。没有使用成本,且社区活跃度高,产品稳定。
消息队列组件的功能和实现是大同小异的,学习好一个组件就可以做到一通百通,而且还有Spring Cloud Stream这样的消息队列连接组件,可以屏蔽各消息队列组件的差异性,使用统一的标准调用消息队列组件。
所以,想要掌握消息队列,从RabbitMQ入手是一个比较好的选择。
RabbitMQ
官方网站:https://www.rabbitmq.com
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
Rabbit科技有限公司开发了RabbitMQ,并提供对其的支持。
- 起初,Rabbit科技是LSHIFT和CohesiveFT在2007年成立的合资企业。
- 2010年4月被VMware旗下的SpringSource收购。
- RabbitMQ在2013年5月成为GoPivotal的一部分。
其特点如下:
- 拥有数万计的用户,是最受欢迎的开源消息队列之一,从T-Mobile到Runtastic,RabbitMQ在全球范围内用于小型初创企业和大型企业。
- 轻量级,易于在本地和云端部署,它支持多种消息协议。
- 可以部署在分布式和联合配置中,以满足大规模、高可用性要求。
- 在许多操作系统和云环境中运行,并为大多数流行语言提供了广泛的开发者工具。
运行过程:
- **生产者(Publisher):**生产消息的终端。
- **信道(Channel):**服务端和客户端连接都会使用一个Channel,再通过Channel去访问到RabbitMQ服务器。这里的通信协议不是http,而是amqp协议。
- **虚拟主机(Virtual Host):**类似于环境隔离,不同环境都可以单独配置一个Virtual Host,每个Virtual Host可以包含很多个Exchange和Queue,每个Virtual Host相互之间不影响。
- 交换机(**Exchange):**根据请求,转发给相应的消息队列,每个队列都可以绑定到Exchange上,这样Exchange就可以将数据转发给队列了,可以存在很多个,不同的Exchange类型可以用于实现不同消息的模式。
- **消息队列(Queue):**消息队列本体,生产者所有的消息都存放在消息队列中,等待消费者取出。
- **消费者(Consumer):**消费消息的终端。