您好,登錄后才能下訂單哦!
這篇文章主要介紹“PHP中的撮合引擎是什么”,在日常操作中,相信很多人在PHP中的撮合引擎是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PHP中的撮合引擎是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Matching Engine For Laravel(基于redis的撮合引擎),PHP高性能撮合引擎
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,后續將繼續優化撮合速度
到此,關于“PHP中的撮合引擎是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。