Gome 高性能撮合引擎微服務
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