美文网首页
RabbitMQ系列七 Exchange详细介绍

RabbitMQ系列七 Exchange详细介绍

作者: 时之令 | 来源:发表于2018-11-21 18:55 被阅读0次
    Exchange介绍
    Exchange类型
    Exchange属性

    Exchange介绍(交换机)

    接收消息,根据路由键转发消息到绑定的队列。

    模型图

    Exchange类型

    Direct Exchange
    Topic Exchange
    Fanout Exchange
    Headers Exchange

    Exchange属性
    Virtual host:

    属于哪个Virtual host

    Name :

    名字,同一个virtual host里面的Name不能重复;不同的virtual host是可以重复的。

    Durability:

    是否持久化,Durable:是,Transient:否
    如果不持久化,当break重启之后,当前的exchange会消失

    Auto delete:

    当最后一个绑定被删除后,该exchange自动被删除
    即,在exchange创建之后,并且已经设置好binding,如果该exchange的所有binding都被删除,则该exchange被删除。当然如果当前的exchange还没有开始binding,是不会被删除的。

    Internal:

    是否是内部专用exchange,是的话,就意味着我们不能往该exchange里面发送消息

    Arguments:

    参数,是AMQP协议留给AMQP实现做扩展用的。
    其中rabbit提供了一个属性alternate-exchange,当发送的消息,当前的exchange,根据路由信息没有找到对应的Queue的时候,就会将消息转发到alternate-exchange属性指定的exchange中。如果最总都没有路由到队列中,就会将该条消息丢弃。

    查看exchange列表
    使用rabbitmq的监控管理功能

    管理后台地址:http://192.168.120.131:15672/#/exchanges

    使用rabbitmq自带的命令

    rabbitmqctl list_exchanges 查看默认Virtual host的
    rabbitmqctl list_exchanges -p log 查看指定Virtual host的

    http://192.168.120.131:15672/api/exchanges 需要登陆

    注意:只能查看有权限的exchange列表

    Direct Exchange

    将消息中的Routing key与该Exchange关联的所有Binding中的Routing key进行比较,如果相等,则发送到该Binding对应的Queue中

    1:一个Exchange可以Binding一个或多个Queue
    2:绑定可以指定Routing key, Binding的多个Queue可以使用相同的Routing key,也可以使用不同的Routing key


    Direct Exchange
    default Exchange(名字是空字符串)

    1:默认的Exchange不能进行Binding操作
    2:任何发送到该Exchange的消息都会被转发到Routing key和queue名字相同的Queue中
    3:如果vhost中不存在Routing key中指定的队列名,则该消息会被抛弃

    Topic Exchange
    image.png

    Topic Exchange:将消息中的Routing key与该Exchange关联的所有Binding中的Routing key进行比较,如果匹配上了(匹配上规则),则发送到该Binding对应的Queue中

    匹配规则

    ‘*’ 匹配一个单词
    ‘#’ 匹配0个或多个字符
    *,#只能写在.号左右,且不能挨着字符
    单词和单词之间需要用.隔开

    user.log.#
    user.log.*
    user.log.info.#
    sys.log.#
    sys.log.info.*
    ‘#.log.#’
    .log.
    user.action.#
    *.action.#

    特殊情况

    如果Binding中的Routing key *,#都没有,则相等才转发,类似Direct Exchange
    如果Binding中的Routing key为#或者#.#,则全部转发,类似Fanout Exchange

    user.log.#
    user
    log
    user.log
    user.log.info
    user.log.a
    user.log.a.b
    user.log.info.login

    user.log.*
    user.log.info
    user.log.a
    user.log
    user.log.info.login

    ‘#.log.#’
    log
    user.log
    log.info
    user.log.info
    user.log.info.a

    .log.|’
    log
    user.log
    log.info
    user.log.info
    a.log.b
    user.log.info.a
    a.user.log.info

    *.action.#
    action
    action.log
    user.action.log
    user.action.log.info
    user.action
    user.log.action

    ‘#.action.*’
    action
    user.action
    user.action.action
    user.action.login
    user.action.login.count

    Fanout Exchange

    直接将消息转发到所有Binding的对应的Queue中这种Exchange在路由转发的时候,忽略Routing key这种Exchange效率最高
    Fanout > Direct > Topic
    Topic Exchange可以实现Direct Exchange,Fanout Exchange的效果

    Headers Exchange

    将消息中的headers与该Exchange关联的所有Binding中的参数进行匹配,如果匹配上了,则发送到该Binding对应的Queue中

    匹配规则
    如果Binding中的
    x-match = all :表示所有的键值对都匹配才能转发到消息
    x-match = any :表示只要有键值对匹配就能转发消息

    1:Binding的时候,至少需要指定两个参数,其中的一个是x-match = all 或者x-match = any

    2:Binding的时候,不需要指定Routing key

    3:发送消息的时候,不需要指定Routing key

    4:转发消息的时候,忽略Routing key

    5:如果是x-match = all则发送的headers不能比Binding的参数少,否则匹配不上

    相关文章

      网友评论

          本文标题:RabbitMQ系列七 Exchange详细介绍

          本文链接:https://www.haomeiwen.com/subject/cbmfqqtx.html