RabbitMQ是一款基于Erlang语言开发,开源的分布式消息中间件,支持AMQP协议,支持Java、Golang、php、python等多种开发语言客户端。
RabbitMQ快速搭建开发环境,因为RabbitMQ使用Erlang开发,常规方式安装需要先安装Erlang,再安装RabbitMQ比较麻烦,所以这里推荐使用Docker方式部署,一条命令搞定。
RabbitMQ提供了一个可视化的Web后台,方便了解队列的运行情况,也可以对RabbitMQ做一些管理操作。
RabbitMQ基本概念
最简单的队列模式,只有一个消息生产者,一个消息消费者,一个队列,也称为点对点模式、一对一模式。
RabbitMQ工作队列(Work模式),一个生产者,多个消费者,每条消息只能被一个消费者消费,支持并发消费消息。
发布订阅模式,就是一个生产者发送的消息会被多个消费者获取,因为一条消息会被多个消费者分别消费处理,所以也叫广播模式、一对多模式。
RabbitMQ路由模式大体上跟发布订阅模式一样,区别在于发布订阅模式将消息转发给所有绑定的队列,而路由模式将消息转发给那个队列是根据路由匹配情况决定的。
RabbitMQ主题模式(Topic)跟路由模式类似,区别在于主题模式的路由匹配支持通配符模糊匹配,而路由模式仅支持完全匹配。
Golang RabbitMQ 最简单的队列模式,只有一个消息生产者,一个消息消费者。
Golang RabbitMQ work模式, 实现多个消费者并发消费。
golang RabbitMQ发布订阅模式(广播模式、fanout模式),就是一个生产者发送的消息会被多个消费者处理。
Golang RabbitMQ路由模式在发布订阅模式的基础上,对交换机路由方式进行扩展,路由模式的交换机类型为direct,路由模式也是rabbitmq的默认交换机,前面的章节没有使用明确交换机,底层其实使用的是direct交换机。
Golang RabbitMQ主题(topic)模式,跟路由模式(Direct)类似,最大的区别就是主题模式的路由参数支持模糊匹配,主题模式的交换机类型为:topic。
Java RabbitMQ最简单的队列模式就是一个生产者和一个消费者,使用Spring AMQP操作RabbitMQ。
Java RabbitMQ Work模式,就是配置多个消费者消费一个队列的消息,可以提高消息的并发处理速度
Java RabbitMQ发布订阅模式(广播模式、fanout模式),使用的交换机类型为FanoutExchange,就是一个生产者发送的消息会被多个队列的消费者处理。
Java RabbitMQ路由模式(Direct模式),使用的交换机类型为DirectExchange,跟发布订阅模式的区别就是Direct交换机将消息投递到路由参数完全匹配的队列中
Java RabbitMQ主题模式(Topic模式),使用的交换机类型为TopicExchange,跟路由模式(Direct)的区别就路由参数支持模糊匹配,因为路由匹配比较灵活,所以是比较常用的模式。
PHP RabbitMQ最简单的队列模式就是一个生产者和一个消费者。
PHP RabbitMQ Work模式,就是配置多个消费者消费同一个队列的消息,可以提高消息的并发处理速度
PHP RabbitMQ发布订阅模式(又称广播模式、fanout模式),就是一个生产者发送的消息会被多个队列的消费者处理。
PHP RabbitMQ路由模式(Direct模式),使用的交换机类型为direct,跟发布订阅模式的区别就是Direct交换机将消息投递到路由参数完全匹配的队列中。
PHP RabbitMQ主题模式(Topic模式),使用的交换机类型为Topic,跟路由模式(Direct)的区别就路由参数支持模糊匹配。
RabbitMQ持久化机制分为队列持久化、消息持久化、交换器持久化。不管是持久化的消息还是非持久化的消息都可以被写入到磁盘。
RabbitMQ使用过程中,有些业务场景需要我们保证顺序消费,例如:业务上产生三条消息,分别是对数据的增加、修改、删除操作,如果没有保证顺序消费,执行顺序可能变成删除、修改、增加,这就乱了。
优先级队列,顾名思义,优先级高的消息具备优先被消费的特权。
在rabbitmq中,当消息在一个队列中变成一个死信(消费者无法处理的消息)之后,它将被重新投递到另一个交换机上,这个交换机我们就叫做死信交换机,死信交换机将死信投递到一个队列上就是死信队列。
RabbitMQ的消息过期时间(TTL)下面两种方式进行设置,1.通过队列属性设置,队列中所有消息都有相同的过期时间。2. 对每条消息单独设置过期时间,每条消息的TTL可以不同。如果两种方法一起使用,则消息的TTL以两者之间较小的那个数值为准。
RabbitMQ原生不支持延迟消息,目前主要通过死信交换机 + 消息TTL方案或者rabbitmq-delayed-message-exchange插件实现。