架构的演变:单一应用架构——>垂直应用架构——>分布式服务架构——>面向服务架构。
消息队列分布式是架构中的至关重要的一部分。
消息队列的作用:
异步处理
应用解耦
流量削峰,提供系统的处理能力。
消息队列图解
几个重要的概念 :
exchange的四种类型:
1、direct:需要指定一个routing_key,即要发到的queue的名字,可使用默认exchange(空name的exchange)。
2、fanout:不需routing_key,只要指定bidding。
3、topic:消息会发送到所有关心routing_key的话题queue上,需要routing_key,也需要bidding。
bidding中可使用两个特殊字符:“#”和“*”:“#”表示0个或若干个关键字,“*”表示一个关键字。
如“log.*”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。
4、header:不常用
消息确认
消息删除之前必须要收到消费者的回执,否则消息永远保留着,并且如果存在多个消费者,那么消息将会继续发给其他的消费者,
直到有了回执(message acknowledgement)。
这样做可以防止消息被消费者拿到后,没来得及处理,但是消费者客户端挂了。这样消息从队列中删除,但是并未被处理。
这里有一点需要注意,如果开发人员没有设置回执,那么会导致严重的bug,即消息会严重积压,并且消费者重启后会重复收到
消息。
消息持久化
exchange持久化
queue持久化
message持久化
上面已经了解了消息确认的重要性,但是还有一种情况。如果消息在被消费者拿走之前,也就是存到消息队列时,rabbitmq
挂了,消息也没有被消费处理,但是也没有了,怎么办?这就用到了消息持久化。当mq重启后,还可以看到消息。