iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 27
1
Modern Web

菜鳥後端工程師的第一門課系列 第 27

[Day27] Devops - 快取( Cache ) 和 CICD

Devops - 快取( Cache ) 和 CICD

快取和 CICD 是在 Devops 日漸受到重視的知識塊,
快取可以提昇使用者的體驗,
節省運算效能,或是減少資料庫大量讀寫的錯誤發生率。
CICD 解決整合部署的問題,
讓日漸巨大的各個軟體架構,擁有了高品質的維運工作流程。

快取

我想給讀者介紹最常被使用的兩個概念,
Server Cache 和 Redis Cache,
Server Cache 是設計給程式語言用的 Cache 機制,
Redis 是設計給資料庫用的 Cache 機制,
Cache 是一種將資料『暫時儲存』的做法,
假設這個資料是要透過複雜計算才能獲得的,
那這個做法的主要好處是,對於需要使用這筆資料的一方,
就可以跨過計算的工作,直接取得這一筆資料,
但也因為他是被『暫時儲存』起來的,
中間假設這個資料計算所用到的其他數字,有了變化,
如果沒有設定好同步更新的機制,就會有資料失真的問題,需要注意。

Redis

Redies 是這幾年逐漸火紅的資料庫快取技術,
因為它可以非常有效的減輕資料庫的負擔,
對於有『短時間』,『高乘載』的資料庫讀取工作,
有非常顯著的替代優化效果。
最重要的原因是因為,Redis 是把資料儲存在『快閃記憶體』中,
而資料庫大部分是把資料放在『硬碟』中,
就像大部分的遊戲都會把主程式放在硬碟,
因此打開遊戲時會花一些時間,
但瀏覽器網頁遊戲的資料大部分都在記憶體中讀取,
因此開啟速度快上許多。

Server Cache

static 變數

Server Cache 是一種在程式語言中,應用變數設定的 Cache 機制,
一般的變數,會在程式執行完畢後消失,
但如果將變數設定為『全域靜態』變數 ( static variable ),那就不會有消失的問題,
而且可以變成在每個頁面都能使用這個變數。
這就做到了,要取得這個值不用重新計算的效果,
通常會用於『極少改變的常數』,
例如圓周率、公司收款帳號、地址等等等...

Java 內的程式碼例子:

static Int AGE = 50

Session

Session 是過去時常使用的 Server Cache 機制,
拿來紀錄重要的訊息,不希望存在使用者瀏覽器的重要訊息,
像有些網站,會把使用者的登入狀態存在 Session 內,
用 Server 去存取使用者的重要資訊。
另外,也有一種用法,是將複雜計算的結果儲存起來,
舉個例子:
我們要做一個推薦配對系統,每天可以產生一次配對結果,
每個配對結果要花10秒產生。
如果使用者每次打開配對頁面,都要花10秒產生配對結果,
這是一個非常白癡的事情,
因此我們就可以把結果儲存在 Session 內,並設定『 Key 』,
去取得對應的值。

下面一個簡單的 Ruby 例子:

user_1 = “A0001”
user_2 = “C0001”

session[user_1] #取得 user_1 的配對結果

CICD

CICD 是現代做軟體維護很重要的概念,
可以幫助軟體網站的維護品質,
並降低程式開發者作部署整合的工作量,
因為他能自動化非常耗工程師心神的這些事務性工作。
但他有價值的前提是,
整個網站開發流程都有符合該有的完整規範,
例如單元測試這個軟體開發很重要的步驟,
不然的話,CICD 帶來的效益就會大打折扣。

CI ( 持續整合 )

CI, Continuous integration,持續整合,
CI 最重要要做的兩個任務是『程式建置』和『程式測試』,
程式建置著重在確認每次的有人『 commit 』的版本,
都能好好的被電腦編譯成功。
程式測試則是要在軟體本身已經有測試程式的情況下,才能運作,
會在程式建置完成後,用測試程式測試新寫的功能是好的,
或是沒有影響到舊有的功能面。
在軟體開發流程內執行 CI 的好處,就是能夠確保程式最新的狀況是『可用』的,
因為不停的在自動執行建置以及測試,
所以可以確保程式碼最新的狀況都是可用的,
或是如果發生異常狀況,能馬上發現問題解決。
目前業界主流會使用 Jenkins 和 Gitlab ,
建議讀者如果有興趣,可以先從這兩個服務開始。
Jenkins 教學

CD

CD,Continuous Deployment,持續部署,
這個領域著重的是解決『部署』的問題,
部署,是指將寫好的程式碼,更新到遠端或自有的機器上,
並公開讓外部使用者使用,
除了程式碼更新的問題,也要處理相依的套件、資料庫同步化等問題,
因此要怎麼在每次 CI 『整合成功』後,自動部署發佈出去,
就是一個很有價值的問題。

目前的主流都會搭配容器化『 Container 』的概念,
將一個軟體切成好幾個模組區塊,
並設定好不同模組互相連接的方法,
每次整合完畢,就把這幾個模組區塊逐步部署或更新。
建議讀者可以先從了解 docker 開始,來理解 CD 的實務運行。

docker 教學

如果有任何問題,或是指證文中的錯誤,歡迎寄信給我或留言在下面喔~


上一篇
[Day26] Devops - Web Server
下一篇
[Day28] 資安常見攻擊( Web ) 與學習方法
系列文
菜鳥後端工程師的第一門課30

尚未有邦友留言

立即登入留言