消息队列的应用场景
同步调用:“添加商品”操作的业务功能有三个,可能每个业务都需要花费1秒种,那么依次执行完三个业务就花费了3秒才能返回结果。
异步通信:执行“添加商品”操作时,只需要给交换机发送一条消息,交换机上绑定了三个队列,交换机将消息发送给队列,三个业务服务监听队列,一旦监听到队列上有消息,就执行相应的消息。这样的通信方式只需要给交换机发送了消息就能返回结果,其他的具体业务会自行执行。
消息队列改变了服务间的通信方式,使用消息队列可以节省提供业务代码花费的时间。
RabbitMQ
-
组成部分
生产者 : 消息的生产者,给交换机发送消息
消费者 : 消息的消费者,监听队列,一旦监听到消息,就消费
交换机 : 交换机用来决定消息发送到哪个队列上
队列 : 接收交换机上发送过来的消息 -
简单队列模式
autoAck : true
消费者无论是否处理完,都回复一个ack true -
Work模式
能够实现“能者多劳”,性能强的消费者多消费。
basicQos(1) : 消费者告知broker一次值接收一条消息
将自动Ack改成手动Ack,处理完消息后告诉broker可以发送下一条消息过来了,这样就能实现“能者多劳”。 -
发布订阅者模式
此模式要使用fanout交换机。
此模式可以将一条消息发送给多个队列,被多个消费者消费。
弊端:不能指定队列接收,绑定在交换机上的所有队列都会受到消息。 -
路由模式
此模式要使用direct交换机。
解决“发布订阅者模式”的弊端,可以指定发送给绑定在交换机上的队列。
在将队列和交换机进行绑定时,要指定routing-key。
在生产者发送消息时,要指定routing-key。 -
通配符模式
让routing-key在匹配的时候达到模糊匹配的效果。
通配符:
*:匹配当前级 例如:roouting-key为java.*只能匹配java.api,不能匹配java.api.yes
#:匹配多级 例如:roouting-key为java.#可以匹配java.api,也可以匹配java.api.yes
未完待续…