Matching Engine For Laravel(基于redis的撮合引擎),PHP高性能撮合引擎
Laravel Package for Matching Engine
快速开始
- github地址
- 安装:
composer require sting_bo/mengine - 复制配置文件:
php artisan vendor:publish
依赖
- predis
号外
- 已经出Golang微服务撮合啦,欢迎使用并提issue
使用说明
已有数据的系统如果使用此库,可以自己写一个初始化脚本,先把数据跑入队列
用户下单
下单后,先存入数据库,然后才开始下面步骤,实例化单据对象
use StingBo\Mengine\Core\Order;
$uuid = 3; // 用户唯一标识
$oid = 4; // 订单唯一标识
$symbol = 'abc2usdt'; // 交易对
$transaction = 'buy'; // 交易方向,buy/sale
$price = 0.4; // 交易价格,会根据设置精度转化为整数
$volume = 15; // 交易数量,会根据设置精度转化为整数
$order = new Order($uuid, $oid, $symbol, $transaction, $volume, $price);
交易方向与交易精度可在配置文件灵活设置
return [
'mengine' => [
// 交易类型,不可更改
'transaction' => [
'buy',
'sale',
],
// 精度,可更改
'accuracy' => 8, //default
'test2usdt_accuracy' => 4, //设置交易对精度则使用,没有则取accuracy
],
];
- push到队列,队列任务需要手动开启
use StingBo\Mengine\Services\MengineService;
$ms = new MengineService();
$ms->pushQueue($order);
开启队列任务:
php artisan queue:work --queue=abc2usdt
也可以使用horizon与supervisor来辅助,事半功倍!
队列消费时会进入撮合程序,大概的步骤如下:
- 获取匹配委托订单
- 如果没有匹配的订单,则进入委托池,触发委托池变更事件,详见第5点
- 如果有匹配的委托,程序撮合,更新委托池数据
- 交易成功会触发事件,开发者要在监听器里处理有交易的委托单,比如更新数据库数据,WebSocket通知等
在EventServiceProvider里为撮合成功的事件注册监听器:
// 撮合成功通知,参数分别是:当前订单,被匹配的单据,交易数量
event(new MatchEvent($order, $match_order, $match_volume));
// 注册监听器
protected $listen = [
'StingBo\Mengine\Events\MatchEvent' => [
'App\Listeners\YourListener', // 你自己的监听器,应该也使用异步来实现
],
];
- 如果只是部分成交,则剩余部分进入委托池,触发委托池变更事件,K线或者深度列表变更通知等,
注册监听器如下:
// 委托池数据变更事件
event(new PushQueueEvent($order));
// 注册监听器
protected $listen = [
'StingBo\Mengine\Events\PushQueueEvent' => [
'App\Listeners\YourListener', // 你自己的监听器,应该也使用异步来实现
],
];
用户撤单
撤单流程应该是先查询数据库确认是否可撤销,再从redis里删除数据成功,最后更新回数据库
$order = new Order($uuid, $oid, $symbol, $transaction, $volume, $price);
$ms = new MengineService();
$ms->deleteOrder($order);
此撮合引擎没有实现像数据库那样的锁机制,为了防止有单子在被撮合时又有撤销的命令出现,所以下单与撤单都走的同一个队列,保证了顺序性,每个交易对是隔离的队列,效率也有一定的保证,但开发需要实现异步通知用户功能,注册监听器如下:
// 撤单成功通知
event(new DeleteOrderSuccEvent($order));
// 注册监听器
protected $listen = [
'StingBo\Mengine\Events\DeleteOrderSuccEvent' => [
'App\Listeners\YourListener', // 你自己的监听器,应该也使用异步来实现
],
];
获取某个交易对买/卖深度列表
$symbol = 'abc2cny';
$transaction = 'buy';
$ms = new MengineService();
$ms->getDepth($symbol, $transaction);
总结
本地垃圾笔记本上测试,交易对撮合速度平均在200笔/s,后续将继续优化撮合速度

Matching Engine For Laravel(基于redis的撮合引擎),PHP高性能撮合引擎的更多相关文章
- laravel基于redis实现的一个简单的秒杀系统
说明:网上很多redis秒杀系统的文章,看的都是一头雾水,然后自己来实现一个,也方便以后自己学习 实现的方式是用的redis的list队列,框架为laravel 核心部分为list的pop操作,此操作 ...
- [原创]Laravel 基于redis队列的解析
目录 参考链接 本文环境 为什么使用队列 Laravel 中的队列 分发任务 任务队列 Worker Last-Modified: 2019年5月10日11:44:18 参考链接 使用 Laravel ...
- Gome 高性能撮合引擎微服务
Gome 高性能撮合引擎微服务 使用 Golang 做计算,gRPC 做服务,ProtoBuf 做数据交换,RabbitMQ 做队列,Redis 做缓存实现的高性能撮合引擎微服务 依赖 具体依赖信息可 ...
- PHP【Laravel】delayer基于redis的实现订单超时改变状态
实现这个功能前你需要知道以下,不然可能会比较吃力:1.服务器的计划任务,shell脚本,或者你有宝塔自带的计划任务会方便很多.2.有所了解Redis.3.会写PHP业务逻辑. 好了进入在正题,这里使用 ...
- 基于redis排行榜的实战总结
前言: 之前写过排行榜的设计和实现, 不同需求其背后的架构和设计模型也不一样. 平台差异, 有的立足于游戏平台, 为多个应用提供服务, 有的仅限于单个游戏.排名范围差异, 有的面向全局排名, 有的只做 ...
- 消息中心 - Laravel的Redis队列(一)
前言 Laravel的队列可以用在轻量级的队列需求中.比如我们系统中的短信.邮件等功能,这些功能有一些普遍的特征,异步.重试.并发控制等.Laravel现在主要支持的队列服务有Null.Sync.Da ...
- redixdb 基于redis 协议的实时key-value 存储
redixdb 是一个基于redis 协议搞的一个实时key value 处理的轻量级应用,支持多种后端 存储模型. 以下是一个小版的容器镜像(官方的太大了) dockerfile FROM go ...
- 基于redis的处理session的方法
一个基于redis的处理session的方法,如下. <?php class Session_custom { private $redis; // redis实例 private $prefi ...
- 基于redis 实现分布式锁的方案
在电商项目中,经常有秒杀这样的活动促销,在并发访问下,很容易出现上述问题.如果在库存操作上,加锁就可以避免库存卖超的问题.分布式锁使分布式系统之间同步访问共享资源的一种方式 基于redis实现分布式锁 ...
随机推荐
- Jenkins自动部署spring boot
Jenkins自动部署spring boot 背景介绍 本公司属于微小型企业,初期业务量不高,所有程序都写在一个maven项目里面,不过是多模块开发. 分了login模块,service模块,cms模 ...
- Windows+.Net Framework+svn+IIS在Jenkins上的自动化部署入门
关于Jenkins的使用及安装,上一篇文章我已经介绍过了,Windows+.NetCore+git+IIS在Jenkins上的自动化部署入门.这篇主要是在jenkins如何安装SVN和MSBuild. ...
- pycharm工具的使用
一.Pycharm常用快捷键 快捷键 作用 备注 ctrl + win + 空格 自动提示并导包 连按两次 ctrl + alt + 空格 自动提示并导包 连按两次 Alt + Ente ...
- 2V升3.3V芯片,输出500MA,低功耗10uA解决方案
2V的输入电压其实非常少,一般都是镍氢电池1.2V,干电池1.5V,来给玩具,MCU单片机,模块啊,等等供电.不过2V的供电电源或者设备确实是不常见的. 一般2V升3.3V,需要升压芯片PW5100即 ...
- .NET Core 问题记录
前言: 最近在项目中遇到了遇到了写部署步骤过多的问题,为了减少.net core项目部署步骤:需要对一些基础问题进行验证: 如端口设置.单页应用程序(angluar)合并部署方式等相关问题,特将解决过 ...
- pytorch——合并分割
分割与合并 import torch import numpy as np #假设a是班级1-4的数据,每个班级里有32个学生,每个学生有8门分数 #假设b是班级5-9的数据,每个班级里有32个学生, ...
- Kepware软件基本操作及使用Java Utgard实现OPC通信
一.环境搭建(基于win10 64位专业版) 1.Kepware 的下载.安装及使用 https://www.cnblogs.com/ioufev/p/9366877.html 2.重要:OPC 和 ...
- lodash的debounce函数的使用
最新,在react新项目的开发中使用到了lodash类库的debounce方法,就随手梳理了一下此方法的方便之处 未使用debounce之前 如果不考虑使用debounce,那么在用户连续点击的情况之 ...
- 五:Spring Security 中的角色继承问题
Spring Security 中的角色继承问题 以前的写法 现在的写法 源码分析 SpringSecurity 在角色继承上有两种不同的写法,在 Spring Boot2.0.8(对应 Spring ...
- Spark——DataFrames,RDD,DataSets、广播变量与累加器
Spark--DataFrames,RDD,DataSets 一.弹性数据集(RDD) 创建RDD 1.1RDD的宽依赖和窄依赖 二.DataFrames 三.DataSets 四.什么时候使用Dat ...