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

JAVA理论第十七章-RocketMQKafaka

Kafka

1.1 Kafka 是什么?

Kafka是一款分布式流处理框架,用于实时构建流处理应用。它有一个核心的功能广为人知,即作为企业级的消息引擎被广泛使用

1.2 Kafka 的特点?

高吞吐量、低延迟:Kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒

可扩展性:Kafka集群支持热扩展

持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失

容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)

高并发:支持数千个客户端同时读写

1.3 什么是消费者组?

消费者组是Kafka独有的概念,如果面试官问这个,就说明他对此有一定了解的。我先给出标准答案:

1、定义:即消费者组是Kafka提供的可扩展且具有容错性的消费者机制。

2、原理:在Kafka中,消费者组是由多个消费者实例构成的组。多个实例共同订阅若干个主题,实现共同消费。同一个组下的每个实例都配置由相同的组ID,被分配不同的订阅分区。当某个实例挂掉的时候,其他实例会自动地承担起它负责消费的分区。

此时,又有一个小技巧给到你:消费者组的题目,能够帮你在某种程度下掌握面试的方向

如果你擅长位移值原理,就不妨再提一下消费者组的位移提交机制;

如果你擅长 KafkaBroker,可以提一下消费者组与 Broker 之间的交互

;如果你擅长与消费者组完全不相关的 Producer,那么就可以这么说:“消费者组要消 费的数据完全来自于 Producer 端生产的消息,我对 Producer 还是比较熟悉的。”

1.4 Kafka 中,ZooKeeper 的作用是什么?

目前,Kafka使用ZooKeeper存放集群元数据、成员管理、Controller选举,以及其他一些管理类任务。之后,等KIP-500提案完成后,kafka将完全不再依赖于ZooKeeper。

记住,一定要突出”目前“,以彰显你非常了解社区的演进计划。”存放元数据“是指主题分区的所有数据都保存在ZooKeeper中,且以它保存的数据为权威,其他”人“都要与它保持对齐。”成员管理“是指Broker节点的注册、注销以及属性变更,等等。“Controller 选举”是指选举集群Controller,而其他管理类任务包括但不限于主题 删除、参数配置等。

不过,判处KIP-500也可能是个双刃剑。碰到非常资深的面试官,他可能会进一步追问你KIP-500是做的/一言蔽之:KIP-500思想,是使用社区自研的基于Raft的共识算法替代zookeeper,实现Controller自选举

1.5 如何估算 Kafka 集群的机器数量?

这道题目考察的是机器数量和所用资源之间的关联关系。所谓资源,也就是CPU、内存、磁盘和宽带

通常来说,CPU和内存资源的充足时比较容易保证的,因此,你需要从磁盘空间和带宽占用两个维度取评估机器数量。

在预估磁盘的占用时,你一定不要忘记计算副本同步的开销。如果一条消息占用1KB的磁盘空间,那么,在由3个副本的主题中,你就需要3kb的总空间来保存这条消息。显示的将这些考虑因素答出来,能够与彰显你考虑问题的全面性,是一个难得的加分项。

对于评估带宽来说,常见的带宽有1Gbps和10Gbps,但你要切记,这两个数字仅是最大值。因此,你最好和面试官确定一个给定的带宽是多少。然后,明确阐述当带宽占用接近总带宽的90%时,丢包情形就会发生。这样能显示出你的网络基本功

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

这道题目考察的是你对Leader/Follower模型的思考

Leader/Follower模型并没有规定Follower副本不可以对外提供读服务。很多框架都是允许这么做的,只是卡夫卡最初为了避免不一致性的问题,而采用了让Leader统一提供服务的方式

不过,在开始回答这道题时,你可以率先亮出观点:Kafka2.4之后,卡夫卡提供了有限度的读写分离,也就是说,Follower副本能够对外提供读服务

kafka2.4以前不支持读写分离的理由

场景不适用:读写分离使用于那种读负载很大,而写操作相对不频繁(读多写少)的场景,可Kafka不属于这样的场景

同步机制:Kafka采用pull方式实现follower的同步,因此Follower与Leader存在不一致性窗口。如果允许读Follower副本,就势必要处理消息滞后的问题

RocketMQ

2.1 消息中间件的区别?

RabbitMQ:erlang开发,对 消息堆积的支持并不好,当 大量消息积压的时候,会导致RabbitMQ的性能急剧下降。每秒钟可以处理 几万到十几万条消息。
RocketMQ:java开发,面向互联网集群化功能丰富,对在线业务的响应时延做了很多的优化,大多数情况下可以做到毫秒级的响应,每秒钟大概能处理 几十万条消息
Kafka:Scala开发,面向日志功能丰富, 性能最高。当你的业务场景中,每秒种 消息数量少时,kafka的时延反而会比较高。所以,kafka 不太适合在线业务场景
ActiveMQ:java开发,简单,稳定,性能不如前面三个。小型系统用也ok但是不推荐

2.2 为什么要使用MQ?

因为项目比较大,做了分布式系统,所有的远程服务调用请求都是同步执行经常出问题,所以引入了mq
作用:
  1. 解耦:系统耦合度降低没有强依赖关系
  2. 异步:不需要同步执行的远程调用可以有效提高响应时间
  3. 削峰:请求达到峰值后,后端service还可以保持固定消费速率消费,不会被压垮

2.3 RocketMQ由哪些角色组成,每个角色作用和特点是什么?

生产者(Producer)负责产生消息,生产者 向消息服务器发送由业务应用系统生成的消息
消费者(Consumer)负责消费信息,消费者 从消息服务器拉取信息并将其输入用于应用程序
消息服务器(Broker):是 消息存储中心,主要作用是 接收来自Producer的消息并存储Consumer从这里取得消息。
名称服务器(NameServer):用来 保存Broker相关Topic等元信息并给Producer,提供Consumer查找Broker信息。

2.4 RocketMQ消费模式有几种?

消费模型由Consumer决定,消费维度为 Topic
集群消费:
  1. 一条信息会被同Group中一个Consumer消费
  2. 多个Group同时消费一个Topic时,每个Group都会有一个生产者消费到数据
广播消费:
消息将对一个消费者组下的 各个消费者实例都消费一遍。即使 这个些消费者都属于同一个消费者组,消息也会被消费者组中的每个消费者消息一次。

2.5RocketMQ如何做负载均衡?

通过 Topic在多 Broker中分布式存储实现
(1)producer端
发送端 指定message queue发送消息到 响应的broker(消息服务器),来达到 写入时的负载均衡
  1. 提升写入吞吐量,当多个producer同时向一个broker写入数据的时候,性能会下降
  2. 消息分布在多broker中,为负载消费做准备
默认策略是随机选择:
  1. producer维护一个index
  2. 每次取节点会自增
  3. index向所有broker个数取余
  4. 自带容错策略
其他实现:
  1. SelectMessageQueueByHash
  2. hash的是传入的args
  3. SelectMessageQueueByRandom
  4. SelectMessageQueueByMachineRoom没有实现
也可以自定义实现MessageQueueSelector接口中的select方法
MessageQueue select(final List mqs,final Message msg,final Object arg);
(2)consumer端
采用的是平均分配算法来进行负责均衡。
其他负载均衡算法
平均分配策略(默认)(AllocateMessageQueueAveragely)
环形分配策略(AllocateMessageQueueAveragelyByCircle)
手动配置分配策略(AllocateMessageQueueByConfig)
机房分配策略(AllcateMessageQueueByMachineRoom)
一致性哈希分配策略(AllocateMessageQueueConsistentHash)
靠近机房策略(AllocateMachineRoomNearby)
http://www.xdnf.cn/news/14420.html

相关文章:

  • 【Linux教程】Linux 生存指南:掌握常用命令,避开致命误操作
  • 基于可靠消息确保分布式事务的最终一致性:以电商系统中订单服务的新建订单为例
  • C# 使用 TreeView 实践 WinRiver II 的测量管理功能
  • 篇章六 论坛系统——业务开发——实现业务功能
  • Java 与 MySQL 性能优化:Linux服务器上MySQL性能指标解读与监控方法
  • 修改Typora快捷键
  • 新的激活函数B-SiLU和NeLU:ReLU函数的复兴
  • 6.14项目一话术
  • 四六级英语作文模版
  • LeetCode 第72题:编辑距离(巧妙的动态规划方法)
  • 同旺科技 USB TO SPI / I2C适配器(专业版)--EEPROM读写——C
  • uni-app项目实战笔记14--给全屏页面添加遮罩层
  • 深度学习中的激活函数:PyTorch中的ReLU及其应用
  • 人工智能学习14-Numpy-数组广播机制
  • AtCoder AT_abc410_e [ABC410E] Battles in a Row 题解
  • 如何识别并管理多项目环境下的潜在风险
  • 【Git】使用 SSH 协议 解决 Git 推送失败问题
  • 思科资料-思科交换机的常见配置(详细总结)
  • SCADA|KingSCADA对比显示任意几条实时曲线的方法
  • [特殊字符] Next.js Turbo 模式不支持 @svgr/webpack 的原因与解决方案
  • DataWhale-零基础网络爬虫技术(一)
  • 将 CSV 转换为 Shp 数据
  • 基于单片机的PT100温度变送器设计
  • CKA考试知识点分享(16)---cri-dockerd
  • 拓扑推理:把邻接矩阵和节点特征形式数据集转换为可以训练CNN等序列模型的数据集
  • 树莓派智能小车基本移动实验指导书
  • k8s使用私有harbor镜像源
  • Activiti初识
  • C/C++的OpenCV 地砖识别
  • Linux文件权限管理核心要点总结