MQ的消息模型及在工作上应用场景

目录
  • MQ介绍
    • 使用 MQ 的好处
    • 使用 MQ 的坏处
    • 什么时候用 MQ
  • 消息模型
    • 什么是 JMS
    • 为什么需要 JMS 
    • 点对点模型
    • 发布订阅模型
    • 两个模型之间的区别
  • MQ 的在工作上应用场景
    • 异步
    • 使用 MQ
  • 「MQ 带来的问题」
  • 「MQ 产品的对比」
  • 「MQ 的测试点」
    • » 生产者
    • » 消费者
    • 队列
  • 小结

MQ介绍

根据某科的介绍,MQ(message queue),叫消息队列,是基础数据结构中先进先出的一种数据机构。

一般用来解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。

名词 解释
解耦 简单说就是积木化,每个东西都相互独立,比如汉堡包,面包跟肉饼是相互独立,可以单独使用,也可以组合成一个食物
异步 去买汉堡包,下单之后就去玩手机,等服务员叫号通知领取,这就叫异步;而同步是下单后,什么都不能干,直到服务员叫号才能做其他事
限流 大家 9 点上班,地铁进不去,门口做限流
削峰 遵从最后落地到数据库的请求数要尽量少的原则,比如让 1/2 的人下午开始上班、局部停电,感兴趣可以查看削峰填谷
消息 要传输的内容,比如说话、写信,形式不重要,按照双方约定的格式即可
队列 是一种先进先出的数据结构,排队打疫苗,从队尾入队,从队头出队

MQ 主要产品包括:RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ、Kafka

通过上述的内容,不难发现,MQ是一种跨进程的通信机制,用于上下游传递消息,而个人觉得MQ有点像中介, 房东发布出租信息,信息放在中介处,租客来通过中介来租房子。

使用 MQ 的好处

举个通俗点的例子:

面试官希望 HR 早点招聘到合适的人选,于是一开始是这样的:

HR 问面试官什么时候有空,把候选人资料送过去,并且亲自看到面试官看完并给出结论后才离开,时间一长,大家都觉得很麻烦,HR 觉得候选人不错,面试官觉得不合适,容易发生争执。

后面,HR 跟面试官说,我把资料放在桌子上,你有空记得看,然后每次面试官看到桌子有资料后,都会拿起来看。

在这个场景上,HR就是生产者,面试官就是消费者,桌子就是MQ。

使用MQ带来的好处是解决应用解耦,异步消息,流量削锋:

  • HR想给资料时,无需知道面试官是否有空,只需要把资料放桌子上即可,这样大家都有时间做别的事,节省大家的时间。。应用解耦,每个成员都是独立的,不受其他成员影响。面试官不关心谁放的资料,HR 不关心谁哪个面试官看的资料
  • 如果别的组也有招聘需求(且当是同一工种,比如 Java 后端开发),HR依然把资料放在桌子上,两个面试官只需要各自从桌子上取资料查阅即可。异步消息,HR 把资料放在桌子上即可,就可以去做别的事,比一开始亲自看着的效率高太多了
  • HR无需关注面试官什么时候查看资料,也不关注看资料用多长的时间,减少矛盾。流量削峰,HR 给资料的频率不固定,面试官看资料的时长也不固定,面试官只需要在固定时间内看完给结论即可,不会有那么大的压力。

使用 MQ 的坏处

名词 解释
引入复杂度 「桌子」这东西是使用 MQ 后多出来的,需要有地方放桌子,而且流程会变长,更复杂
不一致性 HR会以为面试官应该看了资料,但实际面试官可能还没开始看,这就导致了不一致性的问题,但在约束好的时间内,面试官最终的查阅状态与HR的认知必须是要一致的,这就是所谓的最终不一致性
系统可用性降低 如果桌子坏了,后面的流程是不是就中断了

当然,使用MQ还有很多问题要解决,比如资料无辜丢了、一样的资料,给了好多份、资料被抢、本来资料给面试官 A,结果给到面试官 B等场景都是需要处理的。

什么时候用 MQ

名词 解释
生产者不需要从消费者处获得反馈 面试官到底看了没有,HR 根本不需关注,默认面试官是看了,否则就只能采取监督看完的方式
容许不一致性 HR 可能会发现有时候面试官说看了资料,但实际没看的情况,只有 HR 愿意相信面试官最后看了即可
有效 解耦、提速等带来的收益大于放置书桌是有成本的,那说明是有效的。比如一个月甚至半年才有一份简历,那还不如直接当面给更高效

消息模型

什么是 JMS

Java 消息服务指的是两个应用程序之间进行异步通信的 API,它为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等,用于支持 JAVA 应用程序开发。

为什么需要 JMS 

JAVA中,如果两个应用程序之间对各自都不了解,甚至这两个程序可能部署在不同地方上,那么它们之间如何发送消息呢?

举个例子,一个应用程序 A 部署在印度,另一个应用程序部署在美国,然后每当 A 触发某件事后,B 想从 A 获取一些更新信息。

当然,也有可能不止一个 B 对 A 的更新信息感兴趣,可能会有 N 个类似 B 的应用程序想从 A 中获取更新的信息。

在这种情况下,JAVA提供了最佳的解决方案-JMS,完美解决了上面讨论的问题。

点对点模型

在该模型中,有下列概念:
消息队列 (Queue)、发送者 (Sender)、接收者 (Receiver)

每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。

  • 支持存在多个消费者
  • 每个消息只有一个消费者(一旦消息被消费,消息就不再在消息队列中)
  • 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
  • 接收者在成功接收消息之后需向队列应答成功

如果希望发送的每个消息都应该被成功处理的话,那么就需要点对点模型。

女神想找备胎 A 聊天,就单聊备 A,这就是点对点,只有一个人能收到消息

发布订阅模型

消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到 topic 的消息会被所有订阅者消费。。

在该模型中,有下列概念:
主题(Topic)、发布者(Publisher)、订阅者(Subscriber)

客户端将消息发送到主题。多个发布者将消息发送到 Topic,系统将这些消息传递给多个订阅者。

  • 每个消息可以有多个消费者
  • 发布者和订阅者有时间依赖性,只有当客户端创建订阅后才能接受消息,且订阅者需一直保持活动状态以接收消息
  • 订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

如果希望发送的消息可以不被做任何处理、或者被一个消费者处理、或者可以被多个消费者处理的话,那么可以采用 Pub/Sub 模型。。

女神发了个朋友圈,她的备胎们都能看到,这就是发布/订阅。

两个模型之间的区别

点对点模型下,不可重复消费。

点对点下,一个队列可以有多个消费者,生产者发送一条消息到队列,消费者能用队列取出并且消费消息,一旦消息被消费后,队列不再有存储,所以其他消费者不能消费到已经被消费的消息,如果一直没有消费者处理,这条消息就会被保存,直到有可用的消费者为止。

发布订阅模型,可以重复消费。

发布订阅下,发布者发送到 topic 的消息,只有订阅了 topic 的订阅者才会收到消息,注意是所有订阅这个 topic 的服务都能收到,所以能达到消息拷贝的效果

MQ 的在工作上应用场景

虽然上面以一个招聘的例子来讲解 MQ 的应用场景,但可能还是会有疑问,不知道工作上是如何的,因此再讲讲工作上的场景。

异步

之前负责的一个需求叫老带新,大致流程如下:

1)用户下单后,会先判断下单者身份

2)如果是新用户,再判断是否有邀请人

3)如果有,再判断邀请人身份

4)如果是老用户,就给双方发积分

这样的话,用户的流程就会发生变化:

很明显,这样做的问题是:新增的逻辑存在堵塞下单主流程的风险。

既然同步处理会有问题,那就改异步吧,改完变成这样:

异步的好处是,即使老带新逻辑有问题,也不会堵塞下单流程。

这样的好日子没过几天,问题又来了:老带新业务频繁改动,导致下单系统频繁发版本,存在质量隐患。

使用 MQ

由于依赖订单系统的业务越来越多,为了保证下单系统的稳定性,业务层面必须解耦,只需要把支付成功的消息告诉别的业务,他们收到了通知后自行处理,我们只管自己的流程,后续还有其他业务系统,直接订阅我们发送的支付成功消息。

「MQ 带来的问题」

  • 如何保证消息队列的高可用?
  • 如何保证消息不被重复消费?
  • 如何处理消息丢失的问题?
  • 如何保证消息的顺序性?
  • 如何处理消息队列大量消息积压?

上面这些问题,都是实际工作上会遇到的,往往也都是测试点,下面也会有提及到,简单了解下即可。

「MQ 产品的对比」

产品 单机吞吐量 时效性 可用性 消息可靠性 功能支持
ActiveMQ 万级 毫秒级 较低概率出现丢失数据 极其完备
RabbitMQ 万级 微妙级 基本不丢 erlang 开发
RocketMQ 十万级 毫秒级 非常高 可配置 0 丢失 分布式
Kafka 十万级 毫秒级 非常高高 可配置 0 丢失 分布式

而在选择上,一般公司都是用KafkaRocketMQ较多。

「MQ 的测试点」

» 生产者

  • 生成的数据格式是否跟定义的一致
  • 数据是否有成功推送到队列里
  • 数据是否有成功推动到对应的 topic
  • 推送失败时如何处理
  • 重复推送同一条数据,如何处理
  • 不同顺序推送消息,注意队列优先级
  • 推消息耗时
  • 队列容量达到上限,无法推送后如何处理

» 消费者

  • 消费的消息是否来自订阅的 topic
  • 消息被消费了,是否有清除
  • 生产者推送过快,消费速度过慢(堵塞),会如何
  • 无法消费没订阅的 topic 消息
  • 生产者推送消息后,消费者接受到的消息内容跟生产者推的一致
  • 如何处理重复消息,比如幂等
  • 处理超时
  • 消息处理失败
  • 消费消息的优先级是否跟推的一致
  • 消费消息耗时
  • 消费者宕机,消息堆积,无人处理,会如何处理
  • 是否能正常消费消息

队列

  • 宕机恢复后,消息是否丢失
  • 宕机预案,多久能恢复,如果无法恢复的预案
  • 不同的消息格式,是否能正常识别及转发

小结

来来去去,花了一周的时间来整理这堆信息,之前有测过mq,但没有太了解这玩意,从介绍、选型、测试点,加深了对 mq 的印象,但由于没做过 mq 的性能测试跟自动化测试,所以这块暂时没有心得能输出,如果后续有类似的经历,也会分享下。

本文留下了一个悬念,针对消息不一致的问题,大家是怎么解决的,这边非常好奇,所以下篇计划会写分布式事务,想深入了解下细节~更多关于MQ工作场景消息模型的资料请关注我们其它相关文章!

(0)

相关推荐

  • MQ的分类组成优缺点测试点入门教程

    目录 一.什么是 MQ 二.MQ 的作用 1. 流量削峰 2. 应用解耦 3. 异步处理 三.MQ 的缺点 四.常见 MQ 分类 1. ActiveMQ 2. Kafka 3. RocketMQ 4. RabbitMQ 五.MQ 的组成 1. 角色 Broker:消息服务器,提供消息核心服务Producer:消息生产者,业务的发起方,负责生产消息传输给broker.Consumer:消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理.Topic:主题,发布订阅模式下的消息统一

  • SpringBoot+RabbitMQ实现消息可靠传输详解

    目录 环境配置 消息丢失分析 生产阶段 生产端模拟消息丢失 RabbitMQ 消费端 环境配置 SpringBoot 整合 RabbitMQ 实现消息的发送. 1.添加 maven 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <depen

  • 盘点MQ中的异常测试

    目录 前言 一.RocketMQ 消息模式 集群消费模式 广播消费模式 二.push 和 pull 优缺点 Pull方式 Push方式 三.刷盘策略 同步刷盘 异步刷盘 四.MQ 异常测试 MQ消息体 消息重复发送 消息到达顺序不一致 消息发送失败重试 接线上生产者 消息丢失 消息争用 MQ比落库快 前言 上一篇小结了一下关于redis的异常测试,今天再来盘一盘 MQ 相关的. MQ 跟 redis 一样,也是现在系统服务中不可或缺的重要中间件,通常用来流量削峰.应用解耦.异步处理等. 之前有过

  • 详解SpringBoot整合RabbitMQ如何实现消息确认

    目录 简介 生产者消息确认 介绍 流程 配置 ConfirmCallback ReturnCallback 注册ConfirmCallback和ReturnCallback 消费者消息确认 介绍 手动确认三种方式 简介 本文介绍SpringBoot整合RabbitMQ如何进行消息的确认. 生产者消息确认 介绍 发送消息确认:用来确认消息从 producer发送到 broker 然后broker 的 exchange 到 queue过程中,消息是否成功投递. 如果消息和队列是可持久化的,那么确认消

  • SpringBoot集成RabbitMQ和概念介绍

    目录 一.RabbitMQ介绍 二.相关概念 三.简单使用 1.配置pom包 2.配置文件 3.队列配置 4.发送者 5.接收者 6.测试 四.高级使用 1.Topic Exchange 2.Fanout Exchange 一.RabbitMQ介绍 RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性. 高可用性等方面表现不俗.RabbitMQ主要是为了实现系统之间的双向解耦而实现的.当生产者大量产生数据时,消

  • MQ的消息模型及在工作上应用场景

    目录 MQ介绍 使用 MQ 的好处 使用 MQ 的坏处 什么时候用 MQ 消息模型 什么是 JMS 为什么需要 JMS 点对点模型 发布订阅模型 两个模型之间的区别 MQ 的在工作上应用场景 异步 使用 MQ 「MQ 带来的问题」 「MQ 产品的对比」 「MQ 的测试点」 » 生产者 » 消费者 队列 小结 MQ介绍 根据某科的介绍,MQ(message queue),叫消息队列,是基础数据结构中先进先出的一种数据机构. 一般用来解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩

  • Python实现RabbitMQ6种消息模型的示例代码

    RabbitMQ与Redis对比 ​ RabbitMQ是一种比较流行的消息中间件,之前我一直使用redis作为消息中间件,但是生产环境比较推荐RabbitMQ来替代Redis,所以我去查询了一些RabbitMQ的资料.相比于Redis,RabbitMQ优点很多,比如: 具有消息消费确认机制 队列,消息,都可以选择是否持久化,粒度更小.更灵活. 可以实现负载均衡 RabbitMQ应用场景 异步处理:比如用户注册时的确认邮件.短信等交由rabbitMQ进行异步处理 应用解耦:比如收发消息双方可以使用

  • JMS 之 Active MQ 的消息传输(详解)

    本文使用Active MQ5.6 一.消息协商器(Message Broker) broke:消息的交换器,就是对消息进行管理的容器.ActiveMQ 可以创建多个 Broker,客户端与ActiveMQ交互,实际上都是与ActiveMQ中的Broker交互,Broker配置在${MQ_HOME}\conf\activemq.xml. 二.连接器(Connectors)(一).传输连接器 (transportConnectors) transportConnectors 连接器:就是建立brok

  • 如何将pytorch模型部署到安卓上的方法示例

    目录 模型转化 安卓部署 新建项目 导入包 页面文件 模型推理 这篇文章演示如何将训练好的pytorch模型部署到安卓设备上.我也是刚开始学安卓,代码写的简单. 环境: pytorch版本:1.10.0 模型转化 pytorch_android支持的模型是.pt模型,我们训练出来的模型是.pth.所以需要转化才可以用.先看官网上给的转化方式: import torch import torchvision from torch.utils.mobile_optimizer import opti

  • Java各种锁在工作中使用场景和细节经验总结

    目录 1.synchronized 1.1.共享资源初始化 2.CountDownLatch 2.1.场景 2.2.实现 3.总结 1.synchronized synchronized 是可重入的排它锁,和 ReentrantLock 锁功能相似,任何使用 synchronized 的地方,几乎都可以使用 ReentrantLock 来代替,两者最大的相似点就是:可重入 + 排它锁,两者的区别主要有这些: ReentrantLock 的功能更加丰富,比如提供了 Condition,可以打断的加

  • Android消息机制Handler的工作过程详解

    综述 在Android系统中,出于对性能优化的考虑,对于Android的UI操作并不是线程安全的.也就是说若是有多个线程来操作UI组件,就会有可能导致线程安全问题.所以在Android中规定只能在UI线程中对UI进行操作.这个UI线程是在应用第一次启动时开启的,也称之为主线程(Main Thread),该线程专门用来操作UI组件,在这个UI线程中我们不能进行耗时操作,否则就会出现ANR(Application Not Responding)现象.如果我们在子线程中去操作UI,那么程序就回给我们抛

  • NetCore实现全局模型绑定异常信息统一处理(场景分析)

    本文主要讲解NetCore如何使用中间件捕获模型绑定的异常信息 场景 在.NET Core 中请求中,如果参数的类型错误,我们在控制器中定义的方法是不会执行的,当我们需要捕获模型绑定的异常信息时,可以使用ApiBehaviorOptions..接下来通过一个小demo给大家讲解一下用法 实现代码 public static void ConfigureModelBindingExceptionHandling(this IServiceCollection services) { service

  • 详解玩转直播系列之消息模块演进

    目录 一.背景 二.直播消息业务 2.1.主播与用户 2.2.房间号 2.3.消息类型划分 2.4.消息优先级 三.消息技术点 3.1.消息架构模型 3.2.短轮询 VS 长链接 3.2.1.短轮询 3.2.2.长连接 3.2.3.直播间IM消息分发 3.3.消息丢弃 四.写在最后 一.背景 即时消息(IM)系统是直播系统重要的组成部分,一个稳定的,有容错的,灵活的,支持高并发的消息模块是影响直播系统用户体验的重要因素.IM长连接服务在直播系统有发挥着举足轻重的作用. 在目前大部分主流的直播业务

  • Kafka Producer中的消息缓存模型图解详解

    目录 前言 什么是消息累加器RecordAccumulator 消息缓存模型 ProducerBatch的内存大小 内存分配 Batch的创建和释放 问题和答案 总结 前言 在阅读本文之前, 希望你可以思考一下下面几个问题, 带着问题去阅读文章会获得更好的效果. 发送消息的时候, 当Broker挂掉了,消息体还能写入到消息缓存中吗? 当消息还存储在缓存中的时候, 假如Producer客户端挂掉了,消息是不是就丢失了? 当最新的ProducerBatch还有空余的内存,但是接下来的一条消息很大,不

  • Tensorflow实现在训练好的模型上进行测试

    Tensorflow可以使用训练好的模型对新的数据进行测试,有两种方法:第一种方法是调用模型和训练在同一个py文件中,中情况比较简单:第二种是训练过程和调用模型过程分别在两个py文件中.本文将讲解第二种方法. 模型的保存 tensorflow提供可保存训练模型的接口,使用起来也不是很难,直接上代码讲解: #网络结构 w1 = tf.Variable(tf.truncated_normal([in_units, h1_units], stddev=0.1)) b1 = tf.Variable(tf

随机推荐