zoukankan      html  css  js  c++  java
  • amqp笔记

    1、exchange

    message的生产者可以将消息发送给exchange,然后由exchange路由到不同的queue中。

    exchange有4种类型:

    direct exchange:msg只会路由到一个queue上。当有多个queue以相同到routing key接入到direct exchange时,将产生round robin的效果。

    fanout exchange:msg在exchange中会自动复制,并分发至所有接入到exchange中的queue上,达到广播的效果。

    topic exchange:

    header exchange:

    此外,exchange还有多个重要的属性:

    name

    durability:可选值为[durable,transient],当设置为durable时,exchange重启后,将自动恢复。

    auto-deleting:当最后一个bond在exchange上的queue解绑时,将自动删除exchange。

    在特殊情况下,一个message可以被返还给publisher、丢弃或转到“dead letter queue”中,这取决于生产者在publish message时的配置。

    2、queue

    queue有一些重要的特性:

    name:queue的名称,最大长度255byte

    durable:在服务重启后,queue是否恢复

    autodelete:当最后一个subscriber消失后,是否自动删除queue?

    其他参数:例如msg是否带有ttl超时时间、队列长度是否设限等。

    queue在使用前需要先声明。声明一个queue时,如果该queue尚未存在,则amqp创建之。若queue已经存在,且所有配置均与声明的相同,则不做操作;若queue存在,但参数配置却不相同,则报PRECONDITION_FAILED错误。

    2.1 queue name

    应用程序可以为queue指定一个名字,也可以申请broker帮忙分配一个名字,名字的长度最大为255byte,可以使用utf-8字符。

    若是申请broker帮忙分配名字,那么名字将携带在declare的response中返回给应用程序。

    有“amq.”前缀的名字默认为amqp内部使用,若用户声明的queue带有这样的名称,则会收到ACCESS_REFUSED错误。

    2.2 queue durabilty

    设置为durability的queue会持久化到磁盘,当broker重启后,会重新加载进来。但是并非每条存放在durability queue中message都会持久化,而是只有persistent message才会持久化。

    3. bindings

    binding是exchange将message路由到queue中的规则。若想让exchange中的message可以路由到某个queue,则queue必须先bond到queue上。对于一些类型的exchange,它使用routing key作为路由的依据,类似filter功能。

    当一条消息无法被路由到任何一个queue时,该消息可以被返还给publisher或直接销毁(采用那种行为取决与publisher的设置)。

    4. consumers

    消息需要被consumer消费才有意义。

    consumer有两种方式来消费message。

    push方式:由broker推送给订阅了queue的consumer。

    pull方式:由consumer自己到queue中拉取message。

    当使用push方式时,我们称consumer被“注册”(registe)到了queue上。一个queue可以被多个consumer注册。此外,consumer也可以以exclusive的方式来注册,此时,consumer是排他的,当自己在消费时,其他consumer不能从queue中消费。

    每个consumer都有一个自己的tag(称为consumer tag),可以用来从queue上unsubscribe。

    5. message ack

    amqp定义了两种ack模式,自动ack和显式ack。

    自动ack指的是当message被从queue中消费后,自动从queue中删除。(发生在basic.deliver或basic.get_ok后)

    显式ack指的是,只有当application发送ack消息后,消息才会从queue中删除。(发生在basic.ack后)

    6. rejecting message

    当consumer处理一个message失败后,它可以通过丢弃或重入queue的方式来reject这个message。

    7.nack

    8.prefetching messages

    amqp可以设定在下个ack到来之前,一次性索取多条message,如此可以优化系统的throughput。

    9.message‘s attribute and payload

    9.1 message attribute

    在amqp中,message可以有很多属性,例如:

    content type

    content encodeing

    routing key

    delivery mode(persistent or not)

    message priority

    message publishing timestamp

    expiration period:超时时间

    publisher application id

    message的属性可以被broker使用,也可以被consumer使用。

    当message以persistent方式发布时,broker将会把它们持久化到磁盘中。当系统重启的时候,broker保证已收到的persistent类型的数据不丢失。将数据的persistent标志设为true会导致一定的性能下降(因为需要做持久化动作)。

    9.2 message payload

    payload是message携带的内容,它可以为空。payload以byte数组的方式被传递。broker不会查看和检查payload的内容。

    可以使用场景的编码协议来构造payload中的内容,例如json、thrift、protobuf等。

    amqp的生产者和消费者通常使用content type和content encoding属性来判断payload中消息内容的编码方式。

    10.connection

    amqp使用长链接,并且支持tls。

    当一个应用不再与amqp链接时,应该显示释放 amqp的connection,而不是直接断开它底层的tcp链接。

    11.channels

    有一些程序需要与多个queue相连,此时,不需要建立多个长链接。

    amqp使用channel来实现connection长链接的复用。对于使用多线程的应用而言,应每个线程一个channel,而不是多个线程共享同一个channel。

    12. virtual host

    amqp还定义了virtual host概念,用来将user、exchange、queue划分到不同的namespace中。

    应用程序在与amqp建立链接时,可以指定自己的命名空间。

  • 相关阅读:
    Mysql添加用户和数据库
    Ubuntu Apache vhost不执行php小记
    buff/cache内存占用过多
    yii2 返回json和文件下载
    yii2 activeform 替換 form-gruop
    VSCode+Ionic+Apache Ripple开发环境搭建
    安装ionic出现node-sass无法下载的解决方法
    VS2015 + Cordova Html5开发使用Crosswalk Web引擎
    visual studio 2015 + Cordova 开发环境搭建
    ADSL自动更换IP地址源代码
  • 原文地址:https://www.cnblogs.com/elaron/p/10086501.html
Copyright © 2011-2022 走看看