rabbitmq 学习记录 -- 基本概念

派猴子来的救兵

messag queue嘛, 就是生产者往里扔东西, 消费者取走. 但是要涉及到细节,还是有些多的.

基本概念

其实就是官网文档的搬运工.

路由模型

先来看看一条消息的生命线, 生产者把消息发送到exchange, 然后根据exchange的类型和routing key(消息发送时的一个参数), 把这条消息路由到不同的队列中去, 图片中是发到了一个列队, 其实也可以到多个. 然后消费都从队列中把消息取走. 和kafka有些不同, rabbitmq里面的一个队列里面一条消息被一个消费者拿走之后, 就不可能再被其他人取到了(不考虑ACK的时候).

queue

队列, 就是存储消息的容器. 有些属性

  • Name
  • Durable (the queue will survive a broker restart)
  • Exclusive (used by only one connection and the queue will be deleted when that connection closes)
  • Auto-delete (queue is deleted when last consumer unsubscribes)
  • Arguments (some brokers use it to implement additional features like message TTL)

使用queue之前, 需要先声明. 生产者和消费者都可以申明声明. 声明的时候如果队列已经存在了, 也没啥事, 但是如果再次声明的时候, 已经存在的队列参数和当时申明的参数不一样, 是会报错的.

exchange

生产者不和queue接触, 消息全部是通过exchange转到对应的queue的. 每一个队列都和一个或者多个exchange绑定在一起. 声明一个queue的时候, 它已经和default exchange绑定在一起了.

exchange有四种类型, 每种有不同的路由方式~

先看一下exchange的属性吧

  • Name
  • Durability (exchanges survive broker restart)
  • Auto-delete (exchange is deleted when all queues have finished using it)
  • Arguments (these are broker-dependent)

说exchange类型之前, 要先知道routing key的概念. - queue和exchange绑定的时候, 是有一个routing key的, 为了和下面的routing key区别开来, 还是叫做binding key吧. - 发送一条消息时, 有个参数, 叫routing key - exchange type, bind key, routing key这三个东西结合在一起, 就决定了这条消息最终被路由到哪个/哪几个queue里面.

  1. direct exchange

    发送到direct的消息, 会找到和routing key一样的binding key的队列, 发过去. 一般来说, 这种exchange就是为了点对点的发消息, 一个消息就是固定发到一个特定的queue中. 但是一定要用来发到多个queue也是可以的.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pika
import sys

def main():
    body = ‘ ‘.join(sys.argv[1:]) or ‘Hello World‘

 connection = pika.BlockingConnection(pika.ConnectionParameters(host=‘localhost‘))
    channel = connection.channel()

    channel.queue_declare(queue=‘hello1‘)
    channel.queue_bind(exchange=‘amq.direct‘, queue=‘hello1‘,routing_key="hello")

    channel.queue_declare(queue=‘hello2‘)
    channel.queue_bind(exchange=‘amq.direct‘, queue=‘hello2‘,routing_key="hello")

    channel.basic_publish(exchange=‘amq.direct‘,
                        routing_key=‘hello‘,
                        body=body)
    connection.close()

if __name__ == ‘__main__‘:
    main()
  1. fanout

    这种类型的exchange会把消息发到每一个和他绑定的队列, routing/binding key被忽略. 适合用广播(和简单订阅?)

  2. topic

    比较灵活的路由方式, routing key可以用通配符.

    * (star) can substitute for exactly one word.
    # (hash) can substitute for zero or more words.

    直接看图吧

  3. headers
    这种路由的方式还是很灵活的.

    如果需要绑定的不是一个特定的字符串, 而多个属性. 比如一条服务器的消息, 有OS, 有CPU核数, 有内存大小, 希望这些全部都匹配成功时,也可以是有一条匹配成功时,发到你的队列中来. 这个时候用headers exchange就比较方便.

    绑定的时候,一个重要的参数是x-match. 如果是all,就是说所有属性匹配成功才发到这个队列. 如果是any,就是任意一个属性匹配成功啦.

    这里也有个python的例子 Using pika to create headers exchanges with RabbitMQ in python

  4. default
    官网上把default exchange单独列了出来, 不过在我看来, default exchange就是一个direct exchange. 只是有些特殊的地方:

    1. 创建一个queue的时候, 自动绑定到default exchange. binding key就是队列名字
    2. 一个queue不能和default exchange解除绑定 (这点我不100%确定)

我只是大概翻译一下官网文档,记录一下. 这里对exchange介绍的更加详细. Working with RabbitMQ exchanges 这里面介绍比较详细.

时间: 2024-08-05 13:13:07

rabbitmq 学习记录 -- 基本概念的相关文章

RabbitMQ学习记录1

前言 我是在解决分布式事务的一致性问题时了解到RabbitMQ的,当时主要是要基于RabbitMQ来实现我们分布式系统之间对有事务可靠性要求的系统间通信的.关于分布式事务一致性问题及其常见的解决方案,可以看我另一篇博客.提到RabbitMQ,不难想到的几个关键字:消息中间件.消息队列.而消息队列不由让我想到,当时在大学学习操作系统这门课,消息队列不难想到生产者消费者模式.(PS:操作系统这门课程真的很好也很重要,其中的一些思想在我工作的很长一段一时间内给了我很大帮助和启发,给我提供了许多解决问题

rabbitmq 学习记录 -- ACK和数据持久化

派猴子来的救兵 为了数据不丢失, 需要在两个层面上做一些配置. 一个是ACK, 一个是数据持久化. ACK 如果没有启用的话, 消费者拿走消息的时候, queue就把它删除了. 消费者拿走一条消息之后, 还没有处理完就crash了. 那么这条消息就丢失了. 为了保证消息一定被处理完了才从queue中被删掉, 就要启用Message acknowledgment . 启用之后, queue会在收到ack之后把消息删掉. 在这里没有timeout的概念, 哪怕这个任务执行很久, 不管多久, 会一直等

rabbitmq 学习记录 -- TTL

派猴子来的救兵 queue本身的TTL 注意, 这里说的是queue本身的TTL. 不是说里面的消息 声明一个队列的时候, 可以用x-expires指定队列的TTL值. 过期之后, 这个队列就被删掉了. 不管里面是不是还有消息没有消费 #!/usr/bin/env python # -*- coding: utf-8 -*- ''' the queue exists for only 5 seconds, whether there is messages! ''' import pika im

RabbitMQ 学习记录

rabbit mq知识点:1.消费时可以通过acknowledge设定消费是否成功,消费不成功时在server端requeue2.需要注意两个持久化:queue持久化和消息持久化(通过代码设定,默认即时开启持久化,消息有一定丢失可能)3.可以在一个connection上并发运行多个channel rabbit mq问题: 1.现在消费者是按条消费的,如何改成按批次消费 2.多消费者时采取轮询模式,例如有两个消费者AB分配5个任务,则A分配到0.2.4,B分配到1.3 ,此时如果A执行0任务时阻塞

rabbitmq学习笔记2 基本概念

官网:http://www.rabbitmq.com 参考:http://blog.csdn.net/column/details/rabbitmq.html 1 基本概念 rabbitmq server(broker server):rabbitmq服务 client:包括producers和consumer message:包括payload和label exchange:producer发布message的地方 queue:messages存放和consumer收取message的地方 b

Python学习记录-2016-12-17

今日学习记录 模块: import os#导入os模块 import sys#导入sys模块 os.system("df -h")#执行df -h命令 cmd_res = os.popen("df -h").read()#将命令的返回结果赋值给cmd_res,如果不加入.read()会显示命令的返回加过在内存的位置 print(sys.path)#显示系统变量路径,一般个人模块位于site-packages下,系统模块位于lib下 print(sys.argu[2]

Windows API 编程学习记录<二>

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Windows API 编程学习记录<三>

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

java学习记录(2):JMenuBar

1.在用这个时候发现很多的组件都有J的前缀,例如Button和JButton,前者是awt包的,后者是swing包的,两者耳朵区别是: AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口.AWT 中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,我们把它称为peers. 也就是说,当我们利用 AWT 来构件图形用户界面的时候,我们实际上是在利用操作系统所提供的图形库.由于不同操作系统的图形库所提供的功能