当前位置: 首页 > news >正文

active mq topic消费后删除_面试官杠上消息队列?高可用、重复消费、丢失、顺序消息你懂吗?...

写在最前面(推荐阅读一下)

  1. 金三银四第一天,啃透这些SpringBoot知识点,还怕干不赢面试官?
  2. 2020“闭关”跳槽季,啃透分布式三大技术:限流、缓存、通讯
  3. 秋招面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等
  4. 2020年后想跳槽?MQ、ZK、Nginx、Kafk等分布式技术你都掌握了?
  5. 终极手撕之架构大全:分布式+框架+微服务+性能优化,够不够?

前言

消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。

440d1bbcced1aa018ae1c20ef59aaf75.png

面试官杠上消息队列?高可用、重复消费、丢失、顺序消息...

什么,这么多问题啊!别慌,现在就来找找解决方案。

高可用

主流的MQ都有高可用模式可以供我们选择!

RabbitMQ可以使用镜像模式搭建高可用集群,可以配置数据同步到所有节点还是指定数量的节点以满足实际需求。

RocketMQ、Kafka天然的是分布式设计让他们天然具有高可用的技能^^ RocketMQ有多master多slave异步复制模式、多master多slave同步双写模式多种集群部署模式可以选择 多master多slave模式部署架构图:

5aa4fb37ad8a9302cdf0bdc5943979ae.png

Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic服务的Broker Master建立长连接,且定时向Master发送心跳。Producer只能将消息发送到Broker master。
Consumer则不一样,它同时与提供Topic服务的Master、Slave建立长连接,既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。

Kafka的架构与RocketMQ十分相似

2e574d3da453e8e24279486b06b22cdd.png

Zookeeper的的作用与NameServer的作用相似, 用于保存集群配置、选举Leader等。
集群中有许多broker用于堆积消息,Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高。
Producer使用push模式将消息发布到broker。
Consumer使用pull模式从broker订阅并消费消息。

重复消费

现在消息队列一般都能保证at least once的,也就是消息至少一次投递。 在这种情况为什么会出现重复消费的问题呢? 通常都是由于网络原因造成的,原因如下: 通常消息被成功消费后消费者都会发送一个成功标志给MQ,MQ收到这个标志就表示消息已经成功消费了,就不会再发送给其他消费者了。 但是如果因为网络这个标志没有送到MQ就丢失了,MQ就认为这个消息没有被成功消费,就会再次发送给其他消费者消费,就造成了重复了。

这时我们看这个问题就变成了我们怎么保证消费端的幂等性。

幂等性 是指一个操作其执行任意多次所产生的影响均与一次执行的影响相同 大白话就是你同样的参数调用我这个接口,调用多少次结果都相同

幂等性需要根据业务需求来具体看,但是主要的原理就是去重 一般可分为强校验、弱校验

  • 强校验 一般与金融相关的操作都是强校验的 (人在996,锅从天上来 偷跑) 比如消费者是一个打款服务,在付款成功后都加一条流水记录。且两个操作放入一个事务中。 再次消费的时候就去流水表查一下有没有这条纪录,如果有表示已经消费过了,直接返回。流水表也能起到对账的作用! 一些简单的场景也可以依赖数据库唯一约束实现
  • 弱校验 这个就没那么严格,重复一下也没那么重要的情况。 可以将ID保存在redis set中,过期时间看情况设置。 如果ID不能保证唯一可以选择生产方生成一个token存入redis,消费方在消费后将其删除(redis的操作能够保证其原子性,删除失败会返回0)

消息丢失

有些消息怎么跑着跑着就没了呢?

一般来讲消息丢失的途径有三个:

  • 生产者弄丢数据
    主流的MQ都有确认机制或者事务机制,可以保证生产者将消息送达到MQ。 比如RabbitMQ就有事务模式和confirm模式。
  • 消息队列弄丢数据
    一般只要开启MQ的持久化磁盘配置就能解决这个问题,写入了磁盘就放心了。
  • 消费者弄丢数据
    消费者丢数据一般是因为采用了自动确认消息模式。MQ收到确认消息后会删除消息,如果这时消费者异常了,那消息就没了。改用手动确认就能解决这个问题了呢!

顺序消息

顺序消息的场景可能用的比较少,但是还是有的 比如一个电商的下单操作,下单后先减库存然后生成订单,这个操作就需要顺序执行的 那怎么保证顺序呢?

  1. 首先生产者需要保证入队的顺序,入队都是乱的那再厉害的MQ也招架不住啊 (舌灿莲花)
  2. 一般的MQ都能保证内部Queue是FIFO的(先进先出),但是只是针对一个Queue,所以在发送消息的时候可以使用Hash取模法将同一个操作的消息发送到同一个Queue里面,这样就能保证出队时是顺序的了。
  3. 消费者也需要注意,如果多个消费者同时消费一个队列。一样可能出现顺序错乱的情况。这就相当于是多线程消费了!

通过上面的连招基本就能解决顺序消息消费的问题了呢!


作者:张伟是混蛋12138
原文链接:https://juejin.im/post/5e5b9854518825493d6a93c5

相关文章:

  • 天气预报c是什么意思_昨天“大雪”天气,对明年气候有什么影响?
  • 当退出python时是否释放全部内存_Python跑循环时内存泄露的解决方法
  • 为什么parsefloat加出来还是字符串_为什么股票资金流出了1000万,却还是封住了涨停板?知道套路的我眼泪都掉出来了...
  • java web项目github_3月份Github上“最热门”的十大开源项目,竟被Java承包了!
  • python协程实现一万并发_求你别再花大价钱学 Python 之协程高并发爬虫
  • 什么是python编程例子_什么是Python编程的逻辑判断?
  • python读取odb_python - 从.odb文件中提取von mises应力值 - 堆栈内存溢出
  • sqlserver union执行后变慢_Zabbix如何监控SQL Server服务状态
  • 事件总线第一次点击_干货Spring Cloud Bus 消息总线介绍
  • cgi web 调用多次启动_漏洞预警|Web系统管理工具Webmin远程命令执行高危漏洞分析(CVE201915107)...
  • flashplayer离线安装包 64位_离线安装NET Framework 3.5的一般方法
  • node 获取表单数据 为空_Python数据结构(二)单向循环链表
  • javascript案例大全_JavaScript 类型 — 重学 JavaScript
  • ajax如何提交多表单的值_Ajax完整详细教程(一)
  • 五金手册钢材理论重量计算小程序_33个造价实用小工具,工作效率提高80%,造价人的终极神器,手慢无...
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Centos6.8 使用rpm安装mysql5.7
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • DataBase in Android
  • Date型的使用
  • ECMAScript入门(七)--Module语法
  • Java多态
  • mysql常用命令汇总
  • php面试题 汇集2
  • 第2章 网络文档
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • const的用法,特别是用在函数前面与后面的区别
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​香农与信息论三大定律
  • #mysql 8.0 踩坑日记
  • $L^p$ 调和函数恒为零
  • (day6) 319. 灯泡开关
  • (WSI分类)WSI分类文献小综述 2024
  • (办公)springboot配置aop处理请求.
  • (分类)KNN算法- 参数调优
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (转)fock函数详解
  • (转)负载均衡,回话保持,cookie
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • . NET自动找可写目录
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 流——流的类型体系简单介绍
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • [ C++ ] STL---stack与queue
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [C++] 统计程序耗时
  • [C++]C++类基本语法
  • [C++]STL之map
  • [CISCN 2019华东南]Web11
  • [C语言]——柔性数组
  • [Django 0-1] Core.Email 模块