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建立链接时,可以指定自己的命名空间。

amqp笔记的更多相关文章

  1. 消息中间件 | 消息协议 | AMQP -- 《分布式 消息中间件实践》笔记

    04年,AMQP开放标准被开发 06年,AMQP规范被发布   基本概念     Message:与平台无相关的数据.     Publisher:向交换器发布消息的客户端应用程序     Excha ...

  2. celery 学习笔记 01-介绍

    celery 学习笔记 01-介绍 celery 是 python 中的常用的任务队列框架,经常用于异步调用.后台任务等工作.celery 本身以 python 写,但协议可在不同的语言中实现,其它语 ...

  3. openstack学习笔记一 虚拟机启动过程代码跟踪

    openstack学习笔记一 虚拟机启动过程代码跟踪 本文主要通过对虚拟机创建过程的代码跟踪.观察虚拟机启动任务状态的变化,来透彻理解openstack各组件之间的作用过程. 当从horizon界面发 ...

  4. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  5. RabbitMQ 学习开发笔记

    基本概念 ConnectionFactory.Connection.Channel ConnectionFactory.Connection.Channel,这三个都是RabbitMQ对外提供的API ...

  6. Spring Boot 快速入门笔记

    Spirng boot笔记 简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...

  7. Celery配置实践笔记

    说点什么: 整理下工作中配置celery的一些实践,写在这里,一方面是备忘,另外一方面是整理成文档给其他同事使用. 演示用的项目,同时也发布在Github上: https://github.com/b ...

  8. RabbitMQ学习笔记1-hello world

    安装过程略过,一搜一大把. rabbitmq管理控制台:http://localhost:15672/   默认账户:guest/guest RabbitMQ默认监听端口:5672 JAVA API地 ...

  9. C#RabbitMQ基础学习笔记

    RabbitMQ基础学习笔记(C#代码示例) 一.定义: MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开发).MQ是一种应用程序对应用程序的通信方法. ...

随机推荐

  1. logback实践笔记

    前言 ​ 每次看公司配置好的logback文件的时候,都不知道什么意思.导致有的时候,一些项目发到测试环境的时候,有的项目没有打印日志,自己都不知道哪里有问题.所以自己新建一个springboot项目 ...

  2. ORM(二)

    一.ORM简介         对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.简单的说,ORM是通过使 ...

  3. 路由网关---zuul

    Zuul:Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架.Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门. 在微服务盛行的时代,客户端与系统之 ...

  4. YOLO系列:YOLO v3解析

    本文好多内容转载自 https://blog.csdn.net/leviopku/article/details/82660381 yolo_v3 提供替换backbone.要想性能牛叉,backbo ...

  5. 2046 ACM 数学

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2046 思维:与之前有两道题目相似,n可以由n-1和n-2递推过来.f(n)=f(n-1)*1+f(n-2) ...

  6. 2159 ACM 杭电 杀怪 二维费用的背包+完全背包问题

    题意:已知经验值,保留的忍耐度,怪的种数和最多的杀怪数.求进入下一级的最优方案. 思路:用二维费用的背包+完全背包问题 (顺序循环)方法求解 什么是二维费用的背包问题? 问题: 二维费用的背包问题是指 ...

  7. 3ds max学习笔记(十六)-- 摄像机

    摄像机添加以及应用技巧:可以更改观察的视点和空间广阔,模拟景深和运动模糊效果: 1,添加:更改观察的角度和位置,增加场景透视感: 基本操作: 景深:

  8. Ruby语法基础(三)

    Ruby语法基础(三) ​ 在前面快速入之后,这次加深对基本概念的理解. 字符串 ​ Ruby字符串可以分为单引号字符串和双引号字符串,单引号字符串效率更高,但双引号的支持转义和运行 puts '单引 ...

  9. Python类的几点笔记

    1. class A: def __init__(self, a, b): self.a = a self.b = b print(a, b) class B(A): def __init__(sel ...

  10. selenium 3+java 配置全

    之前有配置过java+selenium的环境,感觉将的不够详细,这里重新写一篇,以便日后复习,和大家共享. 一.准备工作. 首先在配置之前需要准备以下:   JDK    Eclipse    Sel ...