关于rabbitmq的一些问题

关于rabbitmq的一些问题 一、RabbitMQ的完整工作流程 RabbitMQ 的核心是生产者将消息发送到交换机,交换机根据类型和路由键将消息路由到队列,消费者再从队列中获取消息。 核心组件: Producer(生产者): 发送消息的应用程序。 Consumer(消费者): 接收消息的应用程序。 Message(消息): 包含有效载荷(数据)和标签(元数据,如路由键)。 Exchange(交换机): 接收生产者发送的消息,并根据特定规则(交换机类型、绑定、路由键)将消息路由到一个或多个队列。 Queue(队列): 存储消息的缓冲区,等待消费者消费。 Binding(绑定): 连接交换机和队列的规则。 完整流程: 建立连接: 生产者/消费者与 RabbitMQ Broker 建立一个 TCP 连接。 在连接上创建一个 Channel(信道),Channel 是轻量级的连接,避免了频繁创建/销毁 TCP 开开销。 生产者发送消息: 生产者将消息发送到指定的 Exchange。 发送消息时,必须指定一个 Routing Key(路由键)。 交换机路由消息: Exchange 接收到消息后,根据自身的 类型 和 Binding 规则,决定将消息投递到哪些队列。 主要的交换机类型: Direct: 精确匹配 Routing Key。消息只会被投递到 Binding Key 与 Routing Key 完全一致 的队列。 Fanout: 广播模式。将消息投递到所有绑定到该 Exchange 的队列,忽略 Routing Key。 Topic: 模式匹配。使用通配符(* 匹配一个词,# 匹配零个或多个词)来匹配 Routing Key 和 Binding Key。...

October 13, 2024 · 1 min · Leanku

rabbitmq工作原理

rabbitmq工作原理 AMQP协议 AMQP是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。 AMQP协议是一种二进制协议,提供客户端应用与消息中间件之间异步、安全、高效地交互。 AMQP作为中间层服务,把消息生产和消费分割出来,当消息生产者出现异常,不影响消费者对消息的消费,当消费者异常时,生产者生产的消息可以存放到服务的内存或者磁盘,不以影响到消息的消费,同时,消息也可以基于路由的规则可以投递到指定的消费者消费。 AMQP基于模块化通过Exchange和Message Queue两个组件组合实现消息路由分发 生产者和消费者 生产者是生产消息的主体,消费者是消费消息的主体 数据集成与系统解耦、异步处理与事件驱动、流量削峰、事务消息与分布式事务的最终一致等 生产者生产一条消息丢给消息代理,消息代理根据投递规则将消息传送到消费者手上 交换机 交换机就像是消息代理的路由器,负责拿到一个消息之后,根据确定的规则(路由键)将他路由给一个或零个队列、交换机具备多种路由模式。 基于消息生产者和路由规则可以将消息投递到指定的Message Queue,交换机收到生产者投递的消息,基于路由规则及队列绑定关系匹配到投递对应的交换机或者队列进行分发,交换机不存储消息,只做转发 直连交换机:根据路由键完全匹配的投递到对应的队列。 扇形交换机:无视路由键,将消息进行拷贝,并路由到给绑定到它身上的所有队列,提供了一个广播的效果 主题交换机: 根据路由键按模式匹配的投递到对应的队列 交换机也具备自己的属性,可以定义自己的名字,是否持久化等选项 队列 消息的暂存地,至少有一个消费者订阅了队列的话,消息会立即发送给这些订阅的消费者。但是如果消息到达了无人的订阅队列,消息会在队列中等待,等待有了消费者便进行分发 Exchange和Message Queue之间存在绑定关系,消息到了Exchange后基于路由策略可以将消息投递到已绑定且符合路由策略的Message Queue。 消息队列会将消息存储到内存或者磁盘中,并将这些消息按照一定顺序转发给一个或多个消费者,每个消息队列都是独立隔离的,相互不影响。 消息队列具有不同的属性:私有,共享,持久化,临时,客户端定义或者服务端定义等,可以基于实际需求选择对应的类型 消息 消息是信息的载体,也是MAQP协议的一个实体,消息包含以下两部分 载荷:就是真正的信息,是你想要传输的任何内容,该部分内容对消息代理来说是透明的 元消息:包含路由键、内容类型、编码、是否持久化等等消息属性,会被消息代理所解析,消息代理根据消息的属性对这条消息进行投递,存储等。这部分被消息代理所关心,而消费者对其是不关心的 信道 网络信道,是建立在Connection连接之上的一种轻量级的连接。几乎所有的操作都在Chanel中进行,Channel是进行消息读写的通道,客户端可以建立对各Channel,每个Channel代表一个会话任务 如果把Connection比作一条光纤电缆的话,那么Channel信道就比作成光纤电缆中的其中一束光纤。一个Connection上可以创建任意数量的Channel。 大部分的业务操作是在Channel这个接口中完成的 队列声明 queueDeclare 交换机的声明 ExchangeDeclare 队列的绑定 queueBind 发布消息 basicPublish 消费消息 basicConsume Rabbitmq 工作模式 一、简单模式 生产者发送消息到队列,消费者进行消费,没有交换机 二、工作模式 一个生产者发送消息到队列中,队列分配消息给不同的队列,队列接收到消息进行消费 三、订阅模式 每个队列的消息都是一样的,生产者把消息发送给交换机,交换机把消息发送给消息绑定的队列,让消费者消费 四、路由模式 根据路由键发送到不同的消息队列中 五、主题模式 根据路由键分类,发送到不同的消息队列中

April 23, 2024 · 1 min · Leanku

RabbitMQ详解

RabbitMQ详解 1. 五种工作模式 1.1 简单模式 生产者p发送消息到队列,消费者c消费消息。(无交换机消息直接进入队列) p->queue->c 1.2 工作模式 一个生产者p发送消息到队列,队列将消息分配给多个消费者c1,c2。(实现负载均衡,适合集群异步处理,典型场景:发送邮件、短信等) p->queue|->c1 |->c2 1.3 订阅模式,每个队列的消息都是一样的 使用广播类型的交换机e, 生产者p把消息发送到交换机e,交换机e把消息发送到和交换机绑定的队列c4、c5(每个消费者接收相同的消息。典型应用场景:天气订阅,微博订阅等) |->c4 p->e->| |->c5 1.4 路由模式 使用Direct类型的交换机,生产者p发送消息到交换机e,交换机E根据路由键(如error发送到c1)匹配队列,消息仅发送到匹配的队列(与订阅模式的区别:按条件筛选发送) |->error->c1 p->e| |->info->c2 1.5 主题模式 使用Topic类型的交换机,路由模式的升级版,支持通配符匹配路由,匹配更灵活(#代表匹配一个或多个单词,*代表匹配一个) |log.*->c4 p-> | |log.#->c5 2. 消息持久化 当RabbitMQ重启以后,未消费的消息可以在服务重启后继续消费,不会丢失。 3. 应答机制 ACK 两种方式 自动确认:消费者接收消息后,立即ACK然后再处理业务逻辑,加入业务逻辑出现异常,消息也会被确认 手动确认:消费者接收消息后,消息状态被设置为unack,由业务逻辑指定ACK的位置,假如没有手动ACK,则mq中的消息不会减少,会重复消费 4. 死信队列 DLX全程Dead-Letter-Exchange,也可以称为私信交换机,就是当一个队列中的消息变成死信以后,会被重新发送到另一个交换机,这个交换机就是DLX,而绑定DLX的队列就是死信队列。 变为死信的一般情况: 消息被拒绝 消息过期 队列达到最大长度 使用死信队列只需要定义队列的时候设置x-dead-letter-exchange参数指定交换机就可以了,x-message-ttl参数设置消息存活时间,x-dead-letter-routing-key参数设置路由键 5. 延时队列 延时队列就是当消息发送以后,并不想让消费者立即拿到消费,而是等待特定时间之后才能拿到消息来消费。 延时功能可以通过设置过期时间+死信队列来实现 6. 集群模式 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行 允许通过添加更多的节点来扩展消息通信的吞吐量 RabbitMQ会始终记录以下四种类型的内部元数据 队列元数据-队列的名称和他们的属性(是否持久化,是否自动删除) 交换器元数据-交换器的类型、名称和属性 绑定元数据-一张简单的表格展示了如何将消息路由到队列 v-host元数据-为vhost内的队列、交换器和绑定提供命名空间和安全属性 RabbitMQ集群的3个模式 主备模式:从节点相当于主节点的链接,所有从节点收到的请求,真实转向的都是从节点。一般在并发和数据不是特别多的情况下使用,当从节点挂掉后会从备份节点中选择一个节点出来作主节点对外提供服务。 镜像模式:将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用。作用就是消息实体会主动在镜像节点之间实现同步,任何一个节点宕机都没关系,保证100%数据不丢失,在实际工作中用的最多的。并且实现集群非常的简单,一般物联网大厂都会构建这种镜像集群模式。 异地多活模式:用来实现异地的数据复制,使用多活模式需要借助federation插件来实现集群间或节点间的消息复制,广泛应用于众多互联网公司 7. 负载均衡 HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡、以及基于TCP和HTTP的应用程序代理 特别适用于那些负载特大的web站点,完全可以支持数以万计的并发连接,同时可以保护web服务器不被暴露到网络上

April 23, 2024 · 1 min · Leanku