BurgessChen

@Burgess

小小後端 + DevOps 工程師,平常時間大概 1/3 寫 PHP、1/3 寫 NodeJs、1/3 寫 yaml...

Joined on Nov 5, 2017

  • Nginx + PHP-FPM 的組合從 2010 年後稱霸 PHP 應用程式伺服器,PHP-FPM 也是 PHP 官方標準,所以 Nginx + PHP-FPM 的組合基本上是目前 PHP 網站的主流。 然而 Laravel 搭配 Nginx + PHP-FPM 在高併發時仍會出現一些問題: Laravel:每個 HTTP request 都會都會重新載入 service provider、env 設定、解析路由及控制器等等初始化工作,降低了效能。 PHP-FPM:每個 worker process 只能處理一個 request,如果達到最大 process 數量(pm.max_children),就會剩下的 request 就會進入等待,可能會發生 timeout 的狀況。 process 通常會設定 dynamic 模式,也就是根據 server 機器規格,設定最小數量(pm.start_servers),跟動態擴展的最大數量(pm.max_children),若在短時間大量請求時,會花費大量 CPU 去 fork 新的 process。另外 process 也會佔用記憶體資源,即時是閒置的狀態。 未支援長連結(ex: WebSocket)。 為了解決高併發時,啟動新 process 初始化問題,新的架構 Laravel Octane + RoadRunner 誕生了:
     Like  Bookmark
  • 這篇要記錄一下 Mololog 的 Buffer 運作,原因是從 PHP-FPM 轉換成 RoadRunner 踩到一個坑,為何原本 Log 幾乎是每個 HTTP 請求即時紀錄,轉換成 RoadRunner 後卻延遲一陣子才會出現多筆 HTTP 請求記錄? Mololog 是主流的 Log 管理套件,包含 Laravel 等 framework 都使用其套件做 Log 管理。 Mololog 的 Buffer Handler 用處是先把 log 儲存到 Buffer 中,等到達到設定數量上限(bufferLimit)或是調用 flush or close method 才會送出到目標文件。大部分線上環境會啟用 Buffer Handler,原因是避免頻繁的日誌寫入產生高 I/O 開銷,但會造成非即時性的 log。 <?php use Monolog\Logger; use Monolog\Handler\StreamHandler;
     Like  Bookmark
  • 高並發問題最有名是來自 Dan Kegel 1999 年提出的 The C10K problem,C 代表著 clients,也就是 web server 同時遇到 10 K clients 連線請求會遇到的問題。 雖然隨著技術進步,問題會得到解決,但也隨著網路應用普及,這個問題的數量級會越來越大,從 C10K 增加到 C10M 不管是 HTTP 或 WebSocket,都依賴 TCP 傳輸協議,也就是使用者瀏覽網頁或呼叫 API 都必須與 server 保持 TCP 連線。而每個 TCP 連線需要分配 process(or thread) 處理,process 會佔用 CPU 跟記憶體,以及不同 process 間 I/O block 問題,當然可以讓一個 process 儘量多處理 TCP 連線,但這跟 web server 架構和硬體上限有關係。 以下記錄一些處理問題時常用的參數設定 Nginx 可參考 Tuning NGINX for Performance
     Like 1 Bookmark
  • CPU 架構 常見的有 x86_64(EX: AMD64) 和 arm (EX: ARM64)兩種架構,Intel 和 AMD 採用 x86_64,Mac pro M 系列晶片採用 arm,整體而言 x86 性能較好但較耗電,通常桌機會採用,arm 則相反,所以移動裝置常使用,續航力較高 不同架構 CPU 指令集不相容,所以要注意安裝軟體的版本 Docker Docker 跟 Docker image 也會受到 CPU 架構影響,所以 Docker 要根據 CPU 架構安裝不同的版本 Docker arm 版本可以把 x86_64 machine code 轉換成 arm,雖然運作起來會比較慢,但 x86_64 符合大多數 server 的 CPU 架構,除非 server CPU 使用 arm 架構,否則 build image 還是以 x86_64 為主比較好
     Like 3 Bookmark
  • 時區 地球上的區域使用同一個時間定義,不同經度的地方,其時間有所不同。 時區通常對應 UTC(Universal Time Coordinated),UTC 使用原子鐘計時,1958 年格林威治子夜起算,目前為國際通訊的公用標準。另一種常見的對應標準為格林威治標準時間(GMT),為較古老的國際標準,兩這差異可參考: https://pansci.asia/archives/84978 夏令時間(Daylight Saving Time/Summer Time) 夏季月份犧牲正常的日出時間,而將時間調快的做法。使用夏令時間的地區,會在接近春季開始的時候,通常將時間調快60分鐘,並在秋季調回正常時間,歐洲、北美、南美、紐澳皆有實施夏令時間。例如美國紐約夏令時間時區為 UTC-5,其他時間為 UTC-4。 ISO 8601 國際標準的日期和時間表示方法
     Like  Bookmark
  • 簡介 Serverless Event Router EventBridge 架構 根據 Event Patterns 設定的規則,Event 中特定的參數將會被 Event Bus 送往特定的目的地 digraph hierarchy { nodesep=1.0 // increases the separation between nodes
     Like  Bookmark
  • 假設有個訂單 Table DetailOrder,裡頭紀錄了多筆小訂單,資料是照建立時間排序的,另外每筆小訂單都有關聯到一個整合的主單(main_no),主單成立時間為第一筆小訂單建立時間,需求是要統計某個主單成立時間時段內,小訂單的數量總和 id main_no created_time amount 1 main-1 1739000000
     Like  Bookmark
  • 整理在 Amazon EKS 運行 k8s v1.28 的學習資料,以下範例內容需要先安裝下列指令工具 kubectl helm aws cli Kubernetes(K8s) 自動部署、擴充和管理「容器化應用程式」的開源系統。 Deployment 演進
     Like 2 Bookmark
  • Two Sum (難度:Easy) https://leetcode.com/problems/two-sum/ class Solution { /** * @param Integer[] $nums * @param Integer $target * @return Integer[] */
     Like  Bookmark
  • PHP DateTime 的 modify function 很輕易地讓我們做日期加減,不過加減月份的時候有件事情要注意,假設遇到 31 號,加減月份會遇到非預期的結果,以下範例說明 $dateTime1 = new DateTime('2023-05-31'); $dateTime1->modify('-1 month'); $dateTime1->format('m'); // 05 $dateTime1->format('Y-m-d'); // 2023-05-01 $dateTime2 = new DateTime('2023-05-31'); $dateTime2->modify('+1 month'); $dateTime2->format('m'); // 07
     Like  Bookmark
  • Prepare Installing AWS CLI AWS account note: pip 安裝 AWS CLI (pip install awscli --upgrade --user), 並把 aws 指令加入本機 PATH 裡頭 Config ~/.aws/config
     Like  Bookmark
  • 在 web application 中,如何讓 client 端及時地接收到 server 端傳送的更新訊息,大概有三種中做法: Long/short polling WebSockets Server-Sent Events 其中 polling 是由 client 端發起(client pull),WebSockets 和 SSE 是由 server 端發起(server push) Http connection 小知識
     Like 3 Bookmark
  • js 轉換時區常用套件 luxon 處理,記錄一下常用的使用方式 設定時間跟時區 DateTime 類別 DateTime 初始化可傳入一個時間,並告訴它 Time Zone 是什麼 const { DateTime } = require('luxon'); let dateTime = DateTime.fromSQL('2022-01-10 12:00:00', { zone: 'Asia/Taipei'}); dateTime 物件就代表台北時間 2022-01-10 12:00:00,如果沒有特別指定時間,預設是當下,如果沒有特別指定時區,就看 js 所在系統預設的時區,另外也可以使用 UTC 加減時間表示,例如 UTC +8 時區可用 { zone: '+0800 }' 表示、UTC -4 時區可用 { zone: '-0400' } 表示
     Like  Bookmark
  • PHP 時區轉換常用 DateTime 處理,記錄一下常用的使用方式 設定時間跟時區 DateTime 類別 DateTime 初始化可傳入一個時間,並告訴它 DateTimeZone 是什麼 $dateTime = new DateTime('2022-01-10 12:00:00', new DateTimeZone('Asia/Taipei')); $dateTime 物件就代表台北時間 2022-01-10 12:00:00,如果沒有特別指定時間,預設是當下,如果沒有特別指定時區,就看 PHP 所在系統預設的時區,另外初始化 DateTimeZone 除了輸入特定城市的時區外,也可以使用 UTC 加減時間表示,例如 UTC +8 時區可用 new DateTimeZone('+0800') 表示、UTC -4 時區可用 new DateTimeZone('-0400') 表示 轉換時區使用 setTimezone method
     Like 1 Bookmark
  • 使用時機:兩個不同 VPC 要互相連結,讓彼此當作在相同內網一樣 建立 peering connection 先去 VPC 頁面 選擇/填入申請者跟接受者的 VPC ID,可以是不同 region,甚至是不同 AWS 帳號 建立後可以進一步設定 ClassicLink 跟 DNS 設定,ClassicLink 主要是設定使用另一方的對外通訊,假設兩方只是彼此內部相連,無須理會。DNS 設定是將對方主機的 DNS 解析為私有 IP 地址,例如將 RDS 的 endpoint 解析為私有 IP 地址 設定路由表
     Like  Bookmark
  • Server 運作原理 當 webserver 收到請求,會先確認請求的檔案是什麼,如果是靜態檔案,將會從系統中找出文件位置,發送回呼叫端。 如果請求的檔案是 php,將會交給 PHP 解析器處理,CGI 協議規範 server 跟 PHP 解析器數據交換格式,PHP 解析處理完成後,再返回資料給 web server,web server 再發送回呼叫端,PHP 解析器有兩種,官方的 Zend Engine 跟 FB 開發的 HHVM。 digraph G { node[shape=box]; client [label="呼叫端"];
     Like  Bookmark
  • 當我們要對資料庫進行操作時,蠻常使用 ORM(Object-Relational Mapping) 的方式,讓我們以物件的方式對資料庫進行操作,可以讓數據結構變得簡單易懂,ORM 亦可防止 SQL-Injection 以下是簡單的 ORM 範例,假設 DB 有 User Table,有欄位 name,對應的 ORM 物件會變成這樣子: $user = new User; $user->name = 'Burgess'; 假設 user 有關聯多個 group 資料,可使用下列方式取得: $user->groups;
     Like 1 Bookmark
  • file_get_contents、json_decode、strpos 是 PHP 蠻常見的內建函式,不過現在到處引用套件的年代,很多套件都會自動幫我們處理錯誤,會發現這些內建函式 return 特別之處,是因為一個 code review 的事件,簡單做心得紀錄一下。 前因 也許經過 typescript 跟 golang 強型別的洗禮,對於 function return 的型別會開始在意。 總之,我看到一段 code 大概是長這樣子 const A_NAME = 'Name#1'; const B_NAME = 'Name#2';
     Like  Bookmark
  • OIDC 是一種基於 OAuth 2.0 的身份認證協議,允許使用者端通過 Authorization Server 驗證使用者身份,並以標準的 ID Token 獲取使用者的基本資訊。 OAuth 只討論如何授權(authorization),並沒有明確定義身分驗證(authentication)機制,而 OIDC 協定補足了這部分缺漏。 身份 UserAgent (ResourceOwner) 資源擁有者,基本上就是使用者 OIDC Client 想要取得 user 認證及授權的 client 端,必須在 Authorization Server 有註冊。
     Like  Bookmark
  • Serverless Serverless 架構流行了一陣子了,以 function 為單位,讓開發者專注於程式開發,無需擔心維護 server 問題。這使許多雲端服務商推出 serverless 服務,如 AWS Lambda 及 Google Cloud Function。 How to build serverless applications ? 有幾種部署方式: AWS console : 手動到 AWS console 設定,同環境需重複設定多次, 設定流程難以文件化。 AWS CloudFormation : CloudFormation 可以把環境部署文件化,但 Lambda Function code 必須自行另外打包上傳到 s3,就 Lambda 部署而言,設定相較於 JavaScript library 複雜。 JavaScript library : Serverless Framework or AWS Amplify,提供簡單指令即可部署
     Like  Bookmark