【读后感】消息队列 随笔 2-模型(RabbitMQ)

0. 纯当给KafKa蓄个力了

RabbitMQ是一个消息代理

RabbitMQ提供了多种技术可以让你在性能和可靠性之间进行权衡。这些技术包括持久性机制、投递确认、发布者证实和高可用性机制

0.1 集群

在相同局域网中的多个RabbitMQ服务器可以聚合在一起,作为一个独立的逻辑代理来使用。

在同一个集群里,队列可以被镜像到多个机器中,以确保当其中某些硬件出现故障后,你的消息仍然安全。

对于服务器来说,它比集群需要更多的松散和非可靠链接。为此RabbitMQ提供了联合模型。

0.2 扩展

RabbitMQ附带了一个易于使用的可视化管理工具,它可以帮助你监控消息代理的每一个环节

如果你的消息系统有异常行为,RabbitMQ还提供了追踪的支持,让你能够发现问题所在。

RabbitMQ附带了各种各样的插件来对自己进行扩展。你甚至也可以写自己的插件来使用。

1. AMQP模型

AMQP(高级消息队列协议)协议支持符合客户端应用(application)和消息中间件代理(messaging middleware broker)之间进行通信。

消息代理(message brokers)从发布者(publishers)亦称生产者(producers)那儿接收消息,并根据既定的路由规则把接收到的消息发送给处理消息的消费者(consumers)。

1. 1 概述

发布者(publisher)发布消息时可以给消息指定各种消息属性(message meta-data)。有些属性有可能会被消息代理(brokers)使用,然而其他的属性则是完全不透明的,它们只能被接收消息的应用所使用。

从安全角度考虑,网络是不可靠的,接收消息的应用也有可能在处理消息的时候失败。基于此原因,AMQP模块包含了一个消息确认(message acknowledgements)的概念:当一个消息从队列中投递给消费者后(consumer),消费者会通知一下消息代理(broker),这个可以是自动的也可以由处理消息的应用的开发者执行。当“消息确认”被启用的时候,消息代理不会完全将消息从队列中删除,直到它收到来自消费者的确认回执(acknowledgement)。

当消息无法被成功路由时,消息或许会被返回给发布者并被丢弃。或者,如果消息代理执行了延期操作,消息会被放入一个所谓的死信队列中。

请添加图片描述

1.2 交换机

  • Direct exchange(直连交换机)
    (Empty string) and amq.direct
    默认的、绑定的路由键名称同队列
    通常是单播路由,尽管也可多播
    消息的负载均衡是发生在消费者之间的,而不是队列之间
  • Fanout exchange(扇型、广播)
    amq.fanout
    广播路由(绑定到这个交换器上的所有队列),与路由键无关
  • Topic exchange(主题交换机)
    amq.topic
    多播路由,常用于实现分发/订阅模式
  • Headers exchange(头交换机)
    amq.match (and amq.headers in RabbitMQ)
    可以使用多个键值作为路由规则

交换机可以有两个状态:持久(durable)、暂存(transient)
持久化的交换机会在消息代理(broker)重启后依旧存在

1.3 队列

队列名称 可以由应用(application)来取,也可以让消息代理(broker)直接生成一个

1.4 绑定binging

绑定(Binding)是交换机(exchange)将消息(message)路由给队列(queue)所需遵循的规则。

绑定操作需要定义一个可选的路由键(routing key)属性给某些类型的交换机

个人理解,就是 路由的协议(规则)

路由键的意义在于从发送给交换机的众多消息中选择出某些消息,将其路由给绑定的队列

1.5 消息

消息如果只是存储在队列里是没有任何用处的。被应用消费掉,消息的价值才能够体现

1.5.1 消息预取

多个消费者共享一个队列的案例中,明确指定在收到下一个确认回执前每个消费者一次可以接受多少条消息

可以在试图批量发布消息的时候起到简单的负载均衡和提高消息吞吐量的作用
RabbitMQ只支持通道级的预取计数,而不是连接级的或者基于大小的预取。

1.5.2 消息确认

AMQP代理何时正确的删除消息:

  • 当消息代理(broker)将消息发送给应用后立即删除。(使用AMQP方法:basic.deliver或basic.get-ok)

  • 待应用(application)发送一个确认回执(acknowledgement)后再删除消息。(使用AMQP方法:basic.ack)

  • 如果一个消费者在尚未发送确认回执的情况下挂掉了,那AMQP代理会将消息重新投递给另一个消费者

  • 如果当时没有可用的消费者了,消息代理会死等下一个注册到此队列的消费者,然后再次尝试投递

  • 当拒绝某条消息时,应用可以告诉消息代理如何处理这条消息——销毁它或者重新放入队列。请确认不要由于拒绝消息并且选择了重新放入队列的行为而引起消息在同一个消费者身上无限循环的情况发生。

  • basic.reject不能决绝多个的消息
    你可以使用被称作negative acknowledgements(也叫nacks)的AMQP扩展来解决这个问题。

1.6 amqp中的方法、类

AMQP 0-9-1由许多方法(methods)构成。方法即是操作,这跟面向对象编程中的方法没半毛钱关系。AMQP的方法被分组在类(class)中。

举个栗子:exchange.declare 和 exchange.declare-ok,exchange.delete 和 exchange.delete-ok. 这些操作分为“请求 - requests”(由客户端发送)和“响应 - responses”(由代理发送,用来回应之前提到的“请求”操作)。

不是所有的AMQP方法都有与其配对的“另一半”。许多(basic.publish是最被广泛使用的)都没有相对应的“响应”方法,另外一些(如basic.get)有着一种以上与之对应的“响应”方法。

1.7 连接 & 通道 & 虚拟主机

  • AMQP连接通常是长连接。AMQP是一个使用TCP提供可靠投递的应用层协议。
    AMQP使用认证机制并且提供TLS(SSL)保护
    当一个应用不再需要连接到AMQP代理的时候,需要优雅的释放掉AMQP连接,而不是直接将TCP连接关闭。

  • AMQP 0-9-1提供了通道(channels)来处理多连接,可以把通道理解成共享一个TCP连接的多个轻量化连接。
    一个特定通道上的通讯与其他通道上的通讯是完全隔离的,因此每个AMQP方法都需要携带一个通道号,这样客户端就可以指定此方法是为哪个通道准备的。

  • 为了在一个单独的代理上实现多个隔离的环境(用户、用户组、交换机、队列 等),AMQP提供了一个虚拟主机(virtual hosts - vhosts)的概念

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值