1,基本概念-RabbitMQ

内容参考自:https://liuyueyi.github.io/hexblog/2018/05/27/RabbitMQ%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B%E4%B9%8B%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/

RabbitMQ是一个消息队列,消息队列的主要目的实现消息的生产者和消费者之间的解耦,支持多应用之间的异步协调工作。

1. 消息队列

可以划分为三个角色: Producer, Queue, Consumer

 

  • queue:为承载消息的容器,为什么是队列而不是栈呢?主要是因为绝大部分的场景,我们都是希望消息是先进先出,有顺序的
  • Producer:生产者,就是产生消息,并不断往队列塞的角色
  • Consumer:消费者,也就是不断从队列中获取消息的角色

RabbitMQ基本概念 

åé¨ç»æå¾

 

  • Message:消息,包含消息头(即附属的配置信息)和消息体(即消息的实体内容)
  • Publisher:生产者,向交换机发布消息的主体
  • Exchange:交换机,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
  • Binding:绑定,用于给Exchange和Queue建立关系,就是我们熟知的配对的红娘
  • Queue:消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
  • Connection:连接
  • Channel:通道,MQ与外部打交道都是通过Channel来的,发布消息、订阅队列还是接收消息,这些动作都是通过Channel完成;简单来说就是消息通过Channel塞进队列或者流出队列
  • Consumer:消费者,从消息队列中获取消息的主体
  • Virtual Host: 虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 /
  • Broker:消息队列服务器实体

2. Exchange类型 

生产者,将消息投递给Exchange,然后由Exchange将消息路由到对应的Queue上,供消费者消费,那么这个路由有哪些方式呢?

Direct策略

IMAGE

消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中

简单来讲,就是路由键与队列名完全匹配

  • 如果一个队列绑定到交换机要求路由键为“dog”
  • 只转发 routing key 标记为“dog”的消息,
  • 不会转发“dog.puppy”,也不会转发“dog.guard”等等
  • 它是完全匹配、单播的模式

举例说明

IMAGE 

 

Exchange和两个队列绑定在一起:

  • Q1的bindingkey是orange
  • Q2的binding key是black和green.
  • 当Producer publish key是orange时, exchange会把它放到Q1上, 如果是black或green就会到Q2上, 其余的Message被丢弃

 Fanout策略

IMAGE 

从上图也可以看出,这种策略,将忽略所谓的routing key,将消息分发到所有绑定的Queue上,更加类似我们理解的广播模式

Topic策略

IMAGE

 

topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上

可以理解为直接策略的进阶版,直接策略是完全精确匹配,而topic则支持正则匹配,满足某类指定规则的(如以xxx开头的路由键),可以键消息分发过去

  • # 匹配0个或多个单词
  • * 匹配不多不少一个单词

IMAGE 

Producer发送消息时需要设置routing_key,

  • Q1 的binding key 是”.orange.“
  • Q2 是 “..rabbit” 和 “lazy.#”:
  • 产生一个 test.orange.mm 消息,则会路由到Q1;而如果是 test.orange则无法路由到Q1,因为Q1的规则是三个单词,中间一个为orange,不满足这个规则的都无效
  • 产生一个 test.qq.rabbit 或者 lazy.qq 都可以分发到Q2;即路由key为三个单词,最后一个为rabbit或者不限制单词个数,主要第一个是lazy的消息,都可以分发过来
  • 如果产生的是一个 test.orange.rabbit消息,则Q1和Q2都可以满足

Headers策略 

 这个实际上用得不多,它是根据Message的一些头部信息来分发过滤Message,忽略routing key的属性,如果Header信息和message消息的头信息相匹配

小结

主要使用的消息分发策略有三个,直接,路由和扇形,简单的小结下应用场景和区别

a. Direct Exchange

直接完全匹配模式,适用于精准的消息分发

b. Topic Exchange

Routing Key的匹配模式,支持Routing Key的模糊匹配方式,更适用于多类消息的聚合

c. Fanout Exchange

忽略Routing Key, 将消息分配给所有的Queue,广播模式,适用于消息的复用场景

3.ACK

消息队列的一个重要指标,当有消费者获取了消息之后,对这个消息我应该怎么办?是直接删除还是等某个合适的机会再删除?又或者是干脆不删除,就留着了?

在实际的应用场景中,消息正常消费之后,我们希望的是这个消息就不要了,但是消费的过程中如果出现了bug,则希望不要删除消息,等我修复这个bug后,可以把这个消息重新的投递给我

ack机制

Consumer接收到了消息之后,必须返回一个ack的标志,表示消息是否成功消费,如果返回true,则表示消费成功了,然后这个消息就会从RabbitMQ的队列中删掉;如果返回false,且设置为重新入队,则这个消息可以被重新投递进来

通常实际编码中,默认是自动ACK的,如果消息的重要性程度较高,我们应该设置为主动ACK,在接收到消息之后,自主的返回对应的ACK信息

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值