Gome 高效能撮合引擎微服務
- 使用 Golang 做計算,gRPC 做服務,ProtoBuf 做資料交換,RabbitMQ 做佇列,Redis 做快取實現的高效能撮合引擎微服務
依賴
- 具體依賴資訊可以檢視 docker-composer 檔案
快速開始
-
使用 docker 一鍵部署執行環境,進入 gome 容器,
docker exec -it gome bash
-
進入 api 介面定義目錄,生成 gRPC 介面定義檔案:
cd /go/src/gome/api && protoc --go_out=plugins=grpc:. *.proto
-
進入專案目錄,複製並修改配置:
cd /go/src/gome && copy config.example.yaml config.yaml
-
啟動 gRPC 服務端:
go run main.go
-
啟動指令碼撮合消費 RabbitMQ 佇列:
go run match.go symbol
,symbol 為交易對名稱,如 btc2usdt,symbol 要與客戶端呼叫時保持一致 -
啟動指令碼消費撮合結果 RabbitMQ 佇列:
go run match_notice.go symbol
.
說明
-
gome 目錄說明:
api,RPC 介面定義目錄,使用 ProtoBuf 3 版本
engine,撮合引擎實現邏輯目錄
grpc,gRPC服務指令碼
redis,redis客戶端
utils,工具指令碼目錄
main.go 入口檔案
match.go 撮合指令碼
match_notice.go 撮合結果消費指令碼
test.go 測試指令碼,命令如下:
1. 下單:`go run test.go doOrder` 2. 撤單:`go run test.go delOrder` 3. 獲取交易對深度:`go run test.go getDepth symbol transaction` 4. 檢視命令幫助:`go run test.go help`
-
gome 會使用 symbol 名作為下單佇列,撮合引擎會消耗此佇列,撮合成交結果會 push 到 notice:+symbol 作為名稱的佇列,如 notice:btc2usdt
-
目前消費消費成交結果佇列時只列印了資料,沒有其它功能,使用者可以自行消費此佇列,實現後續邏輯,如更新資料庫,通知使用者等,gome 後續會增加根據配置的地址推送功能,這樣使用者只需要配置接收地址即可接收結果然後處理
-
本專案是在我之前的 PHP 專案基礎上,把佇列替換為 RabbitMQ,Redis 只作為快取,再使用 Golang 與 gRPC 實現微服務化
-
gome 的具體實現思想與資料結構設計可以檢視 基於Laravel的撮合服務 專案
-
本專案不用依賴其他環境,使用 docker 跑起環境後,其他專案對接呼叫即可,如:
- PHP 客戶端,composer 安裝,開箱即用
-
api 的 OrderRequest 裡,uuid(使用者標識)與 oid(訂單標識)應該具有系統唯一性,話說回來,這兩者在系統裡也不應該重複,我定義的是 string 型別,方便主鍵是非自增整型資料庫使用
總結
-
如果使用的 docker 環境,需要進入 gome 容器執行對應的操作,或者使用 Supervisor 在啟動容器時自動啟動相關指令碼
-
進入 rabbitmq 容器,
docker exec -it rabbitmq bash
,檢視現有佇列:rabbitmqctl list_queues
,刪除佇列:rabbitmqctl delete_queue queuename