项目经历
技能清单
自我介绍
有比较丰富的redis使用场景,还有就是之前项目上面强依赖于netty,所以我也研究过netty的源码
聊聊你印象最深刻的项目,或者做了什么优化
聊聊项目,好的设计,好的代码
项目的话,你可以聊聊你平时做的项目,尤其有亮点的项目。如果没有什么特别亮点的项目,也可以说说一些好的设计,或者你优化了什么接口,性能提升了多少,优化了什么慢 SQL 都可以。甚至是一些好的代码写法都可以。
QPS和TPS?
TPS就是事务,一个请求处理包含2条insert和1条update,那么TPS为1,QPS为3
什么是QPS?
Queries Per Second,意思是每秒查询率。就是每秒的查询数,对数据库而言就是数据库每秒执行的 sql 数( insert、select、update、delete 等)
如下图:系统服务器向MySql服务器发送了一条sql,对于MySQL服务器来说,QPS为1(一秒内)
TPS:
tps(transactions per second)每秒事务数。以 commit 成功次数为准。
如下图,系统服务器中的一个请求处理向Mysql发送了2条insert和1条update,并成功执行了commit(1秒内),则对于MySQL服务器来说,TPS为1,QPS为3。
如何解决大文件上传问题
试想一个,你想上传一个 5g 的视频,上传进度到 99% 的时候,特么的,突然网络断了,这个时候,你
发现自己竟然需要重新上传。我就问你抓狂不?
有没有解决办法呢? 答案就是:分片上传!只需要先将文件切分成多个文件分片,然后再上传这些小的文件分片。前端发送了所有文件分片之后,服务端再将这些文件分片进行合并即可。使用分片上传主要有下面 2 点好处:
- 断点续传 :上传文件中途暂停或失败(比如遇到网络问题)之后,不需要重新上传,只需要上传那
些未成功上传的文件分片即可。所以,分片上传是断点续传的基础。 - 多线程上传 :我们可以通过多线程同时对一个文件的多个文件分片进行上传,这样的话就大大加快
的文件上传的速度。
延时任务处理场景
基于JVM的JDK 延迟队列 DelayQueue;
RabbitMQ
RocketMQ
日常开发中,我们经常遇到这种延时任务处理场景,如:
- 外卖订单超 30 分钟未支付,则自动取订单;
- 用户注册成功 15 分钟后,发短信息通知用户等等。
- 到期自动收货
- 超时自动退款
在电商,支付等系统中,一设都是先创建订单(支付单),再给用户一定的时间进行支付,如果没有按时支付的话,就需要把之前的订单(支付单)取消掉。如何实现这种自动关单的需求?
①通过定时任务关闭订单:写一个定时任务定期扫描数据库中的订单。
不推荐,由于定时任务扫描的间隔是固定的,所以可能造成一些订单已经过期了一段时间才被扫描到,订单关闭的时间比正常时间晚一些。
②延时队列:
- 在rabbitmq中不存在延时队列,rabbitmq都是通过设置消息的过期时间和死信队列来模拟出延时队列。
- JDK 延迟队列 DelayQueue。这种方式不依赖任何第三方组件,是JDK自带的,但是由于DelayQueue 基于 JVM 内存,如果 JVM 重启了,那所有数据就丢失了。而且如果放入的数据过多,会造成JVMOOM。所以它只适合数据量较小,且丢失也不影响主业务的场景,比如内部系统的一些非重要通知,就算丢失,也不会有太大影响。
- RocketMQ 的延迟队列。RocketMQ是支持延时队列的。在订单创建之后,我们就可以把订单作为一条消息投递到 rocketmq,并将延迟时间设置为 30 分钟,这样,30 分钟后我们定义的 consumer 就可以消费到这条消息,然后检查用户是否支付了这个