Java后端八股------消息中间件篇

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自动确认没收到,实现重复消费问题,可以用业务唯一标识来确定业务是否被消费。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
TTL也就是超时时间,一般去dead letter的时间为min(消息的ttl,queue的ttl)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
acks=all设置是最安全的,但是效率太低了,实际的生产环境中至少要设置到ack=1的机制。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
异步提交容易丢失数据,同步提交容易阻塞。
在这里插入图片描述
代码中实现的是异步+同步组合提交。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分区设置一致肯定能保证顺序执行,也可以设置业务key,key可以决定存储分区,同一个key的哈希值相同,存储分区也相同。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
👆正常拷贝,需要复制的次数太多了。
在这里插入图片描述
零拷贝 为👆 ,零拷贝指的是cpu不参与拷贝,用dma硬件参与拷贝而非cpu。
在这里插入图片描述

可靠性和持久化

  1. 数据存储机制
    Kafka 将消息存储在磁盘上,使用分区(Partition)来组织数据。每个主题(Topic)可以有多个分区,每个分区是一个有序的、不可变的消息队列。消息被追加到分区的末尾,并且每条消息都有一个唯一的偏移量(Offset)。
  2. 日志段(Log Segment)
    每个分区被进一步拆分为多个日志段(Log Segment),每个日志段都是一个单独的文件。日志段的大小可以通过配置参数 log.segment.bytes 来控制,默认大小为 1GB。当一个日志段达到配置的大小限制时,Kafka 会创建一个新的日志段。
  3. 数据持久化配置
    Kafka 提供了多个配置选项来控制数据的持久化行为:
    • a. 副本(Replication)
      Kafka 通过复制(Replication)来确保数据的持久性和容错性。每个分区可以有多个副本(Replica),其中一个是领导者(Leader),其他是跟随者(Follower)。所有的写操作都首先写到领导者,然后由跟随者复制。
      相关配置参数:
      replication.factor: 每个分区的副本数量。
      min.insync.replicas: 在生产者配置 acks=all 时,要求最少有多少个副本处于同步状态,才能认为写操作成功。
    • b. 日志保留(Log Retention)
      Kafka 提供了多种日志保留策略,可以根据时间或磁盘空间来控制日志的保留。
      相关配置参数:
      log.retention.hours: 日志保留的时间,默认是 168 小时(7 天)。
      log.retention.bytes: 日志保留的最大字节数。
      log.retention.ms: 日志保留的时间(以毫秒为单位)。
      log.segment.bytes: 单个日志段的最大大小。
    • c. 数据刷盘(Flush)
      Kafka 使用页缓存来提高性能,数据首先写入页缓存,然后定期刷入磁盘。你可以配置刷盘的频率。
      相关配置参数:
      log.flush.interval.messages: 在多少条消息后触发一次刷盘。
      log.flush.interval.ms: 在多长时间后触发一次刷盘。
  4. 数据恢复
    Kafka 在启动时会重建内存中的索引,以便快速定位消息。它通过检查日志文件和索引文件来确保数据的一致性。
    示例配置
    下面是一个示例的 Kafka 配置文件(server.properties),展示了如何配置持久化参数:
# 每个分区的副本数量
default.replication.factor=3

# 日志保留时间
log.retention.hours=168

# 日志保留大小
log.retention.bytes=1073741824

# 单个日志段的大小
log.segment.bytes=1073741824

# 刷盘间隔(消息数)
log.flush.interval.messages=10000

# 刷盘间隔(时间)
log.flush.interval.ms=1000

# 最少同步副本数
min.insync.replicas=2
  1. 数据持久化的工作流程
    消息生产:生产者将消息发送到 Kafka 代理(Broker),领导者副本接收消息并写入日志。
    消息复制:跟随者副本从领导者副本拉取消息并写入自己的日志。
    消息确认:当消息被写入到足够多的副本时,领导者副本向生产者发送确认。
    消息消费:消费者从分区中读取消息,使用偏移量来跟踪消费进度。
    通过以上机制,Kafka 确保了消息的可靠性和持久性,即使在代理崩溃或故障的情况下,消息也不会丢失。
### 字节跳动后端面试常见问题及答案 #### 数据结构与算法 对于数据结构与算法部分,常见的题目会涉及数组、链表、树、图等基本数据结构的操作和应用。例如: - **如何反转单向链表?** 反转单向链表可以通过迭代的方法来完成。定义三个指针分别指向当前节点 `current`、前一节点 `prev` 和下一节点 `next`。遍历链表的同时不断更新这三个指针的位置直到结束。 ```python def reverse_linked_list(head): prev = None current = head while current is not None: next_node = current.next # Store reference to the next node. current.next = prev # Reverse link direction. prev = current # Move 'prev' one step forward. current = next_node # Move 'current' one step forward. return prev # New head of reversed list will be last non-null value assigned to 'prev'. ``` 这种方法的时间复杂度为 O(n),空间复杂度为 O(1)[^1]。 #### 编程语言基础 编程语言基础知识也是考察的重点之一,特别是对 Java 或 Python 的掌握程度。比如: - **解释Python中的GIL是什么及其影响?** GIL (Global Interpreter Lock) 是 CPython 解释器的一个机制,在多线程环境中只允许一个线程执行 Python 字节码。这意味着即使有多个 CPU 核心可用,CPython 中的多线程程序也无法真正并行运行 I/O 密集型任务以外的任务。为了绕过这个限制,可以选择使用多进程或多线程库如 `concurrent.futures` 来处理计算密集型工作负载[^2]。 #### 后端技术栈 了解候选人所熟悉的后端框架和技术栈同样重要。可能会问到有关 RESTful API 设计原则的问题: - **什么是RESTful API? 它有哪些特点?** RESTful API 是一种基于 HTTP 协议构建网络应用程序接口的方式。其核心理念是利用标准 URL 表达资源位置,并通过 GET/POST/PUT/DELETE 方法操作这些资源。它具有无状态性、统一接口、分层系统等特点,使得客户端和服务端之间的交互更加简单直观[^3]。 #### 微服务架构 随着分布式系统的普及,微服务架构成为热门话题。可能被询问的内容包括但不限于: - **描述一下你在实际工作中是如何实现服务发现的?** 实现服务发现通常依赖于注册中心组件,像 Eureka, Consul 或者 Nacos 等工具可以帮助自动管理各个微服务实例的状态信息。当新的服务启动时,它们会向注册中心报告自己的存在;而其他需要调用该服务的应用则可以从注册中心查询最新的地址列表来进行通信。 #### 系统设计与优化 最后,针对大型互联网公司的职位申请者来说,系统设计方案的设计能力和性能瓶颈分析能力至关重要。例如: - **如果要搭建一个高并发的消息推送平台应该考虑哪些方面?** 构建高并发消息推送平台需关注几个关键因素:首先是选用合适的消息队列中间件 Kafka/RabbitMQ 等保障异步传输效率;其次是采用缓存 Redis/Memcached 减少数据库压力;再就是做好限流措施防止瞬间流量冲击造成服务器崩溃;另外还需要具备良好的水平扩展性和容错恢复策略以应对突发情况下的请求激增。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值