rabbitmq学习记录

一、综述

需要在生产者和消费者之间建立有效的通信链路并确定双方的通信协议。

消费者通常采取主动拉取和被动消费这两种模式实现消息消费。同时出于稳定性的考虑,消费者还要提供限流的能力。

消息发送方逻辑则相对简单,消息发送出去后,依赖路由规则,最终投递给符合条件的一个或多个消费者。

 rabbitmq是基于高级消息队列协议(AMQP)规范的消息中间件。

rabbitmq是轻量级的,运行rabbitmq核心功能以及诸多管理界面的插件只需不到40M内存。

rabbitmq可以作为不同语言交互的工具使用,为不同开发语言之间进行跨操作系统和环境的数据共享提供了桥梁。

二、rabbitmq基础

 

rabbitmq除支持amqp外也支持其他诸如mqtt、stomp、xmpp协议等。

作为一种AMQP代理服务器,rabbitmq提供了一套严格的通信方式,即在与核心产品进行通信的各个方面几乎都采用了RPC模式。

在AMQP规范中,客户端和服务器端都可以发送命令,对于客户端应用程序而言,这意味着它应该监听来自服务器的通信,这也客户端应用程序正在做的事情可能没什么关系。

当与AMQP交互时,需要有一个协议头确认通信协议,由客户端发给服务器端。

 

 在AMQP中,信道使用协商的AMQP连接作为相互传输信息的渠道,一个AMQP连接可以有多个信道,允许客户端和服务端之间进行多次会话。

 当使用命令与rabbitmq进行交互时,执行这些命令的所有参数被封装在一个称为帧的数据结构中,帧对数据进行编码以便传输。

 

 AMQP规范规定了5种类型的帧:协议头帧、方法帧、内容头帧、消息体帧、心跳帧。

 协议头帧和心跳帧对开发者来说通常是透明的。

我们使用方法帧、内容头帧、消息体帧向rabbitmq发发布消息。

发布的第一个帧是携带命令和执行它所需参数(路由、交换机等)的方法帧,方法帧之后是内容帧,包括内容头和消息体。

AMQP帧大小有上线,如果消息体超过这个大小,会被拆分成多个消息体帧。这些帧始终以相同的顺序发送:方法帧、内容头帧以及一个或多个消息体帧。

 

 

方法帧和内容头帧的内容采用二进制打包数据,消息体帧的内容没有任何打包或编码,可以包含从纯文本到二进制图像数据的任何内容。

方法帧

 

内容头帧

 

消息体帧

 

发布消息

 

 

 消费消息

 

 三、消息属性

 四、消息发布的性能权衡

AMQP规范提供消息发布中的事务以及消息持久化选项,RabbitMQ还具备其他功能,如投递确认功能。

 

 五、消费消息,避免拉取

rabbitmq实现了两个不同的AMQP RPC命令来获取队列中的消息,Basic.Get和Basic.Consumer。

Basic.Get不是不是从服务器获取消息的理想方式。

Basic.Get是一个轮询模型,Basic.Consumer是一个推送模型。

使用Basic.Get获取消息时,每次想接收消息就必须发送一个新的请求。

通过使用 Ba ic Consume RPC 命令来消费消息,可以使用rabbitmq注册你的应用程序,并告诉它在消费者可用时以异步方式向消费者发送消息,这通常被称为发布一订阅模式。

当应用程序发出 Basic.Consume 时会创建 个唯 的宇符串,用来标识通过已 建立的信道与 RabbitMQ 进行通信的应用程序。这个字符串被称为消费者标签( onsumer Tag), RabbitMQ 每次都会把该字符串与消息一起发送给你的应用程序。

 no-ack模式:

消费者预取:(设置预取值,可以保持一个最大未确认消息数量,增大预取值有助于提高向消费者传递消息的速率,但是也会对消费者端的内存增加压力;而将预取值设置的过小,则会影响消费者的吞吐量)

消费者使用事务:

拒绝消息:

Basic.Reject是AMQP指定的RPC响应,用于通知代理服务器无法对所投递的消息进行处理,一次只能拒绝一个消息。可以指示rabbitmq丢弃消息或者使用requeue标志重新投递消息。

Basic.Nack允许一次拒绝多个消息,但是AMQP规范不提供此行为。

死信交换机:rabbitmq的死信交换机是对AMQP规范的扩展。

 控制队列:

 六、消息路由模式

Direct

Fanout

Topic

Headers

 rabbitmq内置了direct交换机类型,不需要额外的插件。

 七、rabbitmq集群

集群中的状态同步和跨节点的消息投递需要低延迟的通信,只有LAN环境可以满足这一要求。

另一个需要重点考量的是集群的大小。维护集群共享状态的工作和开销与集群数量的多少成正比。

九、使用替代协议

对于不同的应用场景可以选择更使用的协议,如移动设备由于高延迟、不可靠的网络通信会给AMQP带来诸多问题。

MQTT更适用于移动端应用,STOMP相对于AMQP更简单,statelessd适用于高速消息发送。

1、MQTT是一种轻量级的消息通信协议,在移动端应用广泛,MQTT被设计用来在资源约束的设备以及低带宽的环境下使用,而不必牺牲消息通信的可靠性。

十、数据库集成

 

posted @ 2023-04-07 18:00  高石柯南  阅读(13)  评论(0编辑  收藏  举报