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

最新文章

  1. 关于大型网站技术演进的思考(十九)--网站静态化处理—web前端优化—上(11)
  2. python获取每颗cpu使用率
  3. Python学习 之 爬虫
  4. Cocos2d-x游戏中默认的AndroidManifest.xml的解析
  5. DBMS_RLS包实现数据库表中的行级安全控制
  6. 面试题25:最小的K个数
  7. sql使用存储过程和交易
  8. .net core 读取配置文件
  9. C#将datatable的某一列转换成json格式的字符串
  10. ★Linux桌面系统技巧(作为客户端)
  11. JS实现手机访问pc网址自动跳转到wap网站
  12. redis与CPU、内存
  13. 安装centos 6.7&7.4
  14. 谁考了第k名
  15. MDX Cookbook 07 - 在不同层次结构的成员中实现 逻辑 OR 的效果
  16. golang 对struct进行Serialize的方法,即将存取二进制文件到struct的方法
  17. discuz的学习和部署
  18. CustomSqlSessionFactoryBean
  19. ApiPost自动化测试基础之:流程测试
  20. vue 父子间组件传值

热门文章

  1. canvas多重阴影发光效果
  2. 【ORA】ORA-00257 archiver error. 错误的处理方法
  3. Redis中哈希分布不均匀该怎么办
  4. 【老孟Flutter】如何提高Flutter应用程序的性能
  5. 07. struts2中对Action的管理方式
  6. JavaScript中函数的调用!
  7. jemeter断言和性能分析
  8. (Sql Server)存储过程(转载)
  9. apache httpclient 4 范例
  10. C++ Primer Plus读书笔记(七)函数