Monday, September 18, 2023
[Web] Cache
Cache 的目的
彌補 Database 在複雜業務下的不足,基本原理是將可重使用的資料存放到記憶體中,這樣可以避免每一次都去 Database 讀取,進而將地效能。而以 Memcache 為例,查詢可達到 TPS 50,000 以上。雖然說增加 Cache 可以減輕 Database 的壓力,但會讓系統變得複雜,因此若 Cache 沒有設計好,則有可能造成系統崩潰
Cache 的應用場景
1 需要經過複雜計算才能得到值:每一次從 MySQL 去 Count(*) 大量數據,則不管怎麼優化 MySQL 都無法解決這個問題
2. 讀多寫少的資料:在 Social media 上,寫的人少(insert)但讀的人多(select),即使 Database 有下 index,但每一個人都去 select 也會大幅降低效能
快取 (Cache) 設計模式
快取 (Cache) 可能的問題
1. Cache penetration
Cache 並無作用,因此系統依舊還是要去找 Database ,具體可分為以下兩種情境
1.1 Database 本來就沒有這筆資料:照理來說這樣發生的請求量應該不大,但如果被惡意攻擊,有可能拖慢整個系統,解法可以是:
當搜尋的 Key 重複率較高時:把相對應個 Key 值給一個 default,這樣下次再被存取時就回傳空值。
當搜尋的 Key 重複率較低時:利用 Bloom filter(類似 hbase 判斷 key 否存在),若存在則去 Cache 或 Database 拿,反之則 return null。
1.2 緩存資料需耗費大量資源與時間:沒辦法把所有商品全部存到 Cache 裡,因此會需要分頁存,因此有可能在訪問時 Cache 會失效,進而 Cache 無法起到作用。
2. Cache avalanche
若 Key 全部都設同一個 Expire time,則當時間到會同時全部失效,此時會全部像 Database 索取資料,Database 會瞬間壓力過大,解決方法是利用一定區間的隨機值當來當作 Expire time。
3. Cache breakdown
Cache 失效後引起系統效能急遽下降的情況。例如當 key 值過期後,需要重新和 Database 拿資料,但是在拿資料的過程需要時間,若此時同時有大量訪問需求進來,全部都去 Database 拿資料就會造成問題,因此解法有兩種:
更新鎖:保證只有一個線程可以去更新緩存,其他線程則等待,不過當採分布式集群系統時,多個機器間也會產生緩存雪崩的問題,因此需要用到分布式鎖:Zookeeper
後台更新:由後台線程來更新緩存而非業務線程,具體會將 key 的期限設為永久,並且由後台線程定期清掃。但是當 cache 滿了時就會遇到問題,可能解法為:業務 thread 發現 cache 失效後,通過 message queue 發送一條消息通知後台 thread 更新 cache;或者後台 thread 依據對業務的了解,對於 Key 做定期清洗。
4. Hotspot cache
雖然 Cache 系統本身的性能比較高,但對於一些特別熱點的數據,如果大部分甚至所有的業務請求都命中同一份 Cache 數據,則這份數據所在的 Cache server 的壓力也很大,解決方法是,複製多份 Cache 副本到多個 Cache server ,減輕 Hotspot cache 導致的單台 Cache server 壓力。
注意:不同的 Cache 副本不要設置統一的過期時間,不然同時失效後可能引發 Cache avalanche。
From:
https://www.explainthis.io/zh-hant/swe/cache-mechanism
https://blog.toright.com/posts/3414/%E5%88%9D%E6%8E%A2-http-1-1-cache-%E6%A9%9F%E5%88%B6.html
[Web] Nginx
Nginx 是一個非同步框架的網頁伺服器,可以做到
1. http catch
2. 負載平衡
3. 反向代理
https://www.explainthis.io/zh-hant/swe/why-nginx
[微服務] RESTful API Design
Tool: https://reqbin.com/post-online
是一種風格,他描述了如何實現 Web API 的架構,基於 HTTP 協定,用來建立分散式系統,並支援多種程式語言,他的優點包含:
可擴展性:由於系統無需保留 Client 狀態,因此可以提高擴展效能。
靈活性:由於 Client 與 Server 完全分離,因此分層的應用程式功能可以提供靈活性。
獨立性:可以使用各種程式語言來編寫程式,不影響 API 的設計。
可以快取 Cacheable
Reference:
https://ithelp.ithome.com.tw/users/20130079/ironman/4342
https://javascript.info/fetch-crossorigin
https://developer.mozilla.org/zh-TW/docs/Web/HTTP/CORS
https://www.shubo.io/what-is-cors/
https://pjchender.dev/webdev/web-cors/
https://miahsuwork.medium.com/%E7%AC%AC%E5%85%AD%E9%80%B1-api-%E5%9F%BA%E7%A4%8E-json-restful-curl-%E6%8C%87%E4%BB%A4-28670813764e
https://blog.huli.tw/2021/02/19/cors-guide-1/
https://ithelp.ithome.com.tw/articles/10267360
Saturday, August 12, 2023
[Web] load balance
負載均衡是企業應用基礎架構中的最重要的一部分。選擇合適的負載均衡可以提高應用可用性,安全性,性能等眾多好處。
現代化的軟件是負載均衡已經可以幫助我們支持基於DNS,HTTP/HTTPs,VIP(虛擬IP)等多種策略的負載均衡。而且強大的負載均衡還可以幫助我們實現網站訪問加速,TLS offload,cache,DDOS 等眾多高階功能。使我們後台的程序變的更加易於實現和管理
load balance 主要組成:
規測演算法
hartbeat
分為硬體和軟體:
硬體:F5
軟體:HAProxy、Nginx、LVS
分為三大類:
DNS Load Balancer (DLB)
Application Load Balancer (ALB)
1. Nginx
2. HAProxy
Network Load Balancer (NLB)
DNS Load Balancer (DLB):第一層用於平衡不同的區域請求數量
將 request 分發到不同的 ip
Application Load Balancer (ALB):針對用於 http或 https請求一種負載平衡
client -> http/https
透過 TLS termination proxy 解決
client -> encrypted -> ALB (證書管理) -> unencrypted -> App1
/image -> App1 server
.user-> App2 server
Network Load Balancer (NLB)
使用時機:性能要求較高的服務應用
優點:性能比較好
缺點。路由轉發路徑不靈活 (ip' port)
Reference
Monday, July 3, 2023
[docker]建立個人專屬的Docker image
建立個人專屬的Docker image
依 V8 images 為基準,新增 1 個 REPOSITORY
Step1: 查詢自己的UID,因為Docker啟動後,需要存取你在系統的檔案資料,所以需要同步UID
#id johnnysu
uid=1002(johnnysu) gid=1002(johnnysu) groups=1002(johnnysu),133(docker)
Step2: 確認系統中,是否有docker image?
#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nvt_env v8 0b4f165032d4 4 days ago 8.56GB
...
Step3: 啟動Docker容器
#docker run -it --name nvtenv_johnnysu_v8 nvt_env:v8 /bin/bash
Step4: 在Docker容器內,新增使用者 (輸入跟本機相同帳號密碼)
#adduser johnnysu
Step5: 修改UID/GID,及 sudo,與本機相同
usermod -u 1002 johnnysu
groupmod -g 1002 johnnysu
sudo usermod -aG sudo johnnysu
Step6: 修改完成後,再透過id command確認,確認後,執行exit離開docker。
Step7:儲存該階段docker容器
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a953d7b4cb02 nvt_env:v8 "/bin/bash" 10 minutes ago Exited (0) 10 minutes ago nvtenv_johnnysu_v8
...
>>> 將這個docker打一個新的tag <<<
USERNAME@TPVPC:~$ docker commit -m "commit message” CONTAINER_ID IMAGE:new_tag
ex. docker commit -m "set johnnysu has the sudo privileges" a953d7b4cb02 nvt_env:v8
Step8: check Docker image
#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nvt_env johnnysu_v8 60b12cdc221c 10 minutes ago 8.56GB
Step 9: 使用 docker image
docker run -it -u johnnysu \
--privileged \
-v /extspace/ktm_proj/ref_ktmoss:/ktmoss \
-v /usr/bin/hexdump:/usr/bin/hexdump:ro \
-v /etc/localtime:/etc/localtime:ro \
-v /home2/johnnysu:/home2/johnnysu \
-v /extspace/johnnysu:/extspace/johnnysu \
-v /extspace/ktm_proj/gitmirror:/extspace/ktm_proj/gitmirror \
--name nvtenv_johnnysu_2k24_v8 \
-it nvt_env:johnnysu_v8 \
/bin/bash
Step 10: docker容器
#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd9379e13420 nvt_env:johnnysu_v8 "/bin/bash" 26 seconds ago Exited (0) 7 seconds ago nvtenv_johnnysu_2k24_v8
a953d7b4cb02 nvt_env:v8 "/bin/bash" 20 minutes ago Exited (0) 19 minutes ago nvtenv_johnnysu_v8
Step 11: 移除不要的 docker容器
#docker container rm a953d7b4cb02
Step 12: 使用 docker 容器
#docker start bd9379e13420
#docker attach bd9379e13420
n8n index
【n8n免費本地端部署】Windows版|程式安裝x指令大補帖 【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能
-
軟體需求分為三大部分 1. 功能需求:指系統需要完成那些事情,即向使用者提供那些功能。 2. 非功能需求:指產品所具備的品質和屬性,比如可靠性、擴充套件性、響應時間、效能等等.. 3. 設計約束:也稱條件約束、補充規則。比如使用者要安裝該產品他需要有什麼樣的必備條件。(系統對作業...
-
模板直到实例化时才生成代码,所以获得模板代码编译错误的时机较晚。编译器在3个阶段报告错误: 1. 第一阶段是编译模板本身时,此时一般错误很少,只是 检查语法错误 ,不检查依赖于类型的代码 第二个阶段是遇到使用模板时,对函数模板调用编译器会 检查实参数目是否正确 。还要检查 参数类...
-
實參 (argument) 全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。 形...
