比较常见及主流的消息中间件有ActiveMQ、RabbitMQ,Kafka、RocketMQ等
两者的区别:
JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。
JMS规定了两种消息模式;而AMQP的消息模式更加丰富
RabbitMQ是Erlang语言编写,所以Erang环境必须要有,注:Erlang环境一定要与RabbitMQ版本匹配:https://www.rabbitmq.com/which-erlang.html
Erlang下载地址:https://packagecloud.io/rabbitmq/erlang/(根据自身需求及匹配关系,下载对应rpm包),不过这个地址下载特别慢,另外一个下载地址:https://www.erlang-solutions.com/resources/download.html
RabbitMQ下载地址:https://www.rabbitmq.com/releases/rabbitmq-server/(根据自身需求及匹配关系,下载对应rpm包)
rabbitmq安装依赖于socat,所以需要下载socat。socat下载地址:http://repo.iotti.biz/CentOS/6/x86_64/socat-1.7.3.2-1.el6.lux.x86_64.rpm
根据自身需求下载对应系统socat依赖:(http://repo.iotti.biz/CentOS/)
安装Erlang依赖:
rpm -ivh --nodeps esl-erlang_22.0.7-1_centos_6_amd64.rpm --nosignature
或者
yum install esl-erlang_22.0.7-1_centos_6_amd64.rpm
安装socat:
rpm -ivh socat-1.7.3.2-1.el6.lux.x86_64.rpm
安装RabbitMQ:
rpm -ivh rabbitmq-server-3.7.17-1.el6.noarch.rpm
cd /usr/share/doc/rabbitmq-server-3.7.17
cp rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
vi /etc/rabbitmq/rabbitmq.config
修改前:
修改后:
进入到RabbitMQ安装目录下的sbin目录(由于没有配置环境变量,所以进入sbin目录),执行启动命令“./rabbitmq-server”,启动成功出现如下界面
访问RabbitMQ的web页面需要开启防火墙允许通道(也可以直接关闭防火墙,但是不建议这么做),开启15672和5672端口通道
最后再通过IP:15672访问RabbitMQ的web界面。
登录默认账户guest/guest,也可以自定义账户,登录成功显示界面如下:
RabbitMQ的六种工作模式:
上图模型中,P:生产者,要发送消息的程序,C:消费者,消息接收的程序,等待接收消息,红色部分为消息队列,类似一个邮箱,可以缓存消息,生产者向其中投递消息,消费者从其中取出消息
Work queues也被称为(Task queues)任务模型。当消息处理比较耗时的时候,可能生产消息的速度远远大于消息的消费速度,长此以往,消息会堆积的越来越多,无法及时处理。此时就可以使用Work queues模型:让多个消费者绑定到一个队列,共同消费队列中的消息。队列中的消息一旦消费,就会消失,因此任务是不会被重复执行的。
RabbitMQ 消息模型的核心理念是:生产者不会直接发送任何消息给队列。事实上,生产者甚至不知道消息是否已经被投递到队列。
生产者只需要把消息发送给一个交换器(exchange)。交换器非常简单,它一边从发布者方接收消息,一边把消息推送到队列。交换器必须知道如何处理它接收到的消息,是应该推送到指定的队列还是多个队列,或者是直接忽略消息。这些规则是通过交换器类型(exchange type)来定义的。
有几个可供选择的交换器类型:direct, topic, headers 和 fanout。我们在这里主要说明最后一个 ——fanout。fanout exchange 很简单,你可能从名字上就能猜测出来,它把消息发送给它所知道的所有队列。这正是我们所需要的。
在fanout模式中,一条消息,会被所有订阅的队列都消费消息,但是,在某些场景下,我们希望不同的消息被不同的队列消费,这时就要用到direct类型的交换器(Exchange)
在direct模型下:
Topics模式其实也是Routing模式的一种特殊情形,只是官网上单独分开了,这种模式的特殊在于Topic类型的Exchange可以让队列绑定路由key的时候使用通配符,也可以称为通配符模式。约定的规则如下(参照上图):
在基础工程中使用RabbitMQ的几种模式会稍微麻烦一点,而实际中大多也是直接使用spingboot整合RabbitMQ来使用,因为Springboot本身就很好的集成了RabbitMQ,这也是它使用广泛的一大原因。以下通过示例来说明在springboot工程中RabbitMQ的使用方法。
在web界面配置好虚拟机和用户后,项目中添加对应配置文件
执行测试类后可以看到web界面中创建了一个hello的队列,且从控制台中可以看到消息得到了消费
类似的,其他几种模式,使用配置一样,并在生产者测试类里添加相应的代码,添加对应的消费者,如下:
工作模式消费者:
Fanout模式消费者:
Routing模式消费者:
Topics模式消费者:
分别运行测试类,可以在控制台上看到消费的打印信息,最后在web界面上也可以看到成功后自动创建的队列信息: