典型应用场景
1、跨系统的异步通信人民银行二代支付系统,使用重量级消息队列IBMMQ,异步,解耦,削峰都有体现。
2、应用内地同步变成异步秒杀:自己发送给自己
3、基于Pub/Sub模型实现的事件驱动放款失败通知、提货通知、购买碎屏保系统间同步数据摒弃ELT(比如全量同步商户数据);摒弃API(比如定时增量获取用户、获取产品,变成增量广播)。
4、利用RabbitMQ实现事务的最终一致性
基本介绍
AMQP协议
AMQP,即AdvancedMessageQueuingProtocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品、不同的开发语言等条件的限制。AMQP的实现有:RabbitMQ、OpenAMQ、ApacheQpid、RedhatEnterpriseMRG、AMQPInfrastructure、MQ、Zyre等。
RabbitMQ的特性
RabbitMQ使用Erlang语言编写,使用Mnesia数据库存储消息。
(1)可靠性(Reliability)RabbitMQ使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
(2)灵活的路由(FlexibleRouting)在消息进入队列之前,通过Exchange来路由消息的。对于典型的路由功能,RabbitMQ已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起,也通过插件机制实现自己的Exchange。
(3)消息集群(Clustering)多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
(4)高可用(HighlyAvailableQueues)队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
(5)多种协议(Multi-protocol)RabbitMQ支持多种消息队列协议,比如AMQP、STOMP、MQTT等等。
(6)多语言客户端(ManyClients)RabbitMQ几乎支持所有常用语言,比如Java、.NET、Ruby、PHP、C#、JavaScript等等。
(7)管理界面(ManagementUI)RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点。
(8)插件机制(PluginSystem)RabbitMQ提供了许多插件,以实现从多方面扩展,当然也可以编写自己的插件
工作模型
三种主要的交换机
DirectExchange直连交换机
定义:直连类型的交换机与一个队列绑定时,需要指定一个明确的bindingkey。
路由规则:发送消息到直连类型的交换机时,只有routingkey跟bindingkey完全匹配时,绑定的队列才能收到消息。
例如:
//只有队列1能收到消息channel.basicPublish(MY_DIRECT_EXCHANGE,key1,null,msg.getBytes())
TopicExchange主题交换机
定义:主题类型的交换机与一个队列绑定时,可以指定按模式匹配的routingkey。通配符有两个,*代表匹配一个单词。#代表匹配零个或者多个单词。单词与单词之间用.隔开。
路由规则:发送消息到主题类型的交换机时,routingkey符合bindingkey的模式时,绑定的队列才能收到消息。
例如:
//只有队列1能收到消息channel.basicPublish(MY_TOPIC_EXCHANGE,sh.abc,null,msg.getBytes());//队列2和队列3能收到消息channel.basicPublish(MY_TOPIC_EXCHANGE,bj.book,null,msg.getBytes());//只有队列4能收到消息channel.basicPublish(MY_TOPIC_EXCHANGE,abc.def.food,null,msg.getBytes());
FanoutExchange广播交换机
定义:广播类型的交换机与一个队列绑定时,不需要指定bindingkey。
路由规则:当消息发送到广播类型的交换机时,不需要指定routingkey,所有与之绑定的队列都能收到消息。
例如:
//3个队列都会收到消息channel.basicPublish(MY_FANOUT_EXCHANGE,,null,msg.getBytes());
JavaAPI编程
创建Maven工程,pom.xml引入依赖
dependencygroupId