-
自我介绍
-
项目介绍 qps 数据量 缓存一致性?
-
qps
-
使用缓存: 将热点数据缓存在内存中,提高读取效率。
负载均衡: 使用负载均衡器(如 Nginx)分配请求,避免某一节点过载。
异步处理: 对非关键性任务进行异步处理,降低主线程压力。
限流与降级: 设置请求限流策略,防止流量暴增导致系统崩溃。
-
-
缓存一致性
-
缓存更新策略:
- 主动更新(Write-Through): 数据更新时,同时更新缓存和数据库。
- 延迟更新(Write-Behind): 数据更新时先写缓存,延迟写数据库。
- 失效淘汰(Cache Eviction): 定期让缓存数据失效,强制从数据库中读取最新数据。
分布式锁:
- 对关键资源加分布式锁(如 Redis 的分布式锁),确保同一时刻只有一个进程能更新缓存。
双写一致性:
- 更新时同时写入缓存和数据库,但需要确保两者操作具有事务性。
-
- dubbo 负载均衡有哪几种?如果你来实现这几种怎么做?具体算法
- Dubbo 的负载均衡策略
- Random (随机)默认策略,根据权重随机选择一个提供者。
- RoundRobin (轮询),按照权重设置轮询调用,确保每个服务实例被均匀调用。
- LeastActive (最少活跃调用数)
- ConsistentHash (一致性哈希), 同一个请求(如同一个参数值)会始终发往同一个服务实例。
-
rocketmq和kafka的选型 区别?
-
选型建议:
如果系统需要高吞吐量、持久化存储和大数据生态支持,选择 Kafka。
如果系统需要复杂路由、低延迟和可靠消息传递,选择 RabbitMQ。
-
选择 Kafka 的场景
大数据处理: 日志聚合、事件流分析、实时数据管道(如 Spark Streaming)。
高吞吐场景: 每秒需要处理百万级消息。
消息持久化与回放: 需要重放历史消息(如事务重试)。
分布式系统: 构建扩展性高的流处理架构。
选择 RabbitMQ 的场景
微服务通信: 系统间可靠的消息传递与解耦。
任务队列: 异步任务处理,尤其是复杂路由规则的任务分发。
低延迟应用: 需要快速响应的实时系统(如订单处理)。
事务一致性: 对消息可靠性和事务性有严格要求。
- kafka吞吐量为什么大?
顺序写入磁盘:降低了 I/O 的开销
零拷贝机制:直接将数据从磁盘传输到网络缓冲区,而无需将数据复制到用户空间
批量处理:减少了每条消息的网络请求和 I/O 次数
分区并行处理:水平扩展机制使得吞吐量随分区数量增加而线性提升
- Linux零拷贝讲一下?
- 传统数据传输流程
- 从磁盘读取文件到内核缓冲区:
- 调用
read()
,将数据从磁盘加载到内核缓冲区。
- 调用
- 将数据从内核缓冲区拷贝到用户空间:
- 操作系统将内核中的数据复制到用户程序的缓冲区。
- 将数据从用户缓冲区写入到内核网络缓冲区:
- 调用
write()
,将用户程序缓冲区的数据拷贝到内核中的 Socket 缓冲区。
- 调用
- 从 Socket 缓冲区发送到网卡:
- 最后,内核将 Socket 缓冲区中的数据传递给网卡,发送到目标设备。
- 零拷贝的数据传输流程
-
从磁盘读取数据到内核缓冲区:
- 内核直接将数据加载到缓冲区中。
-
直接将数据从内核缓冲区发送到网卡:
- 使用零拷贝技术,数据不需要拷贝到用户空间,而是通过操作系统的机制直接从内核缓冲区传输到网卡。
-
partition和consumer对应关系
Kafka 中的 partition 和 consumer 的关系主要通过分区分配策略决定。
一个分区只能被一个消费者线程消费,而一个消费者可以消费多个分区。
选择分区数量和消费者数量时,需要根据业务需求和吞吐量合理设计,以实现负载均衡和高效消费。
-
kafka怎么保证消息不丢失?
-
如果副本间同步 突然挂了怎么办?这时候的消息丢失怎么办
-
你们分库分表怎么做的?动态扩容怎么做?具体双写逻辑讲一下? 增删改查都说一下?
-
线程池核心参数 线程池怎么关闭超过keepalived 的线程?threadlocal 的原理 threadlocalmap的key是什么?
-
MySQL索引,聚集索引和非聚集索引?具体讲讲叶子节点存储的具体区别?