Jason Lee

The fastest way to achieve success is to first help others succeed

Linux 系統中的 load average

如果你是一個 Linux 系統的使用者或管理者,你可能會經常看到一個叫做 load average 的數值,它通常出現在系統監控工具或命令行的輸出中,例如 top、uptime、w 等。那麼,load average 到底是什麼意思?它跟 cpu usage 有什麼關係?本文將嘗試解答這些問題,並幫助你更好地理解和使用 load average。 什麼是 load average? load average 是一種衡量系統資源使用情況的指標,它表示在一定時間間隔內,系統中正在執行或等待執行的進程數量的平均值。load average 通常有三個數字,分別代表過去一分鐘、五分鐘和十五分鐘的平均負載。 例如,如果你在命令行中輸入 uptime,你可能會看到這樣的輸出: $ uptime 14:40:39 up 2:00, 1
5 min read
golang

Go Module with private github repository

今天用 go mod download 想下載新專案的依賴的時候一直遇到一個錯誤 go: github.com/your-repo/your-kit@v0.1.0: reading github.com/your-repo/your-kit/go.mod at revision v0.1.0: unknown revision v0.1.0 這是因為我們有使用到一些私有repo 上面的 library,然後我們沒有給權限,所以在使用 go mod download 無法成功抓取,就出現這樣的訊息了。這邊需要做下面這個流程就可以成功了 1. 因為 go mod 其實底層是呼叫 git 的指令來做事情,所以我們必須給 git
2 min read
microservice

新創何時要考慮轉成微服物架構?

新創公司一開始在做產品的時候,最一開始要考量的問題應該是這個 idea 是不是被市場所接受的,而非技術的問題 (擔心產品一上線就百萬人同時上線,每天百萬訂單等等議題),加上一開始的不確定因數太高了,市場給的反饋都可能造成產品需要做大幅度的調整,同時新創公司一開始的技術團隊可能都不到 5 位工程師,所以新創公司一開始的時候,單體架構 (monolith)是一個好的開始,然後一路快速迭代,到什麼時候適合評估轉換成使用微服物的時機? 同時微服務帶來那些好處呢? 這是一個很好的思考題目,歡迎一起研究。 代碼維護性 因為單體的代碼是一大包,可能在代碼裡面包含的各種模塊或服務,例如:身分認證服務、訂單服務、支付服務、設備服務等,當修改其中一個服務的代碼時然後運行CI測試,因為必須每個服務的測試都跑過一次,造成在執行自動化測試的時候會相對比較久,可能超過 20 分鐘以上等等,這時候如果已經造成維護上面的問題,可以考慮服務上面的分離 系統錯誤隔離性差 一個大的單體,裡面會包含很多服務,如果遇到某一個服務,錯誤處理沒有處理好、記憶體溢出等等造成系統掛掉,這時候是全系統都不能使用,因為
3 min read
mysql

Mysql Index 和 Where 順序的關聯

我們假設我們有建立一個 table, 裡面有三個欄位,分別為 a, b, c, 同時也針對這三個欄位建立 index idx_abc,這種建法背後其實是同時建立三個 index, 類似 idx_a, idx_ab, idx_abc , 這是時候我們分別用下面條件來查詢,那些會觸發 index? 因為我們的 index 建立順序是 abc 一起的複合 index, 所以要觸發這個 index, 裡面必須要 a 這個欄位,因為需要 index 的第一個欄位,因為 mysql 的 sql parse 有針對查詢做最佳化,當你的 where 條件第一個開始的不是 a 但後面有用到 a, 這樣也是會用到
1 min read
golang

cannot assign requested address

昨天遇到一個 cannot assign requested address 的問題,這個問題主要的意思是主機端找不到可用的 port 來發起請求, 例如: TCP 連線遇到大量的 TIME_WAIT, 昨天就是這個問題 因為使用的 golang request 套件是使用 golang 的 http client, 但沒有指定 MaxIdleConns 值, 造成大量的 TIME_WAIT 現象 最後設定成這樣來解決 _httpClient = &http.Client{ Transport: &http.Transport{ MaxIdleConnsPerHost: 100, MaxIdleConns: 100, IdleConnTimeout: 90 * time.Second, TLSClientConfig: &tls.Config{ InsecureSkipVerify: false,
1 min read
k8s

K8S 針對 POD 的 Health check

在 k8s 裡面有有兩個探針, 分別是 liveness probe 和 readiness probe Kubelet 使用 Liveness probe 功能來確定何時重啟 Container 。當應用處於運做,但無法做進一步操作,Liveness 將偵測到 Deadlock,重啟處於該狀態下的容器,使程式在存在 Bug 的情況下依然能繼續運作。 Kubelet 使用 Readiness probe 來確定 Conatiner 是否已可以連接。只有當 Pod 中的 COntainer 都處於就緒狀態時 kubelet 才會認定該Pod處於就緒狀態。該信號的作用是控制哪些 Pod 應該作為 service 的後端。如果Pod處於非就緒狀態,那麼它們將會被從service的load balancer中移除。
1 min read

Golang Error 和 log package

新年期間總算有些時間來把之前開發的 log package 做一些重構,也把之前研究的 Golang 1.13 錯誤處理筆記一下。 處理 error 會需要知道這是哪一行發生錯誤,之前是靠 log package 來處理,後來看到 eris 的 error package, 覺得由 error package 來處理 error stacktrace 和 output 的格式,感覺更好,讓 log package可以專門負責 log 的紀錄就好,所以這次把 log library 裡面的 rumtime caller 先暫時移除了 Reference: https://github.com/jasonsoft/log https:
1 min read
transaction

為什麼做分散式轉帳交易請求前要先詢問訂單狀態?

單純做一個筆記,因為每次常忘記這個議題,以前做過的一個項目需要跟很多第三方轉帳打交道,每間第三方的API都不一樣,錯誤的 error handing 也不同,舉一個例子下訂單的時候,如果商戶訂單編號相同,這個訂單應該要被第三方拒絕,因為重複下單,被拒絕是沒問題的,但第三方給的錯誤訊息,不一定會告訴你錯誤是因為訂單編號重複,只單純告訴你訂單失敗,這時候就需要每次下訂單前都透過查詢接口詢問要下訂單的號碼是否存在來解決
1 min read
event sourcing

Event Souring MQ 要求

基本需求 1. 支援 pub/sub 2. 支援 message queue (一次只有一個consumer 收到 message) 3. 可以手動傳遞 Ack message (可以達到 at-lease-once) 4. 最少在相同的topic下訊息順序保證 5. 訊息持久性不丟失 6. Cluster/Failover 架構 7. 可以重新播放 Message 8. 相同 topic 可以被不同的 consumer group 訂閱, 例如: order consumer group, payment consumer group 可以同時訂閱 order-topic 9. 支援 Log Retention 依照時間自動刪除
1 min read

K8S 使用 private docker registry

1. 需要在 k8s 建立一個 secret,記得把下面的 $SECRETNAME替換成你自己的 kubectl create secret docker-registry $SECRETNAME \ --docker-server=https://gcr.io \ --docker-username=_json_key \ --docker-email=user@example.com \ --docker-password="$(cat gcr-token.json)" 1. 在 deployment.yaml 裡面使用 imagePullSecrets,然後把 更換成你的 SECRETNAME apiVersion: v1 kind: Pod metadata: name: spec: containers: - name: image: gcr.io//:
1 min read
k8s

Kubernetes Service

完整域名 my-svc.my-namespace.svc.cluster.local Port apiVersion: v1 kind: Service metadata: labels: name: app1 name: app1 namespace: default spec: type: NodePort ports: - port: 8080 targetPort: 8080 nodePort: 30062 selector: name: app1 --------------------- port 這裡的port表示:service暴露在cluster ip上的端口,:port 是提供給集群內部客戶訪問service的入口。 nodePort nodePort是kubernetes提供給集群外部客戶訪問service入口的一種方式(另一種方式是LoadBalancer),所以,:nodePort 是提供給集群外部客戶訪問service的入口。 targetPort targe
1 min read
go

Golang ProtocolBuffer 如何自訂 json tag

介紹 目前用官方的 ProtocolBuffer 產生器會遇到一個問題,就是工具產生的 Go Code 不是我們自己想要的格式,例如 FirstName 屬性,我們想要的是 first_name,今天我們帥氣的實習生推薦一個工具來解決這個問題 https://github.com/gogo/protobuf 安裝 除了原本的 protoc, 還需要特別安裝下面套件 go get github.com/gogo/protobuf/proto go get github.com/gogo/protobuf/jsonpb go get github.com/gogo/protobuf/protoc-gen-gogo go get github.com/gogo/
1 min read