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

Gome 高性能撮合引擎微服务的更多相关文章

  1. 使用Ratpack和Spring Boot打造高性能的JVM微服务应用

    使用Ratpack和Spring Boot打造高性能的JVM微服务应用 这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices wit ...

  2. 翻译-使用Ratpack和Spring Boot打造高性能的JVM微服务应用

    这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices with Ratpack & Spring Boot,InfoQ上的中 ...

  3. Matching Engine For Laravel(基于redis的撮合引擎),PHP高性能撮合引擎

    Laravel Package for Matching Engine 快速开始 github地址 安装: composer require sting_bo/mengine 复制配置文件: php ...

  4. SOA和微服务架构

    微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...

  5. SOA和微服务架构的区别

    微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...

  6. swoolefy PHP的异步、并行、高性能网络通信引擎内置了Http/WebSocket服务器端/客户端

    近半年来努力付出,项目终于要正式结项了,团队4人经历了很多困难,加班加点,最终完成了!剩下的时间将总结一下在该项目中用到知识和遇到问题.今天就从swoole说起!项目中实现异步大文件传输的功能,在服务 ...

  7. 谈谈surging 与多语言混合微服务构思

    1.前言 微服务架构已成为目前互联网架构的趋势,关于微服务的讨论,几乎是各大技术论坛.技术大会的热门话题.而Surging是高性能的模块化微服务引擎,是大家首选微服务引擎架构之一,而针对于框架有个突出 ...

  8. Swoft 2.0.3 重大更新,发布优雅的微服务治理

     什么是 Swoft ? Swoft 是一款基于 Swoole 扩展实现的 PHP 微服务协程框架.Swoft 能像 Go 一样,内置协程网络服务器及常用的协程客户端且常驻内存,不依赖传统的 PHP ...

  9. Spring Cloud Alibaba微服务一站式解决方案-开篇v2.2.1.RELEASE

    学习路线 **本人博客网站 **IT小神 www.itxiaoshen.com 生态概述 架构演进 什么是微服务 https://martinfowler.com/microservices/ Mic ...

随机推荐

  1. 【Java】面向对象

    重新搞一波 复习巩固 简单记录 慕课网 imooc Java 零基础入门-Java面向对象-面向对象 都是视频课件里的. 文章目录 面向对象 什么是对象 什么是面向对象 类 什么是对象的属性和方法 类 ...

  2. (四)React Ant Design Pro + .Net5 WebApi:PostgreSQL数据库环境搭建

    一.简介 PostgreSQL,开源数据库(没听过小伙伴自己反思一下自行百度) PgAdmin,官方提供的数据库管理工具. 二.环境 1. 官网下载包,安装数据库 tar xjvf /app/pack ...

  3. 入门OJ:郭嘉的消息传递

    题目描述 我们的郭嘉大大在曹操这过得逍遥自在,但是有一天曹操给了他一个任务,在建邺城内有N(<=1000)个袁绍的奸细 将他们从1到N进行编号,同时他们之间存在一种传递关系,即若C[i,j]=1 ...

  4. [CPP] STL 简介

    STL 即标准模板库(Standard Template Library),是 C++ 标准库的一部分,里面包含了一些模板化的通用的数据结构和算法.STL 基于模版的实现,因此能够支持自定义的数据结构 ...

  5. Python+Selenium+Unittest实现PO模式web自动化框架(1)

    1.什么是PO模式? PO是Page Object的缩写 PO模式是自动化测试项目开发实践的最佳设计模式之一,讲页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,从而提供可维护性. 主要有以下 ...

  6. Mybatis plus 报错Invalid bound statement (not found) 终极解决办法

    我产生的错误原因是写的mapper继承BaseMapper没有添加泛型: 点进去: 为了解决这个bug,网上很多人也提出了解决办法:1.检查xml文件的namespace是否正确 2.Mapper.j ...

  7. centralized collectors 中心化 采集器

    Fluent Bit https://fluentbit.io/ FluentBit is an open source specialized data collector. It provides ...

  8. CSRF Laravel Cross Site Request Forgery protection¶

    Laravel 使得防止应用 遭到跨站请求伪造攻击变得简单. Laravel 自动为每一个被应用管理的有效用户会话生成一个 CSRF "令牌",该令牌用于验证授权用 户和发起请求者 ...

  9. python 10函数式编程

                                                                               函数式编程 函数是Python内建支持的一种封装, ...

  10. Java面试,面试题

    Java面试,面试题 HashMap,HashTable,ConcurrentHash的共同点和区别 HashMap HashTable ConcurrentHashMap ArrayList和Lin ...