从兔子说起:了解RabbitMQ消息的多样化【RabbitMQ 二】

🎏:你只管努力,剩下的交给时间

🏠 :小破站

从兔子说起:了解RabbitMQ消息的多样化

    • 第一:消息的可靠性与持久性
    • 第二:消息交换机与队列
    • 第三:消息确认与拒绝
    • 第四:消息的过期与优先级
    • 第五:消息顺序保证

第一:消息的可靠性与持久性

在消息传递系统中,确保消息的可靠性是至关重要的。可靠性涉及到确保消息在传递过程中不会丢失、不会重复,而且能够被按照期望的方式处理。以下是一些关键的考虑因素以及如何确保消息的可靠性:

  1. 持久性:
    • 概念: 持久性是指确保消息在系统故障、重启或其他不可预见的情况下不会丢失。持久性确保消息被保存在可持久化的存储中。
    • 操作: 生产者在发送消息时可以标记消息为持久性。队列也可以被声明为持久性。这样,即使消息代理在接收到消息后发生故障,消息仍然可以在系统恢复后重新投递。
  2. 消息确认机制:
    • 概念: 消息确认机制确保消息在成功接收和处理后才会从队列中删除。这防止了消息在传递过程中的丢失。
    • 操作: 消费者在成功处理消息后发送确认给消息代理。消息代理将消息从队列中删除,确保消息已经被处理。
  3. 幂等性处理:
    • 概念: 幂等性处理是指对于相同的消息,重复处理不会导致不同的结果。这有助于防止由于消息重复而引起的问题。
    • 操作: 在设计消费者的处理逻辑时,考虑使其具有幂等性。例如,在处理订单的情况下,确保对同一订单的处理不会导致重复的影响。
  4. 消息重试:
    • 概念: 消息可能在传递过程中遇到错误,导致处理失败。消息重试机制允许消息在失败后重新投递,直到成功处理为止。
    • 操作: 消费者可以实现一个自动或手动的消息重试机制,确保即使在处理过程中发生错误,消息仍有机会被成功处理。

通过将持久性、消息确认、幂等性处理和消息重试结合使用,可以有效地确保消息在传递过程中的可靠性。这对于构建可靠的分布式系统、异步通信和消息驱动的应用程序至关重要。

第二:消息交换机与队列

在RabbitMQ中,交换机和队列是两个核心概念,它们一起协作以实现消息的路由和传递。

  1. 交换机(Exchange):

    • 概念: 交换机是消息的分发中心,负责决定将消息发送到哪个队列。它定义了消息的路由规则。
    • 类型: RabbitMQ提供了不同类型的交换机,包括直连交换机(direct)、扇出交换机(fanout)、主题交换机(topic)等。每种类型都有不同的路由策略。
    • 配置: 在使用交换机之前,需要声明一个交换机,并指定其类型和其他相关配置。
  2. 队列(Queue):

    • 概念: 队列是消息的存储地点,生产者将消息发送到队列,而消费者从队列中接收和处理消息。
    • 配置: 队列也需要在使用前进行声明。在声明队列时,可以指定一些属性,如队列的持久性、是否排他、是否自动删除等。

消息路由的流程:

  1. 交换机声明: 生产者在发送消息之前,需要确保使用的交换机已经被声明。这涉及到指定交换机的名称、类型以及其他相关配置。

  2. 队列声明: 消费者在接收消息之前,需要确保使用的队列已经被声明。这包括指定队列的名称以及其他相关配置。

  3. 绑定: 在消息传递之前,需要将队列绑定到一个或多个交换机上。绑定时需要指定绑定的路由键,具体的路由规则取决于交换机的类型。

  4. 发送消息: 生产者将消息发送到特定的交换机,并指定一个路由键。消息的路由键与交换机的类型和绑定的路由键进行匹配。

  5. 消息路由: 交换机根据路由规则将消息路由到与之匹配的队列。这可能涉及到直接匹配、广播、主题匹配等方式,具体取决于交换机的类型。

  6. 接收消息: 消费者从绑定的队列中接收消息,并进行处理。

通过这样的流程,RabbitMQ实现了消息的灵活路由和传递。交换机和队列的配置以及它们之间的绑定关系决定了消息的路由行为。这种灵活性使得RabbitMQ适用于各种复杂的消息传递场景。

第三:消息确认与拒绝

在消息传递系统中,消息确认(acknowledgment)机制是一种确保消息被消费者成功处理的重要机制。消息确认涉及到确认消息已经被成功接收和处理,以及在发生错误时如何处理和拒绝消息。

  1. 消息确认机制:

    • 概念: 消息确认是消费者告知消息代理已成功接收和处理消息的机制。这是确保消息不会在传递过程中丢失的关键步骤。
    • 操作:
      • 在消费者成功处理完一条消息后,可以发送确认给消息代理。这通常是通过调用一个确认方法实现的。
      • 消息代理在接收到确认后将从队列中删除该消息,标志着消息已经成功被消费。
  2. 消息拒绝:

    • 概念: 消息拒绝是指消费者拒绝接收并处理一条消息的情况。这可能是因为消息的格式不正确、处理时发生了错误等原因。
    • 操作:
      • 消费者可以拒绝一条消息,并选择是否将其重新放入队列,或者将其丢弃。
      • 在RabbitMQ中,可以使用basic.rejectbasic.nack方法进行消息拒绝。

处理和拒绝消息的操作:

  1. 消息确认:
    • 消费者在成功处理消息后,调用确认方法,通知消息代理可以删除该消息。
    • 在RabbitMQ中,使用basic.ack方法进行消息确认。
channel.basic_ack(delivery_tag=delivery_tag)
  1. 消息拒绝:
    • 消费者在无法处理消息或者发生错误时,可以选择拒绝消息。
    • 在RabbitMQ中,使用basic.reject方法进行消息拒绝。
channel.basic_reject(delivery_tag=delivery_tag, requeue=True)  # requeue=True表示将消息重新放入队列
  1. 批量拒绝:
    • 有时候,可能需要一次性拒绝多条消息。在RabbitMQ中,可以使用basic.nack方法进行批量拒绝。
channel.basic_nack(delivery_tag=delivery_tag, multiple=True, requeue=True)

通过合理使用消息确认和拒绝机制,可以确保消息在传递过程中的可靠性,并提高系统的健壮性。

第四:消息的过期与优先级

在消息传递系统中,消息的过期和优先级是两个与消息生命周期和处理顺序相关的重要概念。

  1. 消息的过期概念:

    • 概念: 消息的过期是指设置消息在一定时间内有效,超过这个时间后消息将被自动删除。这有助于确保不处理过期的消息,从而避免处理过时的数据。
    • 操作: 在发送消息时,可以为消息设置过期时间。一旦消息在队列中存活的时间超过设定的过期时间,消息将被从队列中删除。
  2. 设置消息的过期时间:

    • 在RabbitMQ中,可以通过设置消息的expiration属性来指定消息的过期时间。该属性的值是一个以毫秒为单位的时间戳。
import datetime
import pika# 设置过期时间为10秒
expiration_time = 10000  # 毫秒
expiration_timestamp = int((datetime.datetime.now() + datetime.timedelta(seconds=10)).timestamp() * 1000)properties = pika.BasicProperties(delivery_mode=2,  # 持久化expiration=str(expiration_time),
)channel.basic_publish(exchange='', routing_key='queue_name', body='Hello, RabbitMQ!', properties=properties)
  1. 消息的优先级概念:

    • 概念: 消息的优先级是指设置消息的处理优先级,高优先级的消息在队列中会被更早地处理。这对于确保紧急任务被尽快处理非常有用。
    • 操作: 在发送消息时,可以为消息设置优先级。队列会按照消息的优先级进行排序,高优先级的消息将被更早地处理。
  2. 设置消息的优先级:

    • 在RabbitMQ中,可以通过设置消息的priority属性来指定消息的优先级。该属性的值是一个整数,通常在0到9之间。
import pika# 设置优先级为5
properties = pika.BasicProperties(delivery_mode=2,  # 持久化priority=5,
)channel.basic_publish(exchange='', routing_key='queue_name', body='Hello, RabbitMQ!', properties=properties)

通过合理设置消息的过期时间和优先级,可以更灵活地控制消息在系统中的处理方式,从而满足不同场景下的需求。

第五:消息顺序保证

在消息队列中,保证消息的顺序传递是一个挑战,因为消息可能会被并发处理,导致消息的处理顺序不确定。然而,有一些技术手段可以帮助实现有序传递。

  1. 单一队列:

    • 将所有相关的消息发送到同一个队列中。这样,由于队列是先进先出(FIFO)的,消息将按照发送的顺序依次被处理。
  2. 单一消费者:

    • 保证只有一个消费者同时处理队列中的消息。这可以通过限制队列的并发消费者数或者使用单一消费者的模式来实现。
  3. 消息分组:

    • 将相关的消息打上相同的标识,然后由同一组的消费者处理。这样可以确保同一组的消息按照顺序被处理,但不同组之间的顺序不能保证。

在RabbitMQ中,可以通过以下方式实现有序传递:

  1. 单一队列和单一消费者:

    • 确保所有相关的消息都发送到同一个队列,并且只有一个消费者在处理该队列。这可以通过确保在同一时刻只有一个消费者连接到队列,或者通过使用消费者的互斥锁来实现。
  2. 使用优先级:

    • 可以使用消息的优先级属性,将消息按照优先级发送到队列。在单一消费者的情况下,高优先级的消息将被更早地处理。
import pika# 设置优先级为1
properties = pika.BasicProperties(delivery_mode=2,  # 持久化priority=1,
)channel.basic_publish(exchange='', routing_key='queue_name', body='Hello, RabbitMQ!', properties=properties)

请注意,使用单一队列和单一消费者的方法可能会降低系统的吞吐量,因为所有相关消息都需要按照顺序被同一消费者处理。在一些高吞吐量的场景中,需要仔细权衡使用这种方法的代价和收益。

总体而言,有序传递是一个需要仔细考虑和平衡的问题,取决于应用程序的具体需求和性能要求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习手势识别 - yolo python opencv cnn 机器视觉 计算机竞赛

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…

2023年全国职业院校技能大赛“ 信息安全管理与评估” 测试题2

一.单选题 1、下列不属于口令安全威胁的是?( ) A、 弱口令 B、 明文传输 C、 MD5 加密 D、 多账户共用一个密码 2、在学校或单位如果发现自己的计算机感染了病毒,应首先采取什么措施 ( )。 A、断开网络 B、告知领导 C、杀毒 D、重…

C++模板—函数模板、类模板

目录 一、函数模板 1、概念 2、格式 3、实例化 4、模板参数的匹配 二、类模板 1、定义格式 2、实例化 交换两个变量的值,针对不同类型,我们可以使用函数重载实现。 void Swap(double& left, double& right) {double tmp left;left ri…

黑马一站制造数仓实战1

1. 项目目标 一站制造 企业中项目开发的落地:代码开发 代码开发:SQL【DSL SQL】 SparkCore SparkSQL 数仓的一些实际应用:分层体系、建模实现 2. 内容目标 项目业务介绍:背景、需求 项目技术架构:选型、架构 项目环境…

SpringBootWeb案例_03

Web后端开发_06 SpringBootWeb案例_03 登录认证 智能学习辅助系统登录时需要身份验证 1.登录功能 先实现简单的登录功能,在进一步优化。 1.1需求 若账户或密码不存在/密码不正确,则登录失败。 账户密码正确,则登录成功 1.2接口文档 …

git基本概念

一、版本控制概念 1.1 什么是版本控制 1.1.1 手动管理文件版本 1.1.2 版本控制软件 概念:版本控制软件是一个用来记录文件发生的变化,以便将来查阅特定版本修订情况的系统,有时也叫“版本控制系统”。通俗的理解就是把手工管理文件版本的方…

关于电脑提示vcruntime140_1.dll无法继续执行代码的解决办法

vcruntime140_1.dll是Visual C运行时库的一个组成部分,它包含了大量用于支持C应用程序运行时的功能。这个文件通常在开发和使用C程序时被调用,特别是在使用Microsoft Visual Studio进行开发时。vcruntime140_1.dll文件丢失或损坏会导致C程序无法正常运行…

初识:分布式事务Seata-AT模式的事务提交和事务回滚过程详解

分布式事务Seata 1. 本地事务2. 分布式事务3. 实现思路:两阶段提交协议(2PC)3.1 基础理解3.2 2PC的隐患 4. Seata4.1 Seata是什么4.2 Seata的三大角色4.3 Seata一次事务的生命周期4.4 Seata AT模式的设计思路4.4.1 设计思路4.4.1.1 一阶段4.4…

信息化,数字化,智能化是3种不同概念吗?与机械化,自动化矛盾吗?

先说结论: 1、信息化、数字化、智能化确实是3种不同的概念! 2、这3种概念与机械化、自动化并不矛盾,它们是制造业中不同发展阶段和不同层次的概念。 机械化:是指在生产过程中使用机械技术来辅助人工完成一些重复性、单一性、劳…

助力android面试2024【面试题合集】

转眼间,2023年快过完了。今年作为口罩开放的第一年大家的日子都过的十分艰难,那么想必找工作也不好找,在我们android开发这一行业非常的卷,在各行各业中尤为突出。android虽然不好过,但不能不吃饭吧。卷归卷但是还得干…

Pytorch——多卡GPU训练与单卡GPU训练相互切换

部分深度学习网络默认是多卡并行训练的,由于某些原因,有时需要指定在某单卡上训练,最近遇到一个,这里总结如下。 目录 一、多卡训练1.1 修改配置文件1.2 修改主训练文件1.3 显卡使用情况 二、单卡训练2.1 修改配置文件2.2 显卡使…

ApplicationEventPublisher-Spring事件发布器

一、简介 ApplicationEventPublisher是简称为Spring中的事件发布器,应用于Java事件型驱动应用是解耦和设计,Spring对Java已有的事件处理模型,做了进一步的简化处理。 二、发布及处理事件 ApplicationEventPublisher是一个函数式编程的接口…

简单了解下IP的全球划分【笔记】

国际互联网号码分配机构 (The Internet Assigned Numbers Authority,简称IANA)。它是互联网名称与数字地址分配机构(The Internet Corporation for Assigned Names and Numbers,简称ICANN)旗下的一个机构,主…

Spring之AOP底层源码解读(更新中)

1. 什么是spring的Aop 在进行源码解读之前,大家需要对Spring的Aop有基础的认识和理解,参考文章:Spring之AOP理解与应用-CSDN博客 2. 源码解读 接下来,我们对AOP的源码进行一个解读。 2.1 动态代理 如果你已经对spring的Aop已经有…

Linux5-计划任务、进程

计划任务 一、cron 计划任务 周期性计划任务 cron 任务概述 • 用途:按照设置的时间间隔为用户反复执行某一项固定的系统任务 • 软件包:cronie、crontabs • 系统服务:crond • 日志文件:/var/log/crond 管理计划任务策略 • 使用 cro…

存储虚拟化的写入过程

存储虚拟化的场景下,整个写入的过程。 在虚拟机里面,应用层调用 write 系统调用写入文件。write 系统调用进入虚拟机里面的内核,经过 VFS,通用块设备层,I/O 调度层,到达块设备驱动。虚拟机里面的块设备驱动…

uniapp uni-popup组件在微信小程序中滚动穿透问题

起因 在微信小程序中使用uni-popup组件时&#xff0c;出现滚动穿透&#xff0c;并且uni-popup内部内容不会滚动问题。 解决 滚动穿透 查阅官方文档&#xff0c;发现滚动穿透是由于平台差异性造成的&#xff0c;具体解决可以参照文档禁止滚动穿透 <template><page-…

【概率统计】如何理解概率密度函数及核密度估计

文章目录 概念回顾浅析概率密度函数概率值为0&#xff1f;PDF值大于1&#xff1f;一个栗子 核密度估计如何理解核密度估计核密度估计的应用 总结 概念回顾 直方图&#xff08;Histogram&#xff09;&#xff1a;直方图是最直观的一种方法&#xff0c;它通过把数据划分为若干个区…

软件工程 - 第8章 面向对象建模 - 2 静态建模

静态建模&#xff08;类和对象建模&#xff09; 类和对象模型的基本模型元素有类、对象以及它们之间的关系。系统中的类和对象模型描述了系统的静态结构&#xff0c;在UML中用类图和对象图来表示。 类图由系统中使用的类以及它们之间的关系组成。类之间的关系有关联、依赖、泛…

Numpy进阶

NumPy进阶80题完整版