来了来了,趁着代码敲完了,写一篇对于RabbitMQ的总结
RabbitMQ 是一个开源的消息队列软件,它实现了高级消息队列协议(AMQP),提供了可靠的消息传输机制,用于在分布式系统中进行消息传递和处理。RabbitMQ 可以帮助不同的应用程序或服务之间进行异步通信,解耦发送者和接收者,并提供了灵活的消息路由和处理机制。
以我在工作中的煎熬使用及学习的秃头理解来说,RabbitMQ就是为了让庞大的数据能够异步响应给前端,使得前端来访问我们后端接口时不会因为时间过长而导致请求响应超时,也不会耽误我们执行其他的业务代码。
RabbitMQ 的核心概念包括:
-
消息(Message):要传递的数据单元,可以包含任意格式的数据。
-
生产者(Producer):负责向 RabbitMQ 发送消息的应用程序或服务。
-
队列(Queue):用于存储消息的容器,生产者将消息发送到队列,消费者从队列中获取消息。
-
消费者(Consumer):从队列中获取消息并进行处理的应用程序或服务。
-
交换机(Exchange):用于接收生产者发送的消息,并将其路由到一个或多个队列中。
-
绑定(Binding):将交换机和队列之间建立关联的规则,指定消息应该如何被路由到队列。
消息 (Message)
消息 (Message) 用于在生产者和消费者之间传递信息。消息通常包含要传递的数据,可以是文本、JSON、XML 等格式的内容。除了数据内容外,消息还可以包含一些元数据,例如:
-
消息ID(Message ID):唯一标识消息的ID,可以用于跟踪消息的状态和处理情况。
-
消息体(Message Body):实际要传递的数据内容,可以是任意格式的数据。
-
消息标签(Message Label):用于标识消息的类型或者用途,消费者可以根据标签来处理不同类型的消息。
-
消息属性(Message Properties):包含了一些描述消息的属性,例如消息的优先级、过期时间、持久化等设置。
生产者 (Producer)
生产者 (Producer) 负责向消息队列发送消息。生产者通常是一个应用程序或服务,它们生成消息并将其发送到消息队列中,以便消费者可以从队列中获取并处理这些消息。
生产者的主要作用包括:
-
创建消息:生产者根据业务逻辑或其他条件创建消息。消息可以包含任意格式的数据,例如文本、JSON、XML 等。
-
发送消息:生产者将创建的消息发送到消息队列中。发送消息的过程包括将消息发送给交换机 (Exchange) ,交换机根据预先设定的规则将消息路由到一个或多个队列中。
-
消息确认:一旦消息被成功发送到消息队列,生产者可以选择等待消息被确认 (acknowledged) 。消息确认可以确保消息已经被安全地保存在队列中,可以被消费者获取和处理。
-
消息持久化:生产者可以选择将消息设置为持久化,这样即使 RabbitMQ 服务器重启,消息也不会丢失。这对于重要的消息很有用。
-
消息优先级:生产者可以为消息设置优先级,让 RabbitMQ 在处理消息时优先处理具有较高优先级的消息。
队列 (Queue)
队列 (Queue) 是消息传递的中心,生产者发送消息到队列,消费者从队列中获取消息进行处理。队列具有以下特点:
-
消息存储:队列用于存储发送到 RabbitMQ 的消息。消息可以是任意格式的数据,例如文本、JSON、XML 等。
-
FIFO(先进先出):队列遵循先进先出的原则,即先发送的消息会被先处理,后发送的消息会被后处理。
-
持久化:队列可以被设置为持久化,这样即使 RabbitMQ 服务器重启,队列中的消息也不会丢失。
-
消息确认:消费者处理完消息后可以向 RabbitMQ 确认 (acknowledge) 消息已经被处理,RabbitMQ 可以将消息从队列中删除。如果消费者没有确认消息,RabbitMQ 可以将消息重新发送给其他消费者或者重新放入队列中。
-
过期时间:队列和消息可以设置过期时间,超过过期时间的消息会被自动删除。
-
队列长度限制:队列可以设置最大长度限制,当队列达到最大长度时,新的消息会被丢弃或者根据配置进行其他处理。
消费者 (Consumer)
消费者 (Consumer) 负责从消息队列中获取消息并进行处理。消费者通常是一个应用程序或服务,它们从队列中获取消息并根据业务逻辑进行处理。
消费者的主要作用包括:
-
获取消息:消费者从消息队列中获取消息。通常情况下,消费者会持续地从队列中拉取消息,直到队列为空或者达到某种条件。
-
处理消息:消费者根据业务逻辑处理获取到的消息。处理消息的方式可以是执行特定的业务逻辑、将消息存储到数据库或者调用其他服务进行处理等。
-
消息确认:消费者在处理完消息后需要向 RabbitMQ 发送确认 (acknowledge) ,告知 RabbitMQ 已经处理了该消息。RabbitMQ 可以根据确认情况来删除消息或者重新发送给其他消费者。
-
消息消费状态管理:消费者可以根据需要进行消息的消费状态管理,例如记录已经处理的消息、处理失败的消息等。
-
消息重试:如果消费者在处理消息时发生异常或者失败,可以选择重新处理消息或者将消息发送到死信队列 (Dead Letter Queue) 进行后续处理。
交换机 (Exchange)
交换机 (Exchange) 用于接收来自生产者的消息,并将这些消息路由到一个或多个队列中。交换机根据消息的路由键 (Routing Key) 和绑定键 (Binding Key) 来决定将消息发送到哪个队列。
交换机有以下几种类型:
-
直接交换机(Direct Exchange):根据消息的路由键将消息发送到与之匹配的队列。如果交换机的路由键与队列的绑定键相匹配,则将消息发送到该队列。
-
扇出交换机(Fanout Exchange):将消息发送到所有与之绑定的队列中,忽略消息的路由键。这种类型的交换机广播消息给所有绑定的队列。
-
主题交换机(Topic Exchange):根据消息的路由键和通配符模式将消息发送到与之匹配的队列。通配符符号
*
可以匹配一个单词,#
可以匹配零个或多个单词。 -
头交换机(Headers Exchange):根据消息的头部属性来匹配队列,与路由键无关。
绑定 (Binding)
绑定 (Binding) 用于将交换机 (Exchange) 和队列之间建立关联的规则。通过绑定,交换机可以将符合指定条件的消息路由到对应的队列中,实现了消息的路由和分发。
绑定包括以下几个要素:
-
交换机(Exchange):需要绑定的交换机,消息会从这个交换机开始路由。
-
队列(Queue):需要绑定的队列,消息会被发送到这个队列中。
-
绑定键(Binding Key):绑定规则,用于指定消息的路由规则。不同类型的交换机对绑定键的处理方式不同,例如直接交换机(Direct Exchange) 会根据绑定键和消息的路由键进行精确匹配,扇出交换机(Fanout Exchange) 会忽略绑定键。
-
其他参数:根据需要可以设置一些额外的参数,例如设置消息的属性、过期时间等。
绑定的过程就是告诉 RabbitMQ 如何将消息从交换机发送到队列。当消息到达交换机时,交换机会根据绑定规则将消息发送到符合条件的队列中。一个交换机可以绑定到多个队列,一个队列也可以被多个交换机绑定,通过这种方式可以实现复杂的消息路由和分发逻辑。
绑定在 RabbitMQ 中起着关键的作用,它决定了消息的路由规则,直接影响到消息最终被发送到哪些队列中,是实现消息路由和分发的重要机制。
好了,八股文咱们点到为止,程序员不为难程序员,下一章我会说明一下在工作中如何使用RabbitMQ以及一些使用RabbitMQ的小技巧,如果有什么不全或者不对的地方,欢迎各位兄弟姐妹们给我留言说明纠正。