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
Gome 高性能撮合引擎微服务的更多相关文章
- 使用Ratpack和Spring Boot打造高性能的JVM微服务应用
使用Ratpack和Spring Boot打造高性能的JVM微服务应用 这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices wit ...
- 翻译-使用Ratpack和Spring Boot打造高性能的JVM微服务应用
这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices with Ratpack & Spring Boot,InfoQ上的中 ...
- Matching Engine For Laravel(基于redis的撮合引擎),PHP高性能撮合引擎
Laravel Package for Matching Engine 快速开始 github地址 安装: composer require sting_bo/mengine 复制配置文件: php ...
- SOA和微服务架构
微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...
- SOA和微服务架构的区别
微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...
- swoolefy PHP的异步、并行、高性能网络通信引擎内置了Http/WebSocket服务器端/客户端
近半年来努力付出,项目终于要正式结项了,团队4人经历了很多困难,加班加点,最终完成了!剩下的时间将总结一下在该项目中用到知识和遇到问题.今天就从swoole说起!项目中实现异步大文件传输的功能,在服务 ...
- 谈谈surging 与多语言混合微服务构思
1.前言 微服务架构已成为目前互联网架构的趋势,关于微服务的讨论,几乎是各大技术论坛.技术大会的热门话题.而Surging是高性能的模块化微服务引擎,是大家首选微服务引擎架构之一,而针对于框架有个突出 ...
- Swoft 2.0.3 重大更新,发布优雅的微服务治理
 什么是 Swoft ? Swoft 是一款基于 Swoole 扩展实现的 PHP 微服务协程框架.Swoft 能像 Go 一样,内置协程网络服务器及常用的协程客户端且常驻内存,不依赖传统的 PHP ...
- Spring Cloud Alibaba微服务一站式解决方案-开篇v2.2.1.RELEASE
学习路线 **本人博客网站 **IT小神 www.itxiaoshen.com 生态概述 架构演进 什么是微服务 https://martinfowler.com/microservices/ Mic ...
随机推荐
- 【Spring】创建一个Spring的入门程序
3.创建一个Spring的入门程序 简单记录 - Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)- Spring的基本应用 Spring与Spring MVC的 ...
- 如何构建一个多人(.io) Web 游戏,第 2 部分
原文:How to Build a Multiplayer (.io) Web Game, Part 2 探索 .io 游戏背后的后端服务器. 上篇:如何构建一个多人(.io) Web 游戏,第 1 ...
- kaggle新手如何在平台学习大神的代码
原创:数据臭皮匠 [导读]Kaggle ,作为听说它很牛X但从未接触过的同学,可能仅仅了解这是一个参加数据挖掘比赛的网站,殊不知Kaggle也会有赛题相关的数据集, 比如我们熟知的房价预测.泰坦尼克 ...
- salesforce零基础学习(一百)Mobile Device Tracking
本篇参考: Mobile Device Tracking (salesforce.com) UserDevice | SOAP API Developer Guide | Salesforce Dev ...
- CSS实现迷你键盘
最近做了一个迷你键盘的dome,这里分享给大家 dome下载地址(点击下载) 代码如下: <!DOCTYPE html> <html lang="en" > ...
- Py数据类型—列表,字典,元组
列表:数据类型list. 写法li=[1,12,9,"sdsad",["ad","dd"] ].用中括号括起来,用逗号分割每个元素列表中元素 ...
- Python Pandas操作Excel
Python Pandas操作Excel 前情提要 ☟ 本章使用的 Python3.6 Pandas==0.25.3 项目中需要用到excel的文件字段太多 考虑到后续字段命名的变动以及中文/英文/日 ...
- JavaScript中创建对象的三种方式!
JavaScript中创建对象的三种方式! 第一种 利用对象字面量! // 创建对象的三种方式! // 1 对象字面量. var obj = { // 对象的属性和方法! name: 'lvhang' ...
- Azure DevOps Pipelines执行RobotFramework自动化代码
一.Azure DevOps介绍 1.什么是 Azure DevOps? Azure DevOps其实是VSTS(Visual Studio Team Service)更名后的名字.而VSTS是TFS ...
- class CacheMiddleware(UpdateCacheMiddleware, FetchFromCacheMiddleware):
class CacheMiddleware(UpdateCacheMiddleware, FetchFromCacheMiddleware):