自学内容网 自学内容网

面试241228

面试可参考
1、cas的概念 2、AQS的概念 3、redis的数据结构 使用场景
不熟
4、redis list 扩容流程 5、dubbo 怎么进行服务注册和调用,6、dubbo 预热 7如何解决cos上传的安全问题kafka的高并发高吞吐的原因ES倒排索引的原理
spring的 bean的 二级缓存和三级缓存
spring的 扩展机制类加载器有哪些mysql索引下推8如何设计登录方案时提到了安全性、稳定性、扩展性,但问到具体怎么做(比如加密算法、评估用户量等

类加载器

mysql索引下推

示例

假设有以下表和索引:

CREATE TABLE employees (
    id INT,
    name VARCHAR(50),
    age INT,
    salary DECIMAL(10, 2),
    INDEX idx_age_salary (age, salary)
);

查询条件如下:

SELECT * FROM employees WHERE age > 30 AND salary > 50000;

在没有索引下推的情况下,MySQL可能会先通过idx_age_salary索引找到符合age > 30的记录,然后再通过回表查找salary > 50000的记录。

如果开启了索引下推,MySQL会将age > 30salary > 50000的条件都下推到索引扫描阶段,从而减少了回表操作和不必要的数据读取。

索引下推的工作原理

  1. 索引扫描阶段

    • 当MySQL查询条件中的一部分可以直接通过索引进行过滤时,查询优化器将这些过滤条件下推到索引扫描阶段。
    • 优化器在扫描索引时,根据索引列的条件直接过滤不符合条件的行。
  2. 结果返回

    • 只有符合条件的索引行被返回,避免了全表扫描。
    • 如果索引覆盖了查询的所有字段,查询结果就直接返回;如果不完全覆盖,可能还是需要回表。

开启和查看索引下推

  1. MySQL 5.6及以上版本支持索引下推。如果你的数据库版本是5.6或更高版本,索引下推通常是默认开启的。

EXPLAIN SELECT * FROM employees WHERE age > 30 AND salary > 50000;
  1. EXPLAIN输出中,如果启用了索引下推,会在Extra列看到类似Using index condition的字样,表示查询条件已经被下推到索引扫描阶段。

总结

  • **索引下推(ICP)**是MySQL优化器的一种优化技术,能够将查询条件部分下推到索引扫描阶段,减少不必要的回表操作,提高查询效率。
  • 它适用于MySQL 5.6及以上版本,尤其在使用覆盖索引时最为有效。
  • 通过EXPLAIN可以查看索引下推是否被启用。

 

kafka的高并发高吞吐的原因

my

1,写入:顺序写入 / 批量写入

2,架构:

分区,每个分区可以独立地进行并发读写。

分布式存储:Kafka 的数据分布在多个服务器上,每个分区的副本(Replica)也分布在不同的节点上,提供了良好的负载均衡和容错能力。

3,高效的网络传输:

零拷贝:零拷贝可以避免数据从内核空间到用户空间的多次拷贝,减少了 CPU 和内存的消耗,提高了吞吐量。

4,消息压缩

生产者可以将多个消息压缩成一个更小的消息包,传输时会减少带宽的消耗

Kafka 的高并发和高吞吐量是其在大规模分布式消息系统中广泛使用的关键原因之一。Kafka 通过以下几个核心设计和机制,能够提供非常高的吞吐量和并发处理能力:

5,内存和磁盘缓存

6. 消费组和消息顺序

7,后台流控和异步处理

  • 异步生产者:Kafka 的生产者是异步的,生产者将消息写入缓冲区后立即返回,而不需要等待服务器确认消息已写入。这使得生产者可以高效地处理大量消息。
  • 批量写入与确认:Kafka 通过批量提交确认消息,并且支持批量处理,减少了网络和磁盘操作的次数,提升了吞吐量。

Kafka 支持 消费组(Consumer Groups),使得多个消费者可以并行地处理不同分区的数据

1. 基于顺序写入的磁盘设计

Kafka 的高吞吐量主要得益于其顺序写入和磁盘设计。

  • 顺序写入:Kafka 在磁盘上顺序写入数据(append-only),这种操作比随机写入更高效,特别是在现代硬盘(HDD 或 SSD)上。顺序写入减少了磁盘寻址的开销,从而显著提高了吞吐量。
  • 批量处理:Kafka 在写入日志时会使用批量处理的方式(即将多个消息合并成一个批次进行写入),减少了每个请求的 I/O 次数,提高了写入性能。

2. 分布式架构与分区机制

Kafka 将数据分散存储在多个 分区 中,每个分区可以独立地进行并发读写。

  • 分区(Partitioning):Kafka 将每个 topic 划分为多个分区,每个分区是一个独立的日志文件,允许多个消费者并行读取。生产者可以将消息按分区键分配到不同的分区,消费者可以并发处理多个分区的数据,这大大提高了并发能力。
  • 分布式存储:Kafka 的数据分布在多个服务器上,每个分区的副本(Replica)也分布在不同的节点上,提供了良好的负载均衡和容错能力。

3. 高效的网络传输

Kafka 的传输协议基于高效的 零拷贝技术批量发送,使得消息的传输更加高效。

  • 零拷贝(Zero-copy):Kafka 使用操作系统的零拷贝技术来提高数据传输效率。零拷贝可以避免数据从内核空间到用户空间的多次拷贝,减少了 CPU 和内存的消耗,提高了吞吐量。
  • 批量传输:Kafka 在生产者和消费者之间使用批量传输,即一个请求中可以包含多个消息。这样可以减少网络请求的次数,降低了网络延迟,提高了吞吐量。

4. 消息压缩

Kafka 支持消息压缩,生产者可以将多个消息压缩成一个更小的消息包,传输时会减少带宽的消耗,从而提升吞吐量。

  • 支持的压缩算法包括 GZIP、Snappy 和 LZ4,这些压缩算法能够在提供合理压缩率的同时,保持较高的性能。
  • 消息压缩不仅减少了带宽使用,还能减轻存储负担,因为消息在磁盘上的存储空间也减少了。

5. 内存和磁盘缓存

Kafka 在内存中缓存大量的消息,这样可以避免频繁的磁盘 I/O 操作,从而提高吞吐量。

  • PageCache:Kafka 使用操作系统的 PageCache(操作系统内存缓存)来提高磁盘读取的效率。Kafka 将数据先写入内存,然后异步地刷新到磁盘。
  • 内存缓冲区:生产者和消费者端都有内存缓冲区,用于存放未写入磁盘的数据或从磁盘读取的消息。内存的高效使用有助于降低延迟,提高吞吐量。

6. 消费组和消息顺序

Kafka 支持 消费组(Consumer Groups),使得多个消费者可以并行地处理不同分区的数据。每个消费组中的消费者负责处理一个或多个分区,避免了消费者之间的竞争,提高了并发性能。

  • 每个消费者组只处理自己分配的分区,消息消费过程中保持分区内的顺序,这确保了高并发情况下的数据一致性。

7. 高可用性和容错

Kafka 的高可用性和容错性也间接支持了它的高吞吐量。

  • 副本机制:Kafka 使用 副本(Replication) 来确保数据的高可用性和容错性。每个分区有多个副本,其中一个副本是领导者(leader),其他副本是追随者(follower)。生产者和消费者只与领导者节点进行交互,这样可以避免对多个副本的频繁访问,提高吞吐量。
  • 自动故障切换:当领导者节点宕机时,Kafka 会自动选举新的领导者,并且生产者和消费者可以继续处理数据,无需停机,保证了高可用性。

8. 后台流控和异步处理

Kafka 采用 异步处理流量控制,生产者和消费者不必直接阻塞等待操作完成,极大提高了系统吞吐能力。

  • 异步生产者:Kafka 的生产者是异步的,生产者将消息写入缓冲区后立即返回,而不需要等待服务器确认消息已写入。这使得生产者可以高效地处理大量消息。
  • 批量写入与确认:Kafka 通过批量提交确认消息,并且支持批量处理,减少了网络和磁盘操作的次数,提升了吞吐量。

9. 可靠的消息传递语义

Kafka 提供 至少一次(at least once)精确一次(exactly once) 的消息传递语义,确保数据可靠传输,同时通过高效的确认机制和复制机制,保证数据在高并发场景下不会丢失。

  • 分区复制:每个分区有多个副本,数据会在多个副本之间同步。当主副本失败时,副本可以接管,保证了数据不丢失。

总结

Kafka 的高并发、高吞吐量性能主要得益于以下几个方面:

  1. 顺序写入磁盘,减少磁盘 I/O 开销。
  2. 分区与分布式架构,支持并行处理和扩展性。
  3. 高效的网络传输和零拷贝技术,减少数据传输的开销。
  4. 消息压缩,减少带宽和存储需求。
  5. 内存缓存和后台异步处理,加速数据处理。
  6. 消费者并行处理,优化并发性能。
  7. 副本机制,提高可用性和容错性。

通过这些设计和优化,Kafka 能够在处理高并发、高吞吐量的场景下,保持高效和可靠的数据传输。

如何解决cos上传的安全问题

校验:文件格式/大小

限流:调用频率

权限控制 密钥

AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);

dubbo 怎么进行服务注册和调用

redis list 扩容流程

如何设计登录方案时提到了安全性、稳定性、扩展性

滑块防刷 验证码:使用CAPTCHA或reCAPTCHA防止暴力破解攻击。
密码加密 md5+加盐         String password = DigestUtils.md5DigestAsHex((pwd + SIGN).getBytes());

登陆次数,加入黑名单
用户量:分表

缓存:token缓存
架构:用户/登陆中心/权限中心
高并发:短信/日志

https

redis的数据结构 使用场景


原文地址:https://blog.csdn.net/C18298182575/article/details/144787349

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!