Gome 高性能撮合引擎微服務

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