热门标签 | 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,会使单次消费消息的耗时变长

 

 

 

 


推荐阅读
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
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社区 版权所有