热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

消息队列基础知识

MQ 选型考量维度

可靠性、性能、功能、可运维性,可扩展性、是否开源及社区活跃

 

主题和队列

队列 和 发布-订阅模型

消息队列-基础知识

 

消息队列-基础知识

 

每个主题包含多个消息队列,通过多个消息队列实现并行生产和消费,

例如 RocketMQ 只在队列上保证消息的有序性,主题层面无法保证消息的严格顺序

队列 与主题 并没有本质的区别,他们最大的区别就是,一份消息能不能被多次消费。

 

如何利用事务性消息实现分布式事务

消息队列中的`事务`,主要解决的就是消息生产者和消息消费者的数据一致性问题。

例: RocketMQ 事务消息功能实现分布式事务流程如下

消息队列-基础知识

 

RocketMQ 中有事务反查机制,这种机制通过定时反查事务状态来补偿提交事务消息可能出现的失败。而在kafka中并没有这种反查机制(处理方式 直接抛异常),需要用户去自己解决这种问题

RocketMQ 的事务并没有完整实现事务的ACID (原子性、一致性、隔离性、持久性)四个特性

  • A(原子性) : 本地事务的操作1 与往消息队列中生产消息的操作 2,是两个分离的操作不符合对原子性的定义

  • C(一致性) : 由于消息队列是异步操作,在数据一致性上只能保证数据的最终一致性。 若多实时性要求较高的业务的话,事务消息是不一致的。但对实时性不高的系统可以酌情处理

如何确保消息不会丢失

目前消息队列都提供了非常完善的消息可靠性保护机制,完全可以做到在消息传递过长中,及时发生网络中端或者硬件故障,也能保证消息的可靠性传递,不丢消息

检测消息丢失的方法

  • 利用消息队列的有序性来验证消息是否丢失。

在消息生产者端,给每个消息附加一个连续递增的序号,然后在消息消费端检查(一般都有拦截器机制,不会侵入代码)这个序号的连续性。若检测到不连续的消息,则可通过缺失的序号判断丢了哪个消息。注意Kafka 和RocketMQ并不能保证 topic 上的严格顺序,so要指定分区(队列)

  • 确保消息的可靠投递

    • 生产阶段:在这个阶段,从消息在Producer 创建出来,经过网络传输发送到Broker端

      • 正确处理返回值 与 异常

    • 存储阶段:在这个阶段,消息在Broker端存储,如果是集群,消息会在这个阶段被复制到其他的副本上

      • 信息持久化到磁盘

      • 如果是集群部署的话,消息要达到多数节点(多副本机制)

    • 消费阶段:在这个阶段,Consumer从Broker 上拉取消息,经过网络传输发送到Cunsumer上

      • 消费端的逻辑处理完后及时响应ACK。不要在收到消息后就立即发送ACK

 

如何处理消费过程中的重复消息

消息重复的情况是必然的。在MQTT协议中,给处理三种传递消息的服务质量标准。从低到高依次是:

  1. At most once :至多一次,在消息传递过程中,对多会被送达一次。也就是说,没什么消息可靠性保证,允许丢消息。使用场景如对可靠性不高的监控,允许少量数据丢失

  2. At least once :至少一次,在消息传递时,至少会被送达一次,也就是说,不允许丢消息,但是允许有少量的重复消息出现 (大多数都是实现了它)

  3. Exactly once:恰好一次,消息传递时,只会被送达一次,不允许也丢失不允许重复,这个是***的。

用幂等性解决重复消息问题

  1. 利用数据库唯一约束实现幂等

  2. 利用状态机、version 来实现幂等

  3. 记录并检查操作(适用范围广) : 如何check ? 可能会引入更多的问题。。。

 

消息积压了该如何处理

一般来说 是 : 要么生产变快了,要么消费变慢了

  • 优化性能避免消息积压

    • 发送端性能优化(实际上与消息积压关系不大)。 准备数据、序列化消息、构造请求、网络耗时、Broker处理消息延迟

    • 消费端性能优化。(一般消费端的消费能力要大于生产端的) 批量处理。。。

      • 增加消费消费端实例。(同样的扩充相应的队列(分区),确保队列与消费者的实例数是相等的 )

      • 检查是不是消费失败从而导致一条消息反复消费

      • 检查是不是消费者触发了死锁或者卡死在某些资源

消费端是否可以通过批量消费的方式来提升消费性能?

1. 要求消费端能够处理或者开启多线程进行单条处理

2.批量消费一单某条数据消费失败会导致整批数据重复消费

3.对实时性要求不高,批量消费需要Broker积累到一定数据才会发送到Consumer,会使单次消费消息的耗时变长

 

 

 

 


推荐阅读
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
  • 时序数据是指按时间顺序排列的数据集。通过时间轴上的数据点连接,可以构建多维度报表,揭示数据的趋势、规律及异常情况。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 一家位于长沙的知名网络安全企业,现面向全国诚聘高级后端开发工程师,特别欢迎具有一线城市经验的技术精英回归故乡,共创辉煌。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • 拖拉切割直线 ... [详细]
  • 四月个人任务:Linux基础操作与网络管理
    本文介绍了两项主要任务:编写一个脚本来检测192.168.1.0/24子网中当前在线的IP地址,以及如何在Linux系统中挂载Windows网络共享目录。通过具体步骤和代码示例,帮助读者理解和掌握相关技能。 ... [详细]
  • Python中调用Java代码的方法与实践
    本文探讨了如何在Python环境中集成并调用Java代码,通过具体的步骤和示例展示了这一过程的技术细节。适合对跨语言编程感兴趣的开发者阅读。 ... [详细]
  • VS Code 中 .vscode 文件夹配置详解
    本文介绍了 VS Code 中 .vscode 文件夹下的配置文件及其作用,包括常用的预定义变量和三个关键配置文件:launch.json、tasks.json 和 c_cpp_properties.json。 ... [详细]
  • 本文介绍了如何使用Workman框架构建一个功能全面的即时通讯系统,该系统不仅支持一对一聊天、群组聊天,还集成了视频会议和实时音视频通话功能,同时提供了红包发送等附加功能。 ... [详细]
  • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
  • 本文详细解析 Skynet 的启动流程,包括配置文件的读取、环境变量的设置、主要线程的启动(如 timer、socket、monitor 和 worker 线程),以及消息队列的实现机制。 ... [详细]
  • RabbitMQ 核心组件解析
    本文详细介绍了RabbitMQ的核心概念,包括其基本原理、应用场景及关键组件,如消息、生产者、消费者、信道、交换机、路由键和虚拟主机等。 ... [详细]
  • 题目描述:计算从起点到终点的最小能量消耗。如果下一个单元格的风向与当前单元格相同,则消耗为0,否则为1。共有8个可能的方向。 ... [详细]
author-avatar
雨的到来2009
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有