我們繼續告訴你我們破壞伺服器的雷射任務是如何安排的。 從上一個開始
遊戲後端總共有 6 個架構單元,我們將在本文中進行分析:
- 負責遊戲機制的遊戲實體後端
- VPS 上的後端和站點資料交換匯流排
- 從後端請求(遊戲元素)到 Arduino 和現場硬體的轉換器
- Arduino負責控制繼電器,接收翻譯器的命令並進行實際工作
- 實際裝置:風扇、花環、落地燈等。
- 前端 - Falcon 網站本身,玩家可以從中控制設備
遊戲實體後端
後端是作為 Spring Boot 應用程式實現的:它有幾個休息控制器、一個 Websocket 端點和具有遊戲邏輯的服務。
只有三個控制器:
- 威震天。 目前的威震天頁面是透過 GET 請求發送的:打開電源之前和之後。 雷射透過 POST 請求發射。
- 映射波形符頁面,以便透過頁面名稱提供它們。 Tilde 產生的匯出頁面不包含原始名稱,而是包含內部 ID 和合規性資訊。
- 驗證碼控制器為偽高負載伺服器驗證碼提供服務。
Websocket 端點用於控制小工具:燈、花環和字母。 它被選擇向所有玩家同步顯示設備的當前狀態:是否開啟或關閉、是否處於活動狀態、目前在牆上點亮的字母是什麼顏色。 為了使開啟雷射的任務變得更加困難,我們使用相同的登入名稱和密碼 admin/admin 新增了對花環和雷射的授權。
玩家可以透過打開花環並用雷射重複相同的操作來測試它。
我們選擇這樣簡單的登入密碼對是為了避免不必要的選擇來折磨玩家。
為了讓任務變得更有趣,來自 mongodb 的物件 ID 被用作房間中的裝置識別碼。
ObjectId 包含一個時間戳記:兩個隨機值,其中一個是根據裝置識別碼取得的,第二個是根據產生它的進程的 pid 和計數器值取得的。 我想讓標識符定期生成並使用不同的 pid 進程,但使用通用計數器,這樣雷射設備標識符的選擇會更有趣。 然而,最終,每個人都從僅計數器值不同的標識符開始。 這可能會使該步驟過於簡單,不需要分析 objectId 結構。
後端請求的翻譯器
該腳本連接到 RabbitMQ 佇列並將請求從佇列傳輸到 Arduino。 它也實現了平行燈開關的邏輯:與一些設備一起,它們上的燈被打開,例如,當威震天最初供電時,它被舞檯燈照亮。 整個場景的攝影燈光設計是一個單獨的故事,講述了我們的項目聯合製片人和製作設計師 Ilya Serov 的偉大工作,我們將在另一篇文章中講述它。
翻譯人員還負責使用計時器啟動碎紙機並將影像傳輸到電視的邏輯:啟動碎紙機的計時器、尖叫的水豚、遊戲結束時的廣告。
產生威震天令牌的邏輯是如何建構的
試拍
每 25 秒產生一個新令牌,可用於以 10/10 功率開啟雷射 255 秒。 連結到
然後雷射冷卻 1 分鐘 - 在此期間它不可用且不接受新的射擊請求。
這種力量不足以燒斷繩子,但任何玩家都可以發射威震天並看到雷射光束的作用。
MD5哈希演算法用於產生令牌。 計劃成功了 MD5來自MD5+計數器+秘密 對於戰鬥令牌,對於測試令牌沒有秘密。
MD5 是對我們的後台 Pavel 所做的一個商業專案的引用。 就在幾年前這個專案使用了MD5,當他告訴專案架構師這是一個過時的加密演算法時,他們就從MD5開始使用MD5。 由於我們決定做一個最菜鳥的項目,他記住了一切並決定做一個小參考。
戰鬥射擊
威震天的戰鬥模式為 100 瓦 3% 雷射功率。 這足以在 2 分鐘內燒斷支撐重物的繩子,破壞水族箱並使服務器充滿水。
我們在專案的Github上留下了一些提示:即代幣生成程式碼,從中可以了解到測試代幣和戰鬥代幣是基於同一個計數器指標生成的。 在戰鬥令牌的情況下,除了計數器值之外,還使用鹽,除了最後兩個字元之外,它幾乎完全留在這個要點的更改歷史中。
知道了這些數據,就可以對鹽的最後 2 個符號進行排序,並實際上發現使用了來自 Lost 的數字(轉換為十六進制系統)。
然後,玩家必須捕獲計數器值(透過分析測試令牌)並使用下一個計數器值和上一步選擇的鹽來產生戰鬥令牌。
計數器會隨著每次測試射擊且每 25 秒遞增一次。 我們沒有在任何地方寫過這個,這應該是一個小遊戲驚喜。
驗證碼互動服務
在遊戲世界中,這與必須載入的驗證碼相同,才能打開風扇並透過提示開啟活動掛圖。 攝影機旁邊是一台具有負載監控功能的筆記型電腦。
如果在最後 5 秒內有超過 50 個顯示驗證碼的請求,則負載會增加固定 + 隨機步數。 經計算,兩分鐘內即可達到100%負載。
事實上,服務中的邏輯比最終遊戲中顯示的邏輯更多:我們放置顯示器的方式使得只有 CPU 風扇的旋轉可見。
在任務開始時,他們想讓 Grafan 可以透過 Falcon 網站存取。 但它還包含後端應用程式報告中的 springboot 指標,我們沒有時間清除這些指標,因此我們決定阻止對其進行存取。 確實如此——即使在任務開始時,一些玩家就猜測該應用程式是用 springboot 框架編寫的,甚至挖出了一些服務的名稱。
主機和資料匯流排
用於將資訊從後端傳輸到網站(運行 RabbitMQ 的 VPS 伺服器)的工具。
後端和資料匯流排保持開啟
為了保護伺服器免受 DDoSa 攻擊,我們使用了 Cloudflare。
值得一提的是,VPS 經受住了一切考驗。
Arduino負責控制繼電器,接收翻譯器的命令並進行實際工作
這更多是下一篇關於該項目的硬體部分的文章的主題:後端只是發送請求以打開特定的繼電器。 碰巧後端知道幾乎所有實體,並且來自它的請求看起來像“打開這個實體”。 我們這樣做是為了對網站進行早期測試(我們還沒有組裝所有的 Arduino 和繼電器),最後我們就這樣留下了一切。
前端
我們很快就在波浪號上創建了該網站,花了一個工作日,為我們節省了 30 萬美元的預算。
最初,我們想到簡單地匯出網站並添加我們缺少的邏輯,但我們遇到了禁止我們這樣做的使用條款。
我們還沒有準備好違反許可證,因此有兩種選擇:自行實現所有內容或直接聯絡 Tilda,討論該專案並要求更改程式碼的許可。
我們選擇了第二種,他們不僅半途而廢,還給了我們一年的免費商業帳戶,我們非常感謝。 向他們展示索科爾的網站設計非常尷尬。
因此,我們將 js 邏輯附加到前端,用於向基本裝置發送請求,並稍微更改了用於開啟和關閉遊戲元素的按鈕的樣式。
場地設計
搜尋的歷史值得單獨寫一章。
我們想要創建的不僅僅是一個老式的網站,而是一個違反所有基本設計規則的絕對噁心的網站。 同時,保持可信度也很重要:它不能破壞耳鼻喉科的故事,不能表現出作者的自命不凡,而且玩家必須相信這樣的網站可以存在,甚至可以帶來客戶。 他帶來了! 在比賽進行期間,我們兩次被聯繫來創建網站。
起初,我自己進行了設計,嘗試加入更多的 gif 和閃亮的元素。 但與我結婚 10 年的設計師丈夫回頭一看,認為它「太好了」。 要打破設計規則,您需要了解它們。
有幾種顏色組合會引起持久的厭惡感:同樣豐富的綠色和紅色、灰色和粉紅色、藍色和棕色。 最後,我們選擇了紅色和綠色的組合作為基色,添加了一隻貓的動圖,並從庫存照片中選擇了 3-4 張索科洛夫本人的照片。 我的要求只有幾個:一個中年男子,穿著大了幾號的不合身西裝,擺出「專業影樓拍照」的姿勢。 在測試中,他們向朋友展示了它並詢問“你喜歡它嗎?”
在設計開發過程中,我先生每半小時就得躺下一次;直升機開始飛行。 Pasha 在完成前端時試圖打開大部分螢幕的開發者控制台 - 以保護他的眼睛。
實際設備
風扇和燈透過固態繼電器安裝,這樣它們就不會立即以全功率打開,這樣功率就會在監控的同時增加。
但我們將在下一篇文章中討論這個問題,關於遊戲的硬體部分和網站的實際建構。
敬請關注!
關於破壞伺服器任務的其他文章
來源: www.habr.com