• RabbitMQ学习(一):RabbitMQ要点简介


    转载:http://blog.csdn.net/leixiaotao_java/article/details/78909760#t0

    1、什么是RabbitMQ?

    RabbitMQ是由Erlang语言编写的实现了高级消息队列协议(AMQP)的开源消息代理软件(也可称为 面向消息的中间件)。支持Windows、Linux/Unix、MAC OS X操作系统和包括JAVA在内的多种编程语言。

    AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受 客户端/中间件 不同产品,不同的开发语言等条件的限制。

    2、RabbitMQ中的重要概念

     

    图片来源于网络

     

    (1)Broker:经纪人。提供一种传输服务,维护一条从生产者到消费者的传输线路,保证消息数据能按照指定的方式传输。粗略的可以将图中的RabbitMQ Server当作Broker。

    (2)Exchange:消息交换机。指定消息按照什么规则路由到哪个队列Queue。

    (3)Queue:消息队列。消息的载体,每条消息都会被投送到一个或多个队列中。

    (4)Binding:绑定。作用就是将Exchange和Queue按照某种路由规则绑定起来。

    (5)RoutingKey:路由关键字。Exchange根据RoutingKey进行消息投递。

    (6)Vhost:虚拟主机。一个Broker可以有多个虚拟主机,用作不同用户的权限分离。一个虚拟主机持有一组Exchange、Queue和Binding。

    (7)Producer:消息生产者。主要将消息投递到对应的Exchange上面。一般是独立的程序。

    (8)Consumer:消息消费者。消息的接收者,一般是独立的程序。

    (9)Channel:消息通道,也称信道。在客户端的每个连接里可以建立多个Channel,每个Channel代表一个会话任务。

     

    3、RabbitMQ的使用流程

    AMQP模型中,消息在producer中产生,发送到MQ的exchange上,exchange根据配置的路由方式投递到相应的Queue上,Queue又将消息发送给已经在此Queue上注册的consumer,消息从queue到consumer有push和pull两种方式。

    消息队列的使用过程大概如下:

    (1)客户端连接到消息队列服务器,打开一个channel。

    (2)客户端声明一个exchange,并设置相关属性。

    (3)客户端声明一个queue,并设置相关属性。

    (4)客户端使用routing key,在exchange和queue之间建立好Binding关系。

    (5)生产者客户端投递消息到exchange。

    (6)exchange接收到消息后,就根据消息的RoutingKey和已经设置的binding,进行消息路由(投递),将消息投递到一个或多个队列里。

    (7)消费者客户端从对应的队列中获取并处理消息。

    4、RabbitMQ的优缺点

    优点

    (1)由Erlang语言开发,支持大量协议:AMQP、XMPP、SMTP、STOMP。

    (2)支持消息的持久化负载均衡集群,且集群易扩展。

    (3)具有一个Web监控界面,易于管理。

    (4)安装部署简单,上手容易,功能丰富,强大的社区支持。

    (5)支持消息确认机制、灵活的消息分发机制。

    缺点

    (1)由于牺牲了部分性能来换取稳定性,比如消息的持久化功能,使得RabbitMQ在大吞吐量性能方面不及Kafka和ZeroMQ。

    (2)由于支持多种协议,使RabbitMQ非常重量级,比较适合企业级开发。

    因此当需要一个稳定的、高可靠性的、功能强大且易于管理的消息队列可以选择RabbitMQ。如果对消息吞吐量需求较大,且不在乎消息偶尔丢失的情况可以使用Kafka。

    5、Exchange类型

    5.1、Direct Exchange

    (1)名称:直接交换器类型

    (2)默认的预先定义exchange名字:空字符串或者amq.direct

    (3)作用描述:根据Binding指定的Routing Key,将符合Key的消息发送到Binding的Queue。可以构建点对点消息传输模型

     

    图片源于网络

     

    如图中RoutingKey分别是error、info、warning,其中error被Binding(绑定)到queue1和queue2上,info和warning被Binding到queue2上。当消息的RoutingKey是error,这条消息将被投递到queue1和queue2中(相当于消息被复制成两个分别投放到两个queue中),然后分别被Consumer1和Consumer2处理。如果消息的RoutingKey是info或者warning,这条消息只会被投递到queue2中,然后被Consumer2处理。如果消息的RoutingKey是其他的字符串,这条消息则会被丢弃。

    5.2、Fanout Exchange

    (1)名称:广播式交换器类型

    (2)默认的预先定义exchange名字:amq.fanout

    (3)作用描述:将同一个message发送到所有同该Exchange 绑定的queue。不论RoutingKey是什么,这条消息都会被投递到所有与此Exchange绑定的queue中。

     

    图片来源于网络

     

    广播式交换器类型的工作方式:不使用任何参数将queue和Exchange进行Binding,发布者publisher向Exchange发送一条消息(注意:直接交换器类型中的producer变成了publisher,其中隐含了两种交换器的区别),然后这条消息被无条件的投递给所有和这个Exchange绑定的queue中。

    如图中,没有RoutingKey的限制,只要消息到达Exchange,都会被投递到queue1和queue2中,然后被对应的Consumer处理。

    5.3、Topic Exchange

    (1)名称:主题交换器类型

    (2)默认的预先定义exchange名字:amq.topic

    (3)作用描述:根据Binding指定的RoutingKey,Exchange对key进行模式匹配后投递到相应的Queue,模式匹配时符号“#”匹配一个或多个词,符号“*”匹配正好一个词,而且单词与单词之间必须要用“.”符号进行分隔。此模式可以用来支持经典的发布/订阅消息传输模型-使用主题名字空间作为消息寻址模式,将消息传递给那些部分或者全部匹配主题模式的queue。

     

    图片来源于网络

     

        如图中,假如消息的RoutingKey是American.action.13,这条消息将被投递到Q1和Q2中。假如RoutingKey是American.action.13.test(注意:此处是四个词),这条消息将会被丢弃,因为没有routingkey与之匹配。假如RoutingKey是Chinese.action.13,这条消息将被投递到Q2和Q3中。假如RoutingKey是Chinese.action.13.test,这条消息只会被投递到Q3中,#可以匹配一个或者多个单词,而*只能匹配一个词。

    5.4、Headers Exchange

    (1)名称:标题交换器类型

    (2)默认的预先定义exchange名字:amq.matchamq.headers

    (3)作用描述:同direct exchange类似,不同之处是不再使用Routing Key路由,而是使用headers(Message attributes)进行匹配路由到指定Queue。

    Headers类型的exchange使用的比较少,它也是忽略routingKey的一种路由方式。是使用Headers来匹配的。Headers是一个键值对,可以定义成HashTable。发送者在发送的时候定义一些键值对,接收者也可以再绑定时候传入一些键值对,两者匹配的话,则对应的队列就可以收到消息。匹配有两种方式all和any。这两种方式是在接收端必须要用键值"x-mactch"来定义。all代表定义的多个键值对都要满足,而any则代码只要满足一个就可以了。fanout,direct,topic exchange的routingKey都需要要字符串形式的,而headers exchange则没有这个要求,因为键值对的值可以是任何类型。

    代码示例请参考文章RabbitMQ学习之Headers交换类型(java)》

    下一篇文章:《RabbitMQ学习(二):Java使用RabbitMQ要点知识

  • 相关阅读:
    逆序数 POJ 2299 Ultra-QuickSort
    DP URAL 1244 Gentlemen
    找规律 SGU 107 987654321 problem
    找规律 SGU 126 Boxes
    DP VK Cup 2012 Qualification Round D. Palindrome pairs
    模拟 Coder-Strike 2014
    模拟 Codeforces Round #203 (Div. 2) C. Bombs
    DFS HDOJ 2614 Beat
    最短路(Floyd_Warshall) POJ 2240 Arbitrage
    最短路(Floyd_Warshall) POJ 1125 Stockbroker Grapevine
  • 原文地址:https://www.cnblogs.com/wangzhuxing/p/8341734.html
Copyright © 2020-2023  润新知