StarOj 测试版
时间:2023/11/26
网址:https://staroj.top
发布原因:
1.时间不等人。其实按照原计划打算等功能得到更好的完善后再去发布,奈何时间不等人,开发团队即将迎来考试大敌,无奈只能提前发布测试版供大家使用。
2.根据用户体验开发。这个版本放出的原因不仅仅是时间不够,更多的还是想要和用户做一个交互,根据用户的体验感和想法去修改完善剩下的部分。这样可以避免策划脑洞打开,影响用户体验。
3.测试性能。目前OJ的性能来说,开发团队已经对其优化了好几轮,光重构代码每个服务平均已经重写了3-7遍。优化效果上,我只能说:尽力了(内心吐槽:IDEA爆黄一个不放过的精神,将鄙人折磨的死去活来。网关鉴权,消息队列,负载均衡,异步优化将我虐待遍体鳞伤,各种小漏洞的崩溃让我猝不及防)
4.灵感缺失。从开始策划到现在已经三个月,从一开始的满眼期待,到现在的身心俱疲。作者感觉有很多地方不够满意,但是想到千万行代码还是一句能跑就行打消了念头。所以打算趁着考试时期好好休息一波,养足精神再进行优化。
开发吐槽
开发过程中其实有很多难以忍受的漏洞以及难题(不如说恶心事)。
1.就在昨日,鄙人从早上到晚上一直在遭受docker compose的打击,题目服务一直链接不到消息队列,明明在一个子网内但是死活不通。使用telnet测试,他们是互通的,让人崩溃到发狂,不断地查找漏洞。直到鄙人晚上吃饭回来后发现static,突然恍然大悟,原来是万恶的静态权限不够,查不到消息队列容器的地址。不得不说,细节真的很重要
2.本OJ采用的是微服务框架,那么微服务之间需要通信的,通信之间用什么最合适呢,很多了解过SpringCloud的小伙伴可能听说过OpenFeign,这是一个阻塞试的远程调用,而且存在高危漏洞,一开始我是不想用的,但是从生态上来说,用的人比较多,问题应该不是很大。直到写完鉴权逻辑后发现,IDEA爆黄警告,线程阻塞,在高并发的情况下会导致效率低下。这能忍?查一查解决方案:1.线程池 2.异步调用。于是乎,连夜重构逻辑,修改为了异步调用。
3.评测机的开发在网上的生态还是比较差的。我在做网站最初时期,搜了很多评测机的实现方案,其实大差不差都在说一个事:安全隔离,运行代码。具体方案呢?有的人建议是使用cgroups隔离环境,自己编写沙箱,也有的人建议直接使用docker动态拉取容器评测。这应该是网上大部分可行方案中最流行的两种。比较厉害的网站,如牛客,CF,力扣,青岛大学OJ,HOJ等,基本都是自主实现沙箱部分。鄙人不才,因时间,精力和能力实在有限,采用的后一种方案,直接使用docker动态拉取容器评测。可是方案不难想,实现起来确实麻烦的不能再麻烦了,更加困难的是没有开源案例(主要是不能抄,让CV战神落泪)。要解决的核心问题其实也不多,首先要解决docker与后端的交互问题,其次是在docker中运行一段代码并实现标准输入输出。经过千辛万苦终于实现这些功能后,发现前端与后端的响应时间是10S,也就是说,用户只是跑一个Hello World就需要等待10s,这样效率估计狗都不用。vert.x框架的设计思路给人眼前一新,异步实现-排查代码评测流程,将损耗时间过长的代码进行异步转移到另一个线程运行,这样就可以加速评测。效果确实很明显,从原来的10s变成了1s左右。很多人会问为什么要进行代码隔离?直接运行就好呗。你可以假设一下,如果用户提交了一个代码病毒,是不是会很危险。使用环境隔离后,即使提交病毒,也不会危害整个系统,只会将容器给感染。当然也不排除特殊的病毒,如蠕虫病毒,这种病毒危害性极大,即使是docker容器也是可以穿透感染外部系统的,但是在限制环境内,大部分的蠕虫病毒都无法完整运行,危害自然也就小了很多。如果有大佬真的要攻击的评测机,扛不住怎么办?不要废话,果断报警。
4.据目前状况来看,系统并没有优化到极致,后端的读取数据仍然还是从数据库内查找,效率非常低。虽然本系统使用了redis缓存,但没有发挥他的全部实力,仅仅将验证码功能与redis结合了起来。后续会将后端的读取数据转移到redis快速缓存中,并开启分布式集群部署。邮箱验证码那一部分的实现,说起来有些意外,因为最初实现完毕后,突然发现有一个惊天漏洞。后端生成验证码后,会将其存入redis缓存中,并通过邮箱发送给用户,但是存储到redis的只有key值和code。这意味着什么呢?就是说,如果用户自己先申请一套验证码,然后更换为别人的账号进行提交,那么就可以套层皮登录成功。细思极恐,于是,将key值与申请方进行绑定,每次提交的code与key都要验明身份才可放行。
5.页面问题确实很严重的,但是实属无奈,开发人员总共就两个,鄙人全栈,另一个后端,那么无奈之下,只能挑起大梁。寒假期间,鄙人会好好研习前端开发,给用户一个良好的体验感。说到这里,也非常希望有小伙伴可以加入星辰阁开发团队,大家一同开发星辰在线评测平台,共同成长,共同进步。
星辰社区招募
后端开发程序员
框架:Vert.x SpringBoot SpringCloud Golang
前端开发程序员
框架:Vue3 React Uniapp
运维程序员
框架:Kubernetes Docker Compose
软件开发程序员
框架:QT Qt Designer Android Studio PyQt
网络安全程序员
技术:Web渗透 逆向工程 密码学
人工智能训练程序员
诚邀各位小伙伴加入星辰社区,一起共创未来
星辰平台计划
starojv1.0.0
功能:在线代码评测,社区平台
starojv2.0.0
功能:考试功能,比赛功能,认证功能,积分模式,(软件待定)
后续功能策划努力设计中…