在线判题项目 笔记
项目 历时五天,OJ项目也完成啦!目前是跟着鱼皮哥从0到1实现了一遍,先上图看下效果。
感受:
OJ项目相比于之前的项目,让我感觉到细节点更多,可能稍微不注意,某个数据就没有填充上,特别是Dokcer实现代码沙箱模块,很多方法都是异步的,要做好等待的问题,例如获取内存占用大小这块。
开发过程总结:
-
因为项目采用了很多设计模式,模板方法 策略模式 静态工厂等,所以很多时候看业务层代码,需要跳转到其他的类中,所以我在跑通整个业务流程的时候,进行多次debug测试,帮助我更好的理解了代码的执行流程,同时也更好的感受到设计模式的魅力所在(尤其是模板方法,使用后再来看代码,真的是舒服太多)。
-
对于题目和判题模块,更多的是需要注意一些实体类的问题,虽然只有两个表,但是创建的model层的类还是比较多的。
-
对于代码沙箱,虽然是第一次尝试docker-java,但好在是跟着视频,问题还不算太多,但是一定要注意异步的问题,以及回调函数的实现,否则像内存占用或者输出结果可能会获取不到。
-
整个项目又一次学习到了库表设计的能力(库表设计,不得不说确实相当重要,当把库表设计好后,很多业务逻辑也会自动的串起来了),对于同类产品的调研以及时序图的画法。
后续计划:
-
将项目是使用微信云托管部署下,感受下持续化开发(之前实践过一次,确实gitee变化,流水线自动重新部署了,有点神奇,😄)
-
实现题目的通过数,通过率的查看
-
结合AI实现下代码沙箱
-
结合学到的JVM,实现下简单的性能优化,了解下反向压力的东西(其实博客有看过一些,但是都没见怎么实现,只讲了理论🧐)
5.优化下前端。
最后,等完成了再给大家分享下,拜拜😁
评论
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
各位同学好,在做 OJ 项目,做到了 java 操作 docker,遇到了这个问题卡住了。自己目前做过以下修改,添加netty 依赖,想使用 netty 代替 Jersey HTTP 失败。尝试linux上添加 配置文件也是失败。 卡了好久,谢谢各位老师。
3
请问一下,OJ 项目的 rabbitMQ ,之前电脑装过 3.11.10版本,看到课程中使用的是 3.12.4 的版本,请问我如果不换还是使用之前的版本是否可行?
0
请问一下老师,在OJ 项目中,权限拦截那 使用的是: Spring Cloud Gateway 的 Filter 请求拦截器(内部接口拦截) + (可以进行扩展的 JWT token 实现)。我想根据目前学到的知识,这样做是否可以: Spring Cloud Gateway 的 Filter 请求拦截器 (内部接口拦截) + @AuthCheck 自定义注解 + AOP 切面这种方法
1
有大佬帮忙远程布局部署一下鱼皮的oj判题系统吗?有偿
1
OJ在线判题系统(一)
3
作者分享
终于拿到鱼厂周边啦!
记录一下😃
18
面试题 | 02 | 非面经,纯分享,辩证看待答案。
#面试题#
压力山大的问题:
可以讲下API签名认证的流程吗?
(感觉这种流程题,如果是线下面试,是不是拿出纸,画出流程图给面试官看更好些)
找工作的我:
好的,那其实签名认证的话,它主要是为了保证接口的安全性,防止一些需要成本的,例如使用到AI的API的这种的,万一被攻击,会导致资源被大量消耗。
那API签名认证的话,它涉及到五个参数,首先两个是accessKey和secretKey,它们类似于公钥和密钥,那这个的信息的话,只能让对应的用户看到。
第三个参数的话是sign,标签,我在项目中是采用实现一个工具类去制作的,是用的secretKey 、请求参数和签名算法(MD5)然后生成一个sign1,然后客户端会把这个accessKey 和请求参数一起发送到服务端,那服务端会根据accessKey去数据库查询这个secretKey,接着还是利用刚才提到的工具类去生成sign2,最后比较sign1和sign2是否相同,相同,则说明请求参数没有被篡改。
那其实一般到这里就算基本的流程了,但是为了防止被攻击重放,还需要第四个参数,nonce,我们会在每次请求中生成一个随机的nonce,将这个nonce存入redis中,并设置好TTL,那么往后的请求过来的时候,跟redis中的nonce进行比较,如果一样的话则拒绝请求,如果不存在,才放行请求,那这样的话就可以解决重放的问题。
但是如果说这个攻击者它等到redis中的nonce过期后再进行重放,那它又可以请求成功。对于这种情况,就得使用到第五个参数,timestamp时间戳,假设我们定义的时间戳是一分钟,那服务器只能接收一分钟内的时差请求,那我们在redis设置的nonce的TTL略大于一分钟即可。这样请求重放过来,如果在一分钟内的,因为nonce存在,无法放行。如果请求大于一分钟的,因为超过了一分钟时差的规定,也无法放行。至此,API签名认证所有流程就算完毕了。
13
面试题打卡 | 01
#面试题# 分享
大家好,我是影子。
最近在准备面试题的东西,之前也不断的了解过八股的记忆方式。
个人感觉比较好的方法如下:
1. 通过先了解原理或者答案,同时实践一遍,正所谓好记性不如烂笔头,实践一遍的时候,对于很多细节也能把控住。
2. 对于一个问题,不要仅限于表面,当问题问到A的时候,试想自己是面试官的话,接下来会怎么问这个问题相关的,而不是,对于一个问题,背完就结束,那么稍微问深一点九接不住了。
3. 也是我个人比较喜欢的。 对于多个相关的问题,学习后,整理为一整篇答案,因为很多问题,其实还是可以联系起来的,后面就是通过上下联系的方式,将全部梳理出来,类似于跟别人讲解,当自己能讲出来的时候,这个题,百分之80已经掌握了,剩下的就是偶尔多看看,加深记忆。
本次,以Redis的问题作为分享,因为基本都是自己的口语化方式,模拟跟面试官的对话,当然,如果是大厂的深度拷问,肯定不够用,纯属打卡分享,哪里有误还望大家指出。
压力山大的问题:
redisson实现的分布式锁能解决主从一致性的问题吗?
如果业务非要保证数据的强一致性,这个该怎么解决呢?
能介绍一下redis的分布式锁的相关知识吗?
.....| 自行补充
找工作的我:
好的,因为在分布式的场景下,一个服务被部署到多个服务器上,那么在并发的情况下,可能导致一个任务被多次执行。那像我们在单机使用的锁,例如syscornized lock锁,就没法解决这个问题。那么,就需要使用到分布式锁。
分布式锁的实现有很多方式,例如redis的setnx命令,这个命令是存入一个key value,如果存入成功,则返回一个1。如果已经有这个key了,那么返回0,存入失败,并且结合lua脚本去实现。但是通过这个方式实现会有很多问题。第一个是流程会比较复杂,成本高。第二个是它的不可重入问题,第三个是它的不可重试问题,第四个是它的超时无法自动续期问题,第五个是主从一致问题。
那基于这些问题,我在项目中采用的是redisson。redisson很好的基于redis去解决了很多分布式的问题,例如分布式限流 分布式锁等等。
首先是不可重入的问题,因为它的底层是一个可重入锁,底层的流程是如果有请求过来,先判断是否已经存入线程号,如果没有,则直接获取锁,如果有,那么判断是否是同一个线程号,如果不是,则直接拒绝。如果是,则给redis中的value值加一,然后重置TTL。那么释放锁的话同样的,给value值减一,直到value为0释放锁,让其他的线程去获取锁。
那第二个的话是不可重试问题,我们使用Redisson的时候,可以定义一个时间,当一个线程获取不到锁的时候,让它不断的自旋进行尝试,直到时间到了,才停止尝试获取。
那第三个的话是不可自动续期问题,redisson中有一个看门狗机制,我们可以在代码中将trylock这个方法中将参数设置为-1,则算开启了这个看门狗机制,那这个机制的话,可以保证我们的业务完整执行,不会说因为当TTL结束后,锁就自动释放了,那具体的话我在实践中看到的是,给的时间是默认30秒,当到达三分之二的时间的时候,就会自动续期。直到我们的业务完整的执行完再释放锁。
那最后的话是主从一致的问题。因为我们底层使用的setnx的命令,那当我们获取到锁的时候,它是写入主节点的,但是因为主节点是异步复制到从节点,那如果说此时主节点宕机了,而线程一获取到锁后又没有释放锁,从节点也没有同步信息。 同时,从节点中会选举一个作为主节点。此时线程二来获取锁,则会获取成功,最终导致出现了一把锁两个线程获取,这是不合理的。
那解决的方式的话,我们可以使用mulitlock这个多重锁,使用这个锁的话,必须保证所有节点都成功的写入获取锁的线程信息后,才算获取成功,那这样就避免了因为redis多节点信息不一致导致的多个线程获取同一把锁的情况。
14
手写 RPC 框架 笔记
11
手写 RPC 框架 笔记
18

