一、概述:
  消息队列(Message queue)是一种应用间通信的方式,消息发布后由消息系统来确保消息的可靠传递,消息发布者只需要关注消息是否已经发布,不用关心使用者是谁,消息使用者只需要从队列中获取消息,不用关心发布者是谁。
  为什么使用mq:
    消息队列是一种应用间异步协作机制,一般用于业务解耦的情况,场景包括最终一致性,广播,错峰流控等。
  rabbitMQ的特点:
    由erlang语言开发的基于AMQP协议的实现
    AMQP:Advanced Message Queue,高级消息队列协议,是应用层协议的开放标准,面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,不受产品和开发语言的限制
最初起源于金融系统,用于在分布式系统中存储和转发消息,在易用性,可扩展和高可用性等方面有较好的表现。
  特点:
    1、可靠性(Reliability):使用一些机制来保证可靠性,如持久化,传输确认,发布确认。
    2、灵活路由(Flexible Routing):在进入消息队列之前,通过Exchange来路由消息,对于典型的路由消息,rabbitMQ提供一些内置的Excnange来实现,针对复杂的路由可以将多个Exchange绑定在一起,亦可以通过插件实现自己的Excnange
    3、消息集群(Clustering):多个rabbitMQ服务器集群,形成一个逻辑broker。
    4、高可用(Highly Available Queues):队列可在集群服务器上进行镜像,使得在部分节点出现问题的时候队列仍可用。
    5、多协议(Multi-protocol):支持多种消息队列协议如STOMP,MQTT
    6、多语言客户端(Many Clients):rabbitMQ支持很多开发语言的客户端如java,.net等。
    7、管理界面(Management UI):rabbitMQ提供了一个简单易用的管理界面,可以实时的监控和管理mq消息broer的各方面数据。
    8、跟踪机制(Tracing):如果消息出现异常,rabbitMQ提供了消息跟踪机制,以方便使用者找出问题。
    9、插件机制(Plugin System):rabbitMQ提供许多外部插件,也可以自己编写插件。

二、概念模型
  消息模型:所有的mq产品从模型抽象来说都是一个流程。
  消费者(consumer)订阅某个队列,生产者(producer)产生消息,发布到消息队列(queue)
中去,最后发到监听的消费者

1.png

  rabbitMQ基本概念:
  内部结构图

2.png

    1、Message:消息,消息不具名的,由消息头和消息体构成消息体不透明,消息头由部分属性构成,包括routing-key(路由键)、priority(优先级)、delivery-mode(消息的持久化属性)
    2、Publisher
      消息生产者,向消息交换机发布消息的客户端应用程序
    3、Exchange
      交换器,接收生产者发送的消息并路由给服务器的队列
    4、Binding
      消息路由和消息队列的绑定,基于路由键将交换器和队列关联起来的规则,可以理解成一张路由表
    5、Queue
      消息队列,是消息的容器,一个消息可以投入到一个或多个队列,等待消费者链接到队列将消息取走。
    6、Connection
      网络连接,比如TCP协议
    7、Channel
      信道,信道是建立在真实TCP链接内的虚拟链接,AMQP命令都是通过信道发送的,不管是消息发布还是订阅队列和消费消息都是通过信道完成的,因为操作系统创建销毁TCP链接的开销相对比较高,引入信道的概念,复用一个TCP链接。
    8、Consumer
        消费者,表示一个从消息队列中取出消息的一个客户端。
    9、Virtual Host
        虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密的独立服务器域,每一个vhost的本质就是一个mini版的rabbit服务器,有自己的路由、队列、绑定和权限机制,vhost是AMQP概念的基础,必须在链接是指定,默认为/
    10、Broker
        消息服务器实体
三、消息路由
  AMQP中增加了Exchange和Binding角色,消息发送到Exchange到达队列在到消费者,Exchange负责接收消息,Binding决定Exchange的消息发布到哪个队列中去。
  AMQP消息路由过程
3.png
  Exchange类型:
    Exchange分发消息时根据类型不同分发的策略有区别,目前分为四个类型,direct、fanout、topic、headers。headers匹配AMQP的header值而不是键,headers交换器和direct交换器完全一致,但是性能差很多。
    1、direct
4.png
      消息中的路由键(routing key)和绑定中的bindkey一致,交换器就讲消息放到对应的队列中去,路由键必须完全匹配,单播的模式。
    2、fanout
5.png
      每个发到fanout交换器的消息都会分发到对应绑定的队列中去,不会处理路由的键,消息转发是最快的。
    3、topic
6.png
      topic交换器通过模式匹配分发消息,将路由键和某个模式匹配,此时队列需要绑定到一个模式上,他将路由键和绑定键的字符串切分成单词,单词间用点隔开,匹配用"#"和""两个字符匹配,#表示匹配0个或多个单词,仅匹配一个单词。

四、使用rabbitMQ在java中的使用
  1、生产者创建数据

 //创建连接工厂
    ConnectionFactory factory = new ConnectionFactory();
    //设置用户名密码
    factory.setUsername("guest");
    factory.setPassword("guest");
    //设置rabbitMQ地址
    factory.setHost("localhost");
    //创建连接
    Connection conn = factory.newConnection();
    //获取信道
    Channel channel = conn.createChannel();
    //声明交换器
    String exchangeName = "hello-exchange";
    channel.exchangeDeclare(exchangeName, "direct", true);
    //发布消息
    byte[] messageBodyBytes = "quit".getBytes(); 
    String routingKey = "hola"; 
    channel.basicPublish(exchangeName, routingKey, null, messageBodyBytes);
    //关闭信道
    channel.close();
    //关闭连接
    conn.close();

2、消费者消费数据

//创建链接工厂
ConnectionFactory factory=new ConnectionFactory();
//设置rabbitMQ地址
factory.setHost("39.105.16.12");
factory.setPort(5672);
factory.setVirtualHost("/");
//设置用户名密码
factory.setUsername("guest");
factory.setPassword("guest");
最后修改:2018 年 07 月 30 日
如果觉得我的文章对你有用,请随意赞赏