06-mq

1、消息队列有什么优点和缺点?

优点:

        解耦、异步、削峰填谷。

缺点:

        系统可用性降低

        系统复杂性提高

        一致性问题

2、常见消息队列的比较

3、Kafka的特性

1.消息持久化

2.高吞吐量

3.扩展性强(动态)4集群+4台集群

4.多客户端支持(Java、C、C++、GO、Python)

5. Kafka Streams(流处理)双十一销售大屏

6、安全机制

7、数据备份

8、轻量级

9、消息压缩

4、RabbitMQ中的vhost起什么作用?

vhost:虚拟消息服务器。

Vhost提供了逻辑上的分离,可以将众多客户端进行区分,又可以避免队列和交换器的命名冲突。

rabbitmq里创建用户,必须要被指派给至少一个vhost,并且只能访问被指派内的队列、交换器和

绑定。Vhost必须通过rabbitmq的管理控制工具创建。

5、RabbitMQ上的一个queue中存放的message是否有数量限制?限制是多少

        默认情况下一般是无限制,可以通过参数来限制, x-max-length :对队列中消息的条数进行

限制,x-max-length-bytes :对队列中消息的总量进行限制。

6、kafka中,可以不用zookeeper么?

新版本的kafka可以不用,3.0以上可以使用Kafka with Kraft,就可以完全抛弃zookeeper

2版本的需要使用zookeeper,用来存放topic。

7、说一说Kafka你熟悉的参数?

1、必选属性

创建生产者对象时有三个属性必须指定:

bootstrap.servers:该属性指定broker的地址清单,

key.serializer:key的序列化器。必须提供将对象序列化成字节数组的序列化器。

value.serializer:value的序列化器。必须提供将对象序列化成字节数组的序列化器。

acks:

acks=0:生产者在写入消息之前不会等待任 何来自服务器的响应,容易丢消息,但是吞吐量高。

acks=1:只要集群的主节点收到消息,生产者会收到来自服务器的成功响应。

acks=all:只有当所有参与复制的节点都收到消息,生产者才会收到一个来自服务器的成功响应。延迟高。

batch.size:该参数指定了一个批次可以使用的内存大小,按照字节数计算。

linger.ms:

max.request.size:控制生产者发送请求最大大小。默认这个值为1M

8、说一说RabbitMQ中的AMQP

AMQP协议 的模型架构 和 RabbitMQ 的模型架构是一样的,生产者将消息发送给交换器,交换器和队列绑定 。

9、RabbitMQ开启持久化机制,有什么要注意的点?

1、开启了持久化,性能影响会非常大,大概会变成2到3千的吞吐量

2、开启持久化需要交换器、队列、消息三者都需要持久化

10、kafka适合哪些场景?

1、适合日志收集:比较适合,按照时间进行写入的。

2、适合消息系统:典型的生产者生产消息,消费者消费消息。

3、流式处理:kafka(用的stream)配合Flink 可以进行大数据量的流处理,不用再去操作DB,很方便的查看任意时间段的数据。

4、不适合限时订单:订单30s没有支付就会取消订单,在RocketMQ中是使用延迟队列的方式实现。

11、RabbitMQ中交换器4种类型?

fanout(广播): 把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。

direct(定向):把消息路由到BindingKey和RoutingKey完全匹配的队列中。

topic(通配符): 匹配规则: RoutingKey 为一个 点号'.'分隔的字符串。比如: java.xiaoka.show BindingKey和RoutingKey一样也是点号“.“分隔的字符串。 BindingKey可使用 * 和 # 用于做模糊匹配,*匹配一个单词,#匹配多个或者0个

headers:不依赖路由键匹配规则路由消息。是根据发送消息内容中的headers属性进行匹配。性能差,基本用不到。

12、为什么Kafka不支持读写分离?

读写分离要实现的就是主写从读。

1、数据一致性问题:数据从主节点转到从节点,必然会有一个延时的时间窗口,这个时间窗口会

导致主从节点之间的数据不一致。

2、延时问题:Kafka追求高性能,如果走主从复制,延时严重

3、如果实现了主写从读,很难保证负载均衡

4、不实现读写分离,架构简单、出错可能比较小

13、Kafka中是怎么做到消息顺序性的?

一个 topic,一个 partition,一个 consumer,内部单线程消费。

生产者在发送消息的时候指定要发送到特定Partition(分区)。

14、Kafka为什么那么快?

1、文件顺序读写,速度接近内存

2、写入数据,传统方式需要4次拷贝,kafka采用零拷贝技术,减少没有必要的拷贝,发送文件描

述符sendfile。

 发送的文件描述符里面记录的是 在Socket缓冲区的位置,直接从Socket缓冲区拿数据就可以了。

3、批处理、发送的JSON数据进行压缩等

15、mq如何解决重复消费?

        消息被重复消费,就是消费方多次接受到了同一条消息。根本原因就是,第一次消费完后,

消费方给 MQ 确认已消费的反馈,MQ 没有成功接受。比如网络原因、MQ 重启等。所以 MQ 是无

法保证消息不被重复消费的,只能业务系统层面考虑。

        不被重复消费的问题,就被转化为消息消费的幂等性的问题。幂等性就是指一次和多次请求

的结果一致,多次请求不会产生副作用。

解决方案:

1、MVCC多版本并发控制 (生产的时候带上数据的版本号)

执行的方法  update(id,version);

实际执行的SQL语句 

update order set count = count + 1 where id =1 and version = #{version}

2、去重表的方案

给这条消息生成一个唯一索引 id ,保存到创建的去重表中。

	try{将这条消息生成的唯一id  保存到去重表中insert去重表(id)执行具体的sqlupdate order set count = count + 1 where id =1 }catch(Exeception e){如果去重表执行保存的时候发生了异常在这里捕获异常,不要抛出异常在这里执行消费消息的ACK确认}

16、Rocketmq如何保证高可用性?

1、架构层面

避免用单节点或者简单的一主一从架构,可以采取多主多从的架构,并且主从之间采用同步复制的方式进行数据双写。

2、刷盘策略

RocketMQ默认的异步刷盘,可以改成同步刷盘SYNC_FLUSH。

3、生产消息的高可用

        当消息发送失败了,在消息重试的时候,会尽量规避上一次发送的 Broker,选择还没推送过该消息的Broker,以增大消息发送的成功率。

4、消费消息的高可用

        消费者获取到消息之后,可以等到整个业务处理完成,再进行CONSUME_SUCCESS状态确认,如果业务处理过程中发生了异常那么就会触发broker的重试机制。

17、RocketMq的存储机制了解吗?

        消息生产者发送消息到broker,都是会按照顺序存储在CommitLog文件中,每个commitLog文件的大小为1G。

CommitLog-存储所有的消息元数据,包括Topic、QueueId以及message

ConsumerQueue-消费逻辑队列:存储消息在CommitLog的offset

IndexFile-索引文件:存储消息的key和时间戳等信息,使得RocketMq可以采用key和时间区间来查询消息 

也就是说,rocketMq将消息均存储在CommitLog中,并分别提供了CosumerQueue和IndexFile两个索引,来快速检索消息

18、RocketMq性能比较高的原因?

1、底层采用Netty 高效的NIO通讯框架。

2、文件存储,顺序读写

3.零拷贝,使用mmap的方式进行零拷贝,提高了数据传输的效率

4.异步刷盘

    相比较于同步刷盘,异步刷盘的性能会高很多

5、RocketMQ大量使用多线程、异步

6、锁优化 (CAS机制无锁化)

19、让你来设计一个消息队列,你会怎么设计?

1、数据存储角度:

        理论上,从速度来看,分布式文件系统 > 分布式KV(持久化)> 数据库,而可靠性截然相

反,如果追求性能可以基于文件系统的顺序写、零拷贝。

2、高可用角度:

        动态可伸缩、

        消息的丢失:多主多从、多副本,遵守raft协议,如果一台主服务器 宕机,通过选举机制选出来主服务器。

3、网络框架角度:

        选用高效的Netty框架,producer 同步异步发送消息,consumer 同步异步接收消息。同步能够保证结果,异步能够保证性能。

20、有几百万消息持续积压几小时,说说怎么解决?

1、修复consumer的问题,让他恢复消费速度,然后等待几十分钟消费完毕,这是个解决方案。不

过有时候我们还会进行临时紧急扩容。

        一个消费者一秒是1000条,一秒3个消费者是3000条,一分钟是18万条。1000多万条,所以如果积压了几百万到上千万的数据,即使消费者恢复了,也需要大概1小时的时间才能恢复过来。

2、临时紧急扩容具体操作步骤和思路如下:

先修复consumer的问题,确保其恢复消费速度,然后将现有consumer都停掉。

新建一个topic,partition是原来的10倍,临时建立好原先10倍或者20倍的queue数量。然后写一个临时的分发数据的consumer程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的10倍数量的queue。

接着临时征用10倍的机器来部署consumer,每一批consumer消费一个临时queue的数据。

这种做法相当于是临时将queue资源和consumer资源扩大10倍,以正常的10倍速度来消费数据。

等快速消费完积压数据之后,再恢复原先部署架构,重新用原先的consumer机器来消费消息。

21、Rocketmq中Broker的部署方式

1.单台 Master 部署;

2.多台 Master部署

3.多台主从部署---生产中常见的模式

22、Rocketmq中Broker的刷盘策略有哪些?

同步刷盘

SYNC_FLUSH(同步刷盘):生产者发送的每一条消息都在保存到磁盘成功后才返回告诉生产者成功。这种方式不会存在消息丢失的问
题,但是有很大的磁盘IO开销,性能有一定影响。

异步刷盘

ASYNC_FLUSH(异步刷盘):生产者发送的每一条消息并不是立即保存到磁盘,而是暂时缓存起来,然后就返回生产者成功。随后再异步的将缓存数据保存到磁盘,有两种情况:1是定期将缓存中更新的数据进行刷盘,2是当缓存中更新的数据条数达到某一设定值后进行刷盘。这种异步的方式会存在消息丢失(在还未来得及同步到磁盘的时候宕机),但是性能很好。默认是这种模式。

23、什么是路由注册?RocketMQ如何进行路由注册?

        RocketMQ的路由注册是通过broker向NameServer发送心跳包实现的,首先borker每隔30s向nameserver发送心跳语句,nameserver更新brokerLiveTable的心跳时间。

24、什么是路由发现?RocketMQ如何进行路由发现?

        RocketMQ的路由发现不是实时的,NameServer不会主动向客户端推送,而是客户端定时拉取主题最新的路由,然后更新。

step1:调用RouterInfoManager的方法,从路由表topicQueueTable、brokerAddrTable、filterServerTable分别填充信息;

step2:如果主题对应的消息为顺序消息,则从NameServerKVconfig中获取关于顺序消息相关的配置填充路由信息;

25、什么是路由剔除?RocketMQ如何进行路由剔除?

路由删除有两个触发节点:

1)NameServer定时扫描brokerLiveTable检测上次心跳包与当前系统时间的时间差,如果大于120S,就需要删除;

2)Broker在正常关闭时,会执行unregisterBroker命令。

两种方法删除的逻辑都是一致的。

step1:申请写锁

step2:从brokerLiveTable、filterServerTable移除,从brokerAddrTableclusterAddrTable、topicQueueTable移除

step3:释放锁

26、使用RocketMQ过程中遇到过什么问题?

1、消息挤压问题(消费者出现问题了,短信没有发送)

2、消息丢失问题

3、消息重复消费问题

4、RocketMQ内存不够OOM问题

27、RocketMQ的总体架构,以及每个组件的功能?

RocketMQ 一共由四个部分组成:NameServer、Broker、Producer、Consumer,它们分别对应着发现、存、发、收四个功能。这四部分的功能很像邮政系统,Producer 相当于负责发送信件的发件人,Consumer 相当于负责接收信件的收件人,Broker 相当于负责暂存信件传输的邮局,NameServer 相当于负责协调各个地方邮局的管理机构。一般情况下,为了保证高可用,每一部分都是以集群形式部署的。

28、讲一讲RocketMQ中的分布式事务及实现(了解)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/77783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件【10】运放-1-理想运放与虚断虚短的来源

1 概述 今天开始,聊一聊运放吧,之前很多兄弟们也提了这个要求。正好我最近也想深入看看运放方面的,那么就借这个机会一步一步再搞一搞吧。 运放这个器件相对于电阻,电容,三极管,MOS管等器件算是比较复杂的…

Docker进阶:Docker Compose(容器编排) 管理多容器应用—实战案例演示

Docker进阶:Docker Compose(容器编排) 管理多容器应用—实战案例演示 一、Docker Compose简介二、Docker Compose安装三、Docker Compose卸载四、Docker Compose核心概念4.1、一文件原则(docker-compose.yml)4.2、服务…

vue交互

目录 交互 指有人参与的,程序并非按照一定的顺序去执行,可以人为介入,让程序或应用去根据输入选择执行流程,提供给我们需要的信息。 前、后端 前端:指客户端,浏览器 用户可以直接看到、操作,可…

【大数据之Kafka】十二、Kafka之offset位移及漏消费和重复消费

1 offset的默认维护位置 Kafka0.9版本之前, consumer默认将offset保存在Zookeeper中。从0.9版本开始,consumer默认将offset保存在Kafka一个内置的topic中,该topic为 consumer_offsets。   consumer_offsets 主题里面采用 key 和 value 的方…

【网络教程】记一次使用Docker手动搭建BT宝塔面板的全过程(包含问题解决如:宝塔面板无法开启防火墙,ssh,nginx等)

文章目录 准备安装安装宝塔面板开启ssh和修改ssh的密码导出镜像问题解决宝塔面板无法开启防火墙无法启动ssh设置密码nginx安装失败设置开机启动相关服务准备 演示的系统环境:Ubuntu 22.04.3 LTS更新安装/升级docker到最新版本升级docker相关命令如下# 更新软件包列表并自动升级…

TypeScript断言

什么是断言? 一个编译时语法,用于告诉编译器用户比编译器更加确定变量的类型,进而解除编译错误,类型断言有点类似于其他语言的类型转换,但它没有运行时的影响,只是在编译阶段起作用。所以,即使通…

用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections

今天用Navicat进行数据备份的时候,发现由于数据库连接数目过多导致连接锁定,这种情况在多人协同开发的场景中很常见。当然我这里也因为多个应用使用了数据库连接,所以出现了Too Many Connections。 可能是超过最大连接数了。 1、进入Navicat…

【nosql】redis之高可用(主从复制、哨兵、集群)搭建

redis群集有三种模式 redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster集群,下面会讲解一下三种模式的工作方式,以及如何搭建cluster群集 ●主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从…

学习笔记|定时器|STC中断|定时器时间计算|STC32G单片机视频开发教程(冲哥)|第十一集:定时器的作用和意义

文章目录 1.定时器的作用和意义定时器中断定时器是定时器和计数器的统称。 2.STC32G单片机定时器使用原理2.1 先设置功能为定时器/计数器(本质都是加法计数器)2.2、在定时器模式下,设置不分频或者12分频∶Tips:选择不分频还是12分频2.3、定时器的工作模式…

【腾讯云Cloud Studio实战训练营】戏说cloud studio

文章目录 前言产品概述项目体验登录空间模板模板项目体验 总结 前言 在奇幻世界中,存在着一片神秘的云海,被人们称为腾讯云云端开发环境 Cloud Studio。这片云海是一座巨大的浮岛,上面漂浮着一个集成式开发环境(Integrated Devel…

自动化测试入门知识 —— 数据驱动测试

一、什么是数据驱动测试? 数据驱动测试是一种测试方法,它的核心思想是通过不同的测试数据来验证同一个测试逻辑。通常情况下,测试用例中的输入数据和预期结果会被提取出来,以便可以通过不同的测试数据进行重复执行。 数据驱动测…

分享一个复合故障数据集

复合故障数据集 1.本数据集采集了轴承从正常状态到故障状态的振动信号, 包含失效的原因:内圈磨损,保持架断裂,外圈磨损和外圈裂损。其中有单一类型故障、单一故障组合的复合故障等多种失效形式,可用于诊断滚动轴承早期…

飞行动力学 - 第22节-动稳定性与运动方程 之 基础点摘要

飞行动力学 - 第22节-动稳定性与运动方程 之 基础点摘要 1. 稳定性定义2. 动稳定性示意图3. 数值仿真结构框图4. 运动响应类型5. 参考资料 1. 稳定性定义 飞机在平衡状态(静止或匀速运动)受到扰动: 有回到初始状态的趋势;静稳定…

微信怎么定时发圈?

定时发圈的妙用 在合适的时间点发布新的产品、促销活动,不仅能够及时提醒用户品牌的存在,还可以引发用户的兴趣,增加品牌的曝光率。 选择最佳的发朋友圈时间段,以确保推广内容得到最大的曝光和关注,提高广告投放的效果…

录音怎么转换成mp3格式?支持二十多种格式

录音怎么转换成mp3格式?在我们的日常生活和工作中,录音是一项非常有用的工具,随着手机以及录音设备越来越普及化,让录音这件事情变得非常的简单,录音可以帮助我们解决非常多的事情。例如通过录音,我们可以记…

Redis十大数据类型

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏&#xf…

无涯教程-JavaScript - CUMIPMT函数

描述 CUMIPMT函数返回start_period和end_period之间的贷款累计利息。 语法 CUMIPMT (rate, nper, pv, start_period, end_period, type)争论 Argument描述Required/OptionalRateThe interest rate.RequiredNperThe total number of payment periods.RequiredPvThe present …

SpringBoot原理-自动配置-概述

自动配置 SpringBoot的自动配置就是当Spring容器启动后,一些配置类、bean对象就会自动存入IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。启动一个SpringBoot项目后,观察如下

【C++杂货铺】优先级队列的使用指南与模拟实现

文章目录 一、priority_queue的介绍二、priority_queue的使用2.1 数组中的第k个最大元素 三、priority_queue模拟实现3.1 仿函数3.2 成员变量3.3 成员函数3.3.1 构造函数3.3.2 AdjustDown3.3.3 push3.3.4 AdjustUp3.3.5 pop3.3.6 empty3.3.7 size 四、结语 一、priority_queue的…

PBR纹理的10种贴图

PBR 是基于物理的渲染的首字母缩写。它试图通过模拟材料如何吸收和反射光,以模仿现实世界中的光流的方式产生视觉效果。最近的游戏引擎由于其逼真的效果而越来越多地使用 PBR 纹理。对于实时渲染,它们被认为是真实世界场景的最佳近似值。 推荐&#xff…