编辑
2024-04-25
后端
00
请注意,本文编写于 380 天前,最后修改于 380 天前,其中某些信息可能已经过时。

目录

三个维度问题
单机50w长连接优化方案
你会选择Java还是Golang?
经验
自己的一些思考
Mysql五张表Join优化
经验
自己的思考
Mysql慢查询优化
经验
自己的一些思考
Redis分布式锁实现

自我介绍

......

三个维度问题

单机50w长连接优化方案

你会选择Java还是Golang?

对于实现单机50万个长连接的需求,我会倾向于建议使用 Go(Golang)来实现。

以下是我选择 Go 的几个理由

  • 高并发能力:Go 是一门以并发为核心设计的编程语言,具有出色的并发能力。Go 使用轻量级的 Goroutine 和通道(Channel)机制来实现并发,这使得在 Go 中处理大量并发连接变得非常高效和简单。对于长连接场景,Go 的并发模型能够轻松应对大量的连接管理和消息处理。

  • 高性能:Go 语言的运行时和编译器经过优化,具有出色的性能表现。Go 的协程调度器(Goroutine Scheduler)能够有效地管理大量的 Goroutine,并实现高效的上下文切换。这使得 Go 在处理高并发场景时表现出色,能够提供低延迟和高吞吐量的长连接服务。

当需要实现单机50万个长连接时,我会建议使用 Netty 来实现。

以下是我选择 Netty 的几个理由:

  • 高性能和可扩展性:Netty 是一款高性能的、事件驱动的网络编程框架,专注于提供快速、可扩展和低延迟的网络通信。它的设计和优化使其非常适合处理大规模的并发连接。对于需要处理大量长连接的场景,Netty 的性能表现往往优于传统的 Servlet 容器,能够更好地满足高并发和低延迟的需求。

  • 灵活的编程模型:Netty 提供了一种灵活的、基于事件驱动的编程模型,使开发者能够对网络通信进行细粒度的控制。它提供了一组强大的抽象和组件,例如 Channel、EventLoop、ChannelPipeline 等,可以自由地构建和定制网络应用程序。这种灵活性使开发者能够根据具体需求进行优化和定制,以实现更高效和可扩展的长连接处理。

  • 多协议支持:Netty 不仅支持 WebSocket,还支持其他多种网络通信协议,例如 TCP、UDP、HTTP 等。这意味着你可以在同一个应用程序中处理不同类型的连接和通信,使得系统更加灵活和多样化。

  • 成熟的生态系统和社区支持:Netty 是一款广泛使用的开源框架,拥有庞大的用户社区和活跃的开发者社区。这意味着你可以获得丰富的资源、文档和支持,以解决开发过程中遇到的问题或挑战。

经验

石墨文档50长连接

小爱120w长连接

亿级长连接

服务器参数

tcp参数调优

tcp参数

tcp调优

自己的一些思考

那时候紧张没有答得很好,其实按本人的知识储备,至少该答到一下几点

  • 长连接复用
  • linux最大句柄65535解除
  • eBPF进行数据传输优化,比如XDP
  • NIO优化,零拷贝
  • 死链接清除
  • 连接池复用

Mysql五张表Join优化

经验

mysql多表查询优化

多表查询优化

自己的思考

还是跟前一个问题一样,别被问题吓住,一步一步思考,首先至少要想到以下几点,以本人的知识储备

  • 首先是小表驱动大表(面试官明显表示了两张大表一张小表,这点没答到很可惜)
  • 然后是索引优化
  • 最后是尽量只查询需要的字段,不要*
  • 设置join_buffer

Mysql慢查询优化

经验

慢查询优化

慢查询优化

查询优化

慢查询定位优化

手写strace

strace原理

tracee

自己的一些思考

这个也有很多没答到的地方,首先是慢查询日志,和explain自己试,最基本的,然后就是strace蒙混过关 还问了个strace,不是很清楚只能答eBPF,分析表空间文件,面试官好像挺惊讶

  • strace/ebpf等,对mysql进程进行监控
  • 慢查询日志
  • mysql监控、Prometheus + Grafana等
  • 优化就建立合适索引,精简SQL

Redis分布式锁实现

这个几乎就讲了一下Redission分布式锁实现原理然后水了一下

结果

OC但是不去,感觉面试官应该是属于比较好的那种,一点八股没问

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!