在线考试系统架构设计
在線考試系統需求:
1. 將線下考試轉移到線上進行,包括學生登錄、進入試卷頁面、答題、交卷等關鍵環節;
2. 試題要涵蓋普通考試絕大部分題型,包括但不限于單選題、多選題、判斷題、簡答題、英語閱讀題、英語聽力題等,復雜公式題可以提交圖片答案;
3. 有限預算內,盡可能滿足多人同時在線考試。
需求分析:
1. 各種題型的實現,需要收集各種題型,總結得出相同的題型模板
2. 提交圖片答案,有兩種提交點,一是在交卷時一并提交,二是考試中ajax異步提交,很明顯,多人同時在線考試,一般都會在最后的幾分鐘交卷的人最多,會對服務器造成很大的負荷,所以這里就選擇在考試中提交圖片答案。
3. 多人同時在線考試
因為考試是有考試時間段的,進入考試以及交卷,這兩個時間點都有可能造成高并發的請求,緩解這兩個點的壓力,無疑是提高在線考試系統能承受同時考試的人數最有效的手段。
進入考試時,需要獲取試卷數據,如果全都從數據庫獲取,那對服務器的壓力是很大的,如果將試卷數據放在緩存中,將有效的解決這個問題;
交卷時,不僅需要對學生答案進行入庫操作,還要對題目做各種操作,比如記錄題目的PV,正確率等,如果做完這些才返回,肯定會占用很大的服務器資源,不如,將答案數據放到消息隊列rabbitMQ中,然后響應學生的交卷請求,在另一個服務器中,讀取rabbitMQ中的答案消息,再進行入庫及相關操作。
架構設計:
學生進入考試,如果redis中有試卷緩存,則直接讀取緩存
如果redis緩存中沒有,則讀取MySQL中的試卷數據,并存一份到緩存中,下一個學生進入試卷時,就可以獲取緩存中的試卷數據了
?
考試中提交圖片答案,這里選擇提交到阿里云oss,進一步提高在線考試系統最大負載量
?
交卷時,直接將答案數據放到rabbitMQ中,然后在另一個服務器中,獲取答案消息進行入庫以及相關操作。答案數據,有這些特點:量大、讀多、改少,基于這樣的特點,MongoDB是個不錯的選擇。
架構也僅是停留在思想的層面,真正的實踐還是需要手撕代碼
涉及的技術棧:Redis、MySQL、RabbitMQ、MongoDB、阿里元oss
之前的文章有介紹golang簡單操作Redis、MySQL、RabbitMQ、MongoDB、阿里元oss
以上架構談不上最佳,但對與中小企業來說是個不錯的選擇
真正的實踐中還是會遇到各種問題的,比如外網訪問存在阿里云oss的資源是需要消耗流量的,訪問很多的話會費不少預算,不過也是有解決辦法的,oss+cdn就是個不錯的選擇;再比如,rabbitMQ的消息可靠投遞,確認消費,怎么在速度與安全之間取舍
高手過招,點到為止,還意猶未盡的,可在評論區留言
總結
以上是生活随笔為你收集整理的在线考试系统架构设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php程序员 软考考什么好,软考考什么好
- 下一篇: 学校一键报警系统