rabbitmq 是一款由erlang 语言开发的基于AMQP协议的高级消息队列,AMQP协议是一个应用层协议,解决消息中间件与客户端传递消息,不受其他任何东西干扰。
rabbitmq 的常见应用场景有:
异步处理:只需要放入队列即完成,其他相关处理均可异步完成
解耦合: 当消费端出现异常时,消息不会丢失。如下单系统,可以保障使用者正常下单。
高并发: 淘宝双十一秒杀活动,在短时间内突然爆增的请求可能导致程序处理不过来,出现崩溃现象,此时崩溃后的所有请求全部失败。
采用消息队列,前端可以把所有请求发送到队列中,后端按照自己的处理能力依次处理。
rabbitmq 系统架构:
product ——send(message+routingkey)——> exchange(binding指定queue) ——routingkey——> queue <———consumer
exchange 4种类型详解:
direct: 发送消息时带有的“routingkey”全等于 exchange 绑定queue时所用的"routingkey",则发送。
fanout:发送消息时,exchange 直接转发到所有绑定成功的queue 上,不论routingkey是什么。
topic:exchange 绑定queue 使用的routingkey 切分成以.分割的形式,#号表示0个或多个单词,空格表示一个单词。消息会被发送至routingkey 匹配bandingkey的queue上。
如:。发送消息时使用的routingkey="cpy.device.test" 那么消息将被发送至所有exchange绑定queue使用的routingkey="cpy.#.test"的队列上。
headers:此类exchange类型与direct 发送方式一致,但性能很差,它忽略routingkey发送,而是匹配消息中的header,转发到指定队列,该方法几乎不用