Gome 高效能撮合引擎微服務

stingbo發表於2021-02-08

Gome 高效能撮合引擎微服務

  • 使用 Golang 做計算,gRPC 做服務,ProtoBuf 做資料交換,RabbitMQ 做佇列,Redis 做快取實現的高效能撮合引擎微服務

依賴

快速開始

  1. 使用 docker 一鍵部署執行環境,進入 gome 容器,docker exec -it gome bash

  2. 進入 api 介面定義目錄,生成 gRPC 介面定義檔案: cd /go/src/gome/api && protoc --go_out=plugins=grpc:. *.proto

  3. 進入專案目錄,複製並修改配置: cd /go/src/gome && copy config.example.yaml config.yaml

  4. 啟動 gRPC 服務端:go run main.go

  5. 啟動指令碼撮合消費 RabbitMQ 佇列:go run match.go symbol,symbol 為交易對名稱,如 btc2usdt,symbol 要與客戶端呼叫時保持一致

  6. 啟動指令碼消費撮合結果 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 跑起環境後,其他專案對接呼叫即可,如:

  • api 的 OrderRequest 裡,uuid(使用者標識)與 oid(訂單標識)應該具有系統唯一性,話說回來,這兩者在系統裡也不應該重複,我定義的是 string 型別,方便主鍵是非自增整型資料庫使用

總結

  1. 如果使用的 docker 環境,需要進入 gome 容器執行對應的操作,或者使用 Supervisor 在啟動容器時自動啟動相關指令碼

  2. 進入 rabbitmq 容器,docker exec -it rabbitmq bash,檢視現有佇列:rabbitmqctl list_queues,刪除佇列:rabbitmqctl delete_queue queuename

相關文章