Jason Lee

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

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

新創公司一開始在做產品的時候,最一開始要考量的問題應該是這個 idea 是不是被市場所接受的,而非技術的問題 (擔心產品一上線就百萬人同時上線,每天百萬訂單等等議題),加上一開始的不確定因數太高了,市場給的反饋都可能造成產品需要做大幅度的調整,同時新創公司一開始的技術團隊可能都不到 5 為工程師,所以新創公司一開始的時候,單體架構 (monolith)是一個好的開始,然後一路快速迭代,到什麼時候適合評估轉換成使用微服物的時機? 同時微服務帶來那些好處呢? 這是一個很好的思考題目,歡迎一起研究。 代碼維護性 因為單體的代碼是一大包,可能在代碼裡面包含的各種模塊或服務,例如:身分認證服務、訂單服務、支付服務、設備服務等,當修改其中一個服務的代碼時然後運行CI測試,

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 有針對查詢做最佳化,當你的

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:

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處於非就緒狀態,

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:

transaction

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

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

event sourcing

Event Souring MQ 要求

基本需求 支援 pub/sub 支援 message queue (一次只有一個consumer 收到 message) 可以手動傳遞 Ack message (可以達到 at-lease-once) 最少在相同的topic下訊息順序保證 訊息持久性不丟失 Cluster/Failover 架構 可以重新播放 Message 相同 topic 可以被不同的 consumer group 訂閱, 例如: order consumer group, payment consumer group 可以同時訂閱 order-topic 支援 Log Retention 依照時間自動刪除 Topic 可以透過程式動態調整保存時間條件 Log

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),所以,

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/