• AMQP协议



    AMQP介绍

    AMQP是什么

    AMQP(高级消息队列协议)是一个网络协议。rabbitmq是基于AMQP标准开发的。

    AMQP模型简介

    AMQP的工作过程如下图:消息(message)被发布者(publisher)发送给交换机(exchange),交换机常常被比喻成邮局或者邮箱。然后交换机将收到的消息根据路由规则分发给绑定的队列(queue)。最后AMQP代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。

    交换机和交换机类型

    交换机是用来发送消息的AMQP实体。交换机拿到一个消息之后将它路由给一个或零个队列。它使用哪种路由算法是由交换机类型和被称作绑定(bindings)的规则所决定的。AMQP的代理提供了四种交换机

    Name(交换机类型)Default pre-declared names(预声明的默认名称)
    Direct exchange(直连交换机) (Empty string) and amq.direct
    Fanout exchange(扇型交换机) amq.fanout
    Topic exchange(主题交换机) amq.topic
    Headers exchange(头交换机) amq.match (and amq.headers in RabbitMQ)

    直连交换机

    直连型交换机(direct exchange)是根据消息携带的路由键(routing key)将消息投递给对应队列的。直连交换机用来处理消息的单播路由(可以处理多播路由)

    工作过程:

    • 将一个队列绑定到某个交换机上,同时赋予该绑定一个路由键(routing key)
    • 当一个携带着路由键为R的消息被发送给直连交换机的时候,交换机会把它路由给绑定值为同样为R的队列。

    直连交换机经常用来循环分发任务给多个工作者。这样做的时候,我们需要明白一点,在AMQP中,消息的负载均衡是发生在消费者之间的,而不是队列之间。

    扇形交换机

    扇形交换机(funout exchange)将消息路由给绑定到他身上的所有队列,而不理会绑定的路由键。如果N个队列绑定到某个扇形交换机上,当有消息发送给此扇形交换机时,交换机会将消息的拷贝分别发送给所有队列。扇形交换机用来处理信息的广播路由。

    因为扇型交换机投递消息的拷贝到所有绑定到它的队列,所以他的应用案例都极其相似:

    • 大规模多用户在线(MMO)游戏可以使用它来处理排行榜更新等全局事件
    • 体育新闻网站可以用它来近乎实时地将比分更新分发给移动客户端
    • 分发系统使用它来广播各种状态和配置更新
    • 在群聊的时候,它被用来分发消息给参与群聊的用户。(AMQP没有内置presence的概念,因此XMPP可能会是个更好的选择)

    主题交换机

    主题交换机(topic exchanges)通过对消息的路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列。主题交换机经常用来实现各种分发/订阅模式及其变种。主题交换机通常用来实现消息的多播路由。

    主题交换机拥有非常广泛的用户案例。无论何时,当一个问题涉及到那些想要有针对性的选择需要接收消息的 多消费者/多应用(multiple consumers/applications) 的时候,主题交换机都可以被列入考虑范围。

    使用案例:

    • 分发有关于特定地理位置的数据,例如销售点
    • 由多个工作者(workers)完成的后台任务,每个工作者负责处理某些特定的任务
    • 股票价格更新(以及其他类型的金融数据更新)
    • 涉及到分类或者标签的新闻更新(例如,针对特定的运动项目或者队伍)
    • 云端的不同种类服务的协调
    • 分布式架构/基于系统的软件封装,其中每个构建者仅能处理一个特定的架构或者系统。

    头交换机

    有时候信息的路由键会涉及到多个属性,此时用消息头就比用路由键更容易表达。头交换机(headers exchange)就是为此而生的。头交换机使用多个消息属性来代替路由键建立路由规则。通过判断头的值能否与指定的绑定相匹配来确定路有规则。

    有时消息的路由操作会涉及到多个属性,此时使用消息头就比用路由键更容易表达,头交换机(headers exchange)就是为此而生的。头交换机使用多个消息属性来代替路由键建立路由规则。通过判断消息头的值能否与指定的绑定相匹配来确立路由规则。

    我们可以绑定一个队列到头交换机上,并给他们之间的绑定使用多个用于匹配的头(header)。这个案例中,消息代理得从应用开发者那儿取到更多一段信息,换句话说,它需要考虑某条消息(message)是需要部分匹配还是全部匹配。上边说的“更多一段消息”就是"x-match"参数。当"x-match"设置为“any”时,消息头的任意一个值被匹配就可以满足条件,而当"x-match"设置为“all”的时候,就需要消息头的所有值都匹配成功。

    头交换机可以视为直连交换机的另一种表现形式。头交换机能够像直连交换机一样工作,不同之处在于头交换机的路由规则是建立在头属性值之上,而不是路由键。路由键必须是一个字符串,而头属性值则没有这个约束,它们甚至可以是整数或者哈希值(字典)等。

    绑定

    绑定是交换机将消息路由给队列所需遵循的规则。如果要指示交换机"E"将消息路由给队列"Q",那么"Q"就需要与"E"进行绑定。绑定操作需要定义一个可选的路由键属性给某些类型的交换机。路由键的意义在于从发送给交换机的众多消息中选择出某些消息,将其路由给特定的队列。

  • 相关阅读:
    Unreal Engine 4 蓝图完全学习教程(三)—— 节点的基本知识
    Unreal Engine 4 蓝图完全学习教程(二)—— 初步尝试
    微信小程序框架分析小练手(三)——仿香哈菜谱小程序制作
    Unreal Engine 4 蓝图完全学习教程(一)—— 简要介绍
    微信小程序框架分析小练手(二)——天气微信小程序制作
    微信小程序框架分析小练手(一)——猫眼电影底部标签导航制作
    第四次作业:使用Packet Tracer理解RIP路由协议及ICMP协议
    Python小白入门题一——文件增删改
    katalon studio升级到6.3.3版本后如何生成测试报告
    IP地址网段表示法
  • 原文地址:https://www.cnblogs.com/Xuuuuuu/p/10880640.html
Copyright © 2020-2023  润新知