マッチングエンジン用のLaravelパッケージ
Laravel用のマッチングエンジン(redisに基づくマッチングエンジン)、PHPの高性能マッチングエンジン
クイックスタート
- githubアドレス
- インストール:
composer require sting_bo/mengine
- 構成ファイルをコピーします。
php artisan vendor:publish
頼る
- プレディス
号外
- Golangマイクロサービスがリリースされました。問題の使用と送信を歓迎します
使用説明書
-
既存のデータを持つシステムがこのライブラリを使用している場合は、初期化スクリプトを自分で記述して、最初にデータをキューに実行できます。
-
ユーザーの注文
-
注文後、最初にデータベースに保存してから、次の手順を開始してドキュメントオブジェクトをインスタンス化します
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
],
];
- キューにプッシュします。キュータスクを手動で開始する必要があります
use StingBo\Mengine\Services\MengineService;
$ms = new MengineService();
$ms->pushQueue($order);
キュータスクを開く:
php artisan queue:work --queue=abc2usdt
使用horizon
しsupervisor
て支援することもでき、半分の労力で2倍の結果を得ることができます!
キューが消費されると、マッチングプロセスに入ります。おおよその手順は次のとおりです。
- 一致する注文を取得する
- 一致する注文がない場合は、コミッションプールに入り、コミッションプール変更イベントをトリガーします。詳細については、ポイント5を参照してください。
- 一致する注文がある場合、プログラムが一致し、注文プールデータが更新されます
- トランザクションが成功すると、イベントがトリガーされます。開発者は、データベースデータの更新、WebSocket通知など、リスナーでトランザクションを使用して注文を処理する必要があります
。EventServiceProviderで一致するイベントが成功するようにリスナーを登録します。
// 撮合成功通知,参数分别是:当前订单,被匹配的单据,交易数量
event(new MatchEvent($order, $match_order, $match_volume));
// 注册监听器
protected $listen = [
'StingBo\Mengine\Events\MatchEvent' => [
'App\Listeners\YourListener', // 你自己的监听器,应该也使用异步来实现
],
];
- 部分的なトランザクションのみの場合、残りの部分はコミッションプールに入り、コミッションプールの変更イベント、K-lineまたは深度リストの変更通知などを
トリガーします。登録されているリスナーは次のとおりです。
// 委托池数据变更事件
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トランザクション/秒であり、マッチング速度は今後も最適化されます。