首页 > 其他分享 >面试之消息队列

面试之消息队列

时间:2023-09-27 21:14:08浏览次数:34  
标签:消费 消费者 exchange 队列 面试 死信 消息

使用mq的优缺点

优点

  • 解耦,生产者与消费者都只需要与mq进行交互,减少了强依赖。

  • 流量削峰,将大量请求放入mq后,服务器可以根据自身能力从mq中拉取消息消费。

  • 异步通信,减少客户端响应时间。

缺点

  • 系统更复杂,运维成本增加。

  • 可用性降低,存在mq服务器宕机的风险。

 

关键角色

  • broker,可理解为一个mq服务器实体。

  • channel,真实TCP连接上的虚拟连接,生产者/消费者与mq服务器通信的工具。

  • queue,存放消息的队列,消费者通过订阅指定队列进行消费。

  • exchange,根据BindingKey和RoutingKey匹配关系,将生产者的发送消息分发给不同的队列。

  • BindingKey,exchange与queue的绑定关系。

  • RoutingKey,生产者将消息发送给exchange时指定的路由键。

根据BindingKey的不同,可以将exchange分为不同模式:

  • direct,如果RoutingKey完全匹配BindingKey则分发,形如“hello”等。

  • fanout,exchange将收到的消息分发给所有绑定的队列,其实是RoutingKey和BindingKey都为空。

  • topic,如果RoutingKey匹配BindingKey的正则表达式则分发,“ * ” 匹配一个任意文本,“ # ”匹配0个或多个任意文本,文本间以“ . ” 隔开,例如BindingKey为“ *.a.# ”,RoutingKey为“ b.a.c ”。

消费者消费消息的两种模式:

  • push,由mq服务器将消息推送给消费者消费,更常用。

  • poll,由消费者主动向mq服务器拉取消息消费。

 

死信队列与延时队列

死信交换机与死信队列

死信交换机其实就是一个普通的交换机,只不过它不会去接收生产者的消息,而是接收来自其他消息队列中的死信。普通的消息队列可以指定x-dead-letter-exchange参数来指定死信交换机,以及x-dead-letter-routing-key参数指定死信的RoutingKey,当队列中的消息变为死信后就将其发送到死信交换机。绑定在死信交换机上的队列称为死信队列,死信交换机根据死信的RoutingKey分发给不同的死信队列。一条普通消息变为死信的情况有:

  • 消息TTL过期,即过期仍未被消费。TTL可以由生产者在发送消息时指定,也可以在创建queue时通过x-message-ttl参数指定(此时所有进入该队列的消息都有指定的TTL),如果两种方式都指定了则取更小值。

  • 消费者消费失败,返回nack,并设置requeue参数的值为false(如果为true则该消息会重新入队)。

  • 队列达到最大长度,可在创建queue时指定最大长度。

此时除了普通的消费者外,还应有专门处理死信队列消息的消费者。

延迟队列

RabbitMQ中并未直接提供延时队列,但可以通过给队列设置消息过期时间并指定死信交换机来实现延时队列。典型的应用场景如:新建订单超过15分钟未支付则自动取消。

 

消息确认

消息发送确认

通过消息发送确认来确保生产者发送的消息能正常到达exchange。Springboot整合的RabbitTemplate中提供了ConfirmCallback接口作为消息发送失败时的回调,需在配置文件中开启publisher-confirms。

消息路由确认

通过消息路由确认来确保生产者发送的消息能被exchange正常路由给队列。Springboot整合的RabbitTemplate中提供了ReturnCallback 接口作为消息路由失败时的回调,需在配置文件中开启publisher-returns。

消息接收确认

通过消息接收确认来确保消费者成功消费消息。消费者确认消息共有三种模式:

  • none,无确认模式,默认。无确认模式下RabbitMQ认为推送出去的消息都被成功消费,会直接在队列中删除消息(无论消费者后续处理异常或者是宕机)。

  • auto,自动确认模式。自动确认模式下RabbitMQ会根据消费者是否抛异常来决定返回ack(无异常)或nack(有异常),返回nack的消息会根据其附带的requeue参数来决定将其重新入队(true)或丢弃(false,也可能是发给死信exchange)。

  • manual,手动确认模式。消费者调用basicAck()、basicReject()或basicNack()手动回复确认消息,其中basicAck()返回ack,后两种返回nack。basicNack()与basicReject()的区别是可以一次性拒绝多条消息。

 

重复消费与顺序消费

重复消费

重复消费的解决办法有两种:

  • 确保一个消息只被消费一次,可以给每条消息添加唯一标识,当消费成功后将其存入Redis标识已被处理,消费者在消费之前先从Redis中查询该消息是否被消费。

  • 保证消费者消费消息的幂等性,即消费者消费一次消息和消费多次消息的起到的效果是一样的,可以借助数据库唯一性约束实现。

顺序消费

将需要被顺序消费的消息放入同一个队列,并保证该队列只有一个消费者,利用队列先进先出的特性保证顺序消费。

标签:消费,消费者,exchange,队列,面试,死信,消息
From: https://www.cnblogs.com/mqDliaolei/p/17734332.html

相关文章

  • 面试之关系型数据库
    数据库设计三范式第一范式。任何一张表必须有主键,每一个字段具有原子性不可再分。第二范式。所有非主键字段完全依赖主键字段,不存在部分依赖(复合主键可能存在此情况)。第三范式。所有非主键字段直接依赖于主键字段,不存在传递依赖(比如员工表中存在部门编号和部门名)。注:多......
  • 面试之智力题
    一千瓶药水中有一瓶毒药,毒性在喝下后24小时发作,问至少需要多少只老鼠才能在24小时后得出哪瓶是毒药?将一千瓶药水编号1~1000,对应10位二进制位。让第1只老鼠嘬一口所有二进制编号第1位为1的药水,第2只老鼠嘬一口所有二进制编号第2位为1的药水,依次类推则需要10只老鼠。24小时后如......
  • 延迟队列
    一、延时队列的应用什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。延时队列在项目中的应用还是比较多的,尤其像电商类平台:1、订单成功后,在30分钟内没有支付,自动取消订单2、外卖平台发送......
  • 829. 模拟队列
    829.模拟队列题目链接:829.模拟队列-AcWing题库队列:就是一个特殊的数组。这个数组,最前面叫队头,最后面叫队尾。只允许在最后面添加元素,只允许在最前面删除元素。#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;intqu[N];intmain(){int......
  • 轻松拿下Offer!20个Salesforce管理员&顾问的基础面试问题
    先是Salesforce第二财季业绩远超预期,股价大涨,后是首席执行官MarcBenioff表示将在各部门招聘3300名员工,生态系统呈现欣欣向荣的态势,Salesforce也成为越来越多人的职业选择。管理员作为入门级的岗位,是小白和新手从业者的首选。本篇文章总结了Salesforce管理员/顾问的基础面试问题......
  • 爬虫面试题
    http基于tcp/ip协议百度是通用性爬虫http返回的状态码代表成功的是200网页编码使用的函数式encode()解码使用的函数式是decode()爬虫又叫网页蜘蛛、网络机器人什么是爬虫并解释其概念?(1)爬虫又叫网页蜘蛛,是模拟人操作客户端向服务器发起请求,抓取数据的自动化程序或......
  • 测试开发想通过python面试环节,必须懂得异常原理
    异常定义异常即是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行。python处理异常的方法 我们先通过一个例子来了解代码中引入异常处理的原因。print('Start')a=10b=0print(a/b)print('End')执行结果Traceback(mostrecentcalllast): File"C:/Users/Kevin/Pycha......
  • 一文搞定Python面试必问知识点——列表
    Python3有6种标准类型:(Number(数字)、String(字符串)、Tuple(组),List(列表)、Dictionary(字典)、Set(集合))。其中,列表是Python中最基本也是最常用的数据结构。列表中的每个元素都分配一个数字,即它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。在关于python测试开发的面试中,列表是被问及频......
  • 在sqlserver2008中使用自带的消息队列Service Broker
    以前有个业务操作本来是用sqlserver的表中触发器来处理的,后来在使用一个存储过程中,涉及到这个表后,发现存储过程执行过程,需要等待涉及的表的触发器操作完成才会返回,导致这个存储过程耗时有点久,这样就出现锁的问题,本来想改造下代码写到C#中,后来也懒得弄了,就找了找,发现可以用消息队......
  • 接口测试系列文章2——接口测试面试必问的知识点(建议收藏)
    面试的本质我们每个人或多或少都经历过大大小小的各种面试,少则几次多着几十次,更甚者上百次,那么我们大家是否思考过,面试招聘对于企业来讲究竟意味着什么吗?有的同学会说,当然就是招人干活喽!不错!但是本质上面试是企业自我输血的过程。第一,血型匹配度?也就是价值观和企业是否一致。第二,拥......