目次
Hyperliquid L2 Orderbook Crawler (Rust版)
概要
高性能なRust実装によるHyperliquid L2オーダーブック取得システムです。WebSocket経由でリアルタイムのオーダーブックデータを取得し、RedPanda (Kafka)を通じてQuestDBに保存します。
アーキテクチャ
Hyperliquid WebSocket API
↓
[Rust Orderbook Crawler]
↓
RedPanda/Kafka
↓
[Rust Orderbook Consumer]
↓
QuestDB
主な機能
1. Orderbook Crawler
- 高速WebSocket接続: tokio-tungsteniteによる非同期処理
- 自動再接続: エクスポネンシャルバックオフによる再接続
- バッチ処理: 効率的なKafka送信のためのバッチング
- メトリクス収集: Prometheusメトリクスの公開
2. Orderbook Consumer
- リアルタイムデータ処理: Kafkaからのストリーミング処理
- 詳細なオーダーブック保存: 複数レベルの板情報を保存
- メトリクス計算: スプレッド、流動性、深さなどの指標を自動計算
- 時系列集計: 1分間隔での統計情報を生成
データ構造
orderbook_snapshots テーブル
- timestamp: タイムスタンプ
- exchange: 取引所名
- symbol: シンボル
- best_bid_price/size: 最良買い価格/数量
- best_ask_price/size: 最良売り価格/数量
- mid_price: 仲値
- spread: スプレッド
- spread_bps: スプレッド(ベーシスポイント)
- depth_imbalance: 板の不均衡度
- bid/ask_liquidity: 買い/売り流動性
- weighted_mid_price: 加重平均価格
orderbook_levels テーブル
- timestamp: タイムスタンプ
- exchange: 取引所名
- symbol: シンボル
- side: 売買区分(bid/ask)
- level: レベル(0が最良気配)
- price: 価格
- size: 数量
orderbook_metrics テーブル
- spread_mean/std/min/max_1min: 1分間のスプレッド統計
- bid/ask_depth_5_levels: 上位5レベルの板厚
- depth_imbalance_5_levels: 上位5レベルの不均衡度
- liquidity_score: 流動性スコア
- market_depth_score: 市場深度スコア
環境変数
Crawler
RUST_LOG=hyperliquid_orderbook_crawler=info
KAFKA_BROKERS=redpanda:9092
SYMBOLS=ETH,SOL,AVAX,HYPE
KAFKA_TOPIC=hyperliquid-orderbook
ORDERBOOK_LEVELS=20 # 保存する板のレベル数
BATCH_SIZE=100 # バッチサイズ
FLUSH_INTERVAL_MS=1000 # フラッシュ間隔(ミリ秒)
Consumer
RUST_LOG=hyperliquid_orderbook_consumer=info
KAFKA_BROKERS=redpanda:9092
KAFKA_TOPIC=hyperliquid-orderbook
QUESTDB_HOST=questdb
QUESTDB_PORT=8812
QUESTDB_HTTP_PORT=9000
MAX_LEVELS_TO_STORE=10 # QuestDBに保存する最大レベル数
ENABLE_METRICS_CALCULATION=true # メトリクス計算の有効化
起動方法
# 新しいサービスを含めてすべて起動
docker-compose up -d
# オーダーブッククローラーのみ起動
docker-compose up -d hyperliquid-orderbook-crawler hyperliquid-orderbook-consumer
# ログの確認
docker-compose logs -f hyperliquid-orderbook-crawler
docker-compose logs -f hyperliquid-orderbook-consumer
モニタリング
Prometheusメトリクス
# Crawlerメトリクス
curl http://localhost:19090/metrics
# 主なメトリクス:
- hyperliquid_orderbook_messages_sent_total: 送信メッセージ数
- hyperliquid_orderbook_websocket_connections_total: WebSocket接続数
- hyperliquid_orderbook_errors_total: エラー数
- hyperliquid_orderbook_batch_duration_seconds: バッチ処理時間
QuestDBクエリ例
-- 最新のオーダーブックスナップショット
SELECT * FROM orderbook_snapshots
WHERE symbol = 'ETH'
ORDER BY timestamp DESC
LIMIT 10;
-- 特定時点の板情報(10レベル)
SELECT * FROM orderbook_levels
WHERE symbol = 'ETH'
AND timestamp = '2024-01-01T00:00:00.000Z'
ORDER BY side, level;
-- 1時間のスプレッド推移
SELECT
timestamp,
spread_mean_1min,
spread_std_1min
FROM orderbook_metrics
WHERE symbol = 'ETH'
AND timestamp > dateadd('h', -1, now())
ORDER BY timestamp;
-- 流動性の時系列変化
SELECT
timestamp,
bid_liquidity + ask_liquidity as total_liquidity,
depth_imbalance
FROM orderbook_snapshots
WHERE symbol = 'ETH'
SAMPLE BY 1m
ORDER BY timestamp DESC
LIMIT 60;
パフォーマンス最適化
- バッチ処理: 複数のオーダーブック更新をバッチで送信
- 非同期処理: Tokioランタイムによる高効率な非同期処理
- ゼロコピー: 可能な限りデータコピーを避ける実装
- LTO最適化: Link Time Optimizationによるバイナリ最適化
トラブルシューティング
WebSocket接続エラー
# ログを確認
docker logs hyperliquid-orderbook-crawler
# ネットワーク接続を確認
docker exec hyperliquid-orderbook-crawler ping api.hyperliquid.xyz
Kafka接続エラー
# RedPandaの状態を確認
docker exec -it redpanda rpk cluster health
# トピックの確認
docker exec -it redpanda rpk topic list
QuestDB書き込みエラー
# QuestDBのログを確認
docker logs questdb
# テーブルの存在確認
curl -G "http://localhost:9000/exec" --data-urlencode "query=SHOW TABLES"
今後の拡張予定
- 差分更新のサポート: フルスナップショットではなく差分更新の処理
- 複数取引所対応: Binance、Bybitなどのオーダーブック統合
- リアルタイム分析: ストリーミング分析エンジンの追加
- 機械学習統合: オーダーブックパターン認識モデルの実装