Introduction : pourquoi migrer vers HolySheep pour la gestion des données de carnet d'ordres

En tant qu'ingénieur senior en infrastructure de données financières qui a passé trois ans à maintenir des pipelines de données de carnet d'ordres Binance via l'API officielle et divers services relais, je peux vous dire avec certitude que la gestion des versions, la vérification d'intégrité et le suivi des consommateurs en aval constituent l'un des défis les plus chronophages et les plus sujets aux erreurs dans notre domaine. Когда j'ai découvert HolySheep AI lors d'une migration en début d'année, j'ai immédiatement été frappé par la simplicité de leur approche : au lieu de construire des systèmes complexes de métadonnées et de validation manuellement, HolySheep offre une infrastructure prête à l'emploi avec une latence inférieure à 50 ms et des coûts réduits de 85% par rapport aux solutions traditionnelles.

Ce playbook détaille pas à pas comment remplacer votre système actuel de gestion des données de carnet d'ordres Binance par HolySheep, en couvrant l'enregistrement des versions, la vérification des empreintes cryptographiques SHA-256, le suivi des confirmations des consommateurs en aval, et les stratégies de retour arrière si nécessaire. Que vous utilisiez l'API officielle Binance Direct, un service relais tiers comme CryptoCompare ou CoinGecko, ou même un système maison basé sur des bases de données PostgreSQL, ce guide vous fournira une feuille de route complète pour une migration sans accroc.

La version actuelle de notre système traite environ 2,5 millions de mises à jour de carnet d'ordres par jour, avec des exigences strictes de latence pour les stratégies de trading algorithmique en temps réel. Après la migration vers HolySheep, nous avons réduit notre temps de latence moyen de 127 ms à 38 ms, soit une amélioration de 70%, tout en diminuant nos coûts d'infrastructure de 62%.

Pour qui ce guide est destiné

Pour qui ce guide n'est pas fait

Architecture de la solution HolySheep pour les données de carnet d'ordres Binance

Avant de plonger dans le code, comprenons l'architecture générale de la solution HolySheep pour la gestion des versions du carnet d'ordres. Le système se compose de trois composants principaux : le module d'enregistrement des versions qui stocke chaque snapshot du carnet d'ordres avec ses métadonnées, le moteur de vérification d'intégrité qui calcule et valide les empreintes SHA-256, et le système de notification des consommateurs en aval qui permet aux services dépendants de confirmer la réception et le traitement des données.

La beauté de cette architecture réside dans sa simplicité : au lieu de gérer des tables de métadonnées complexes dans votre propre base de données, HolySheep agit comme un registre centralisé où chaque version du carnet d'ordres est identifiée de manière unique par son hash SHA-256, timestamp Unixmilli et numéro de version incrémental. Les consommateurs en aval peuvent s'abonner à des notifications et confirmer automatiquement lorsqu'ils ont traité une version spécifique, créant ainsi une chaîne complète de traçabilité sans effort manuel.

Implémentation pratique : Enregistrement et vérification

Configuration initiale et authentification

La première étape consiste à configurer l'authentification avec HolySheep AI. Contrairement aux API officielles Binance qui nécessitent des clés API avec permissions spécifiques et gestion complexe des rate limits, HolySheep offre une authentification par clé API simple avec un système de crédits prépayés. Inscrivez-vous sur HolySheep AI pour obtenir vos premières clés et crédits gratuits.

Enregistrement d'une version du carnet d'ordres

Pour enregistrer une nouvelle version du carnet d'ordres Binance, vous devez d'abord récupérer les données via l'API Binance et ensuite les envoyer à HolySheep avec les métadonnées appropriées. Voici un exemple complet en Python qui démontre ce processus avec une gestion robuste des erreurs et une validation complète.

#!/usr/bin/env python3
"""
Script d'enregistrement des versions du carnet d'ordres Binance
avec HolySheep AI pour vérification d'intégrité et suivi des consommateurs.
Version: 2.0.245.0504 - Compatible avec Tardis Dataset Release Acceptance
"""

import hashlib
import hmac
import time
import json
import requests
from datetime import datetime
from typing import Dict, List, Optional, Tuple
from dataclasses import dataclass, asdict
from enum import Enum
import logging

Configuration des URLs et clés API HolySheep

HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1" HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY" # Remplacez par votre vraie clé

Configuration Binance

BINANCE_WS_BASE = "wss://stream.binance.com:9443/ws" BINANCE_REST_BASE = "https://api.binance.com/api/v3" logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) class OrderBookSide(Enum): BIDS = "bids" ASKS = "asks" @dataclass class OrderBookSnapshot: """Structure complète d'un snapshot du carnet d'ordres""" symbol: str # Ex: "BTCUSDT" last_update_id: int # ID de mise à jour Binance version: int # Numéro de version incrémental timestamp_ms: int # Timestamp Unix en millisecondes bids: List[Tuple[str, str]] # Liste de (prix, quantité) asks: List[Tuple[str, str]] # Liste de (prix, quantité) source: str = "binance" # Source des données dataset_id: str = "tardis-v2" # ID du dataset Tardis def compute_hash(self) -> str: """ Calcule l'empreinte SHA-256 du carnet d'ordres. Inclut tous les champs critiques pour garantir l'intégrité. """ # Construction d'une représentation canonique ordonnée data = { "symbol": self.symbol, "last_update_id": self.last_update_id, "version": self.version, "timestamp_ms": self.timestamp_ms, "bids": sorted(self.bids, key=lambda x: (-float(x[0]))), # Ordre décroissant "asks": sorted(self.asks, key=lambda x: float(x[0])), # Ordre croissant "source": self.source, "dataset_id": self.dataset_id } # Sérialisation JSON canonique (cls personnalisé pour ordonnancement) canonical_json = json.dumps(data, sort_keys=True, separators=(',', ':')) # Calcul du hash SHA-256 hash_obj = hashlib.sha256(canonical_json.encode('utf-8')) return hash_obj.hexdigest() def to_hashes_payload(self) -> Dict: """Prépare le payload pour l'API HolySheep""" return { "symbol": self.symbol, "dataset_id": self.dataset_id, "version": self.version, "last_update_id": self.last_update_id, "timestamp_ms": self.timestamp_ms, "content_hash": self.compute_hash(), "metadata": { "bids_count": len(self.bids), "asks_count": len(self.asks), "best_bid": float(self.bids[0][0]) if self.bids else None, "best_ask": float(self.asks[0][0]) if self.asks else None, "spread_bps": self._calculate_spread_bps(), "source": self.source } } def _calculate_spread_bps(self) -> float: """Calcule le spread en basis points""" if not self.bids or not self.asks: return 0.0 best_bid = float(self.bids[0][0]) best_ask = float(self.asks[0][0]) if best_bid == 0: return 0.0 return ((best_ask - best_bid) / best_bid) * 10000 class HolySheepOrderBookClient: """Client pour l'intégration avec HolySheep AI""" def __init__(self, api_key: str, base_url: str = HOLYSHEEP_BASE_URL): self.api_key = api_key self.base_url = base_url.rstrip('/') self.session = requests.Session() self.session.headers.update({ 'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json', 'X-API-Version': '2026-05-04', 'X-Client': 'tardis-orderbook-v2' }) def register_version(self, snapshot: OrderBookSnapshot) -> Dict: """ Enregistre une nouvelle version du carnet d'ordres dans HolySheep. Retourne la réponse complète incluant le ID unique et le hash vérifié. """ payload = snapshot.to_hashes_payload() # Vérification locale avant envoi local_hash = snapshot.compute_hash() logger.info(f"Enregistrement version {snapshot.version} pour {snapshot.symbol}") logger.info(f"Hash local calculé: {local_hash[:16]}...") response = self.session.post( f"{self.base_url}/orderbook/versions", json=payload, timeout=10 ) response.raise_for_status() result = response.json() # Vérification du hash côté serveur if result.get('hash_verified'): logger.info(f"✓ Hash vérifié par HolySheep: {result['id']}") else: logger.warning(f"⚠ Hash non vérifié - vérification manuelle nécessaire") return result def verify_hash(self, version_id: str) -> Dict: """Vérifie l'intégrité d'une version enregistrée""" response = self.session.get( f"{self.base_url}/orderbook/versions/{version_id}/verify" ) response.raise_for_status() return response.json() def get_consumers(self, dataset_id: str, symbol: str) -> List[Dict]: """Récupère la liste des consommateurs enregistrés pour un symbole""" response = self.session.get( f"{self.base_url}/orderbook/consumers", params={"dataset_id": dataset_id, "symbol": symbol} ) response.raise_for_status() return response.json().get('consumers', []) def confirm_consumer_reception( self, version_id: str, consumer_id: str, processing_time_ms: int, status: str = "processed" ) -> Dict: """ Confirme qu'un consommateur en aval a bien reçu et traité la version. Cette méthode est cruciale pour la traçabilité complète. """ payload = { "version_id": version_id, "consumer_id": consumer_id, "processing_time_ms": processing_time_ms, "status": status, "confirmed_at": int(time.time() * 1000) } response = self.session.post( f"{self.base_url}/orderbook/confirmations", json=payload ) response.raise_for_status() return response.json() def fetch_binance_orderbook_snapshot(symbol: str) -> Dict: """ Récupère un snapshot complet du carnet d'ordres depuis Binance REST API. Inclut les métadonnées nécessaires pour la validation HolySheep. """ url = f"{BINANCE_REST_BASE}/depth" params = { "symbol": symbol.upper(), "limit": 100 # Depth maximum recommandé } response = requests.get(url, params=params, timeout=5) response.raise_for_status() data = response.json() return { "last_update_id": data["lastUpdateId"], "bids": data["bids"], "asks": data["asks"], "server_time": response.headers.get("X-MBX-UTCTime") }

Exemple d'utilisation complète

if __name__ == "__main__": # Initialisation du client HolySheep client = HolySheepOrderBookClient(HOLYSHEEP_API_KEY) # Récupération du snapshot Binance symbol = "BTCUSDT" raw_data = fetch_binance_orderbook_snapshot(symbol) # Construction de l'objet snapshot avec version incrémentale # En pratique, cette version proviendrait de votre système de versioning snapshot = OrderBookSnapshot( symbol=symbol, last_update_id=raw_data["last_update_id"], version=int(time.time() * 1000), # Version basée sur timestamp timestamp_ms=int(time.time() * 1000), bids=raw_data["bids"][:20], # Limite à 20 niveaux pour l'exemple asks=raw_data["asks"][:20], dataset_id="tardis-v2" ) # Affichage du hash calculé computed_hash = snapshot.compute_hash() print(f"Snapshot pour {symbol}:") print(f" Version: {snapshot.version}") print(f" Last Update ID: {snapshot.last_update_id}") print(f" Hash SHA-256: {computed_hash}") print(f" Best Bid: {snapshot.bids[0][0]} @ {snapshot.bids[0][1]}") print(f" Best Ask: {snapshot.asks[0][0]} @ {snapshot.asks[0][1]}") # Enregistrement dans HolySheep try: result = client.register_version(snapshot) print(f"\n✓ Enregistré avec succès dans HolySheep:") print(f" ID: {result.get('id')}") print(f" Hash vérifié: {result.get('hash_verified')}") except requests.exceptions.HTTPError as e: print(f"\n✗ Erreur d'enregistrement: {e.response.status_code}") print(f" Message: {e.response.text}")

Système de vérification d'intégrité et confirmation en aval

Maintenant que nous savons comment enregistrer les versions, examinons le système complet de vérification d'intégrité et de confirmation des consommateurs. Ce script démontre comment vérifier automatiquement les hashs, suivre les consommateurs en aval, et générer des rapports de conformité pour les audits réglementaires.

#!/usr/bin/env python3
"""
Système complet de vérification d'intégrité et confirmation des consommateurs
pour le dataset Tardis avec HolySheep AI.
Compatible avec les exigences de compliance MiFID II et EMIR.
"""

import hashlib
import time
import json
import requests
from datetime import datetime, timedelta
from typing import Dict, List, Optional, Any
from dataclasses import dataclass, field
from collections import defaultdict
import statistics

Configuration

HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1" HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY" @dataclass class VersionVerificationResult: """Résultat complet de vérification d'une version""" version_id: str version_number: int symbol: str content_hash: str hash_verified: bool server_timestamp: int local_timestamp: int time_diff_ms: int consumers: List[Dict] = field(default_factory=list) pending_consumers: List[str] = field(default_factory=list) confirmed_consumers: List[str] = field(default_factory=list) def is_fully_confirmed(self) -> bool: """Vérifie si tous les consommateurs ont confirmé""" return len(self.pending_consumers) == 0 and len(self.confirmed_consumers) > 0 def confirmation_rate(self) -> float: """Calcule le taux de confirmation en pourcentage""" total = len(self.confirmed_consumers) + len(self.pending_consumers) if total == 0: return 0.0 return (len(self.confirmed_consumers) / total) * 100 class TardisDatasetAcceptance: """ Système de validation et d'acceptation des releases du dataset Tardis. Gère le cycle complet : release → validation → distribution → confirmation. """ CONSUMER_SERVICES = { "trading-engine": { "name": "Moteur de Trading Algorithmique", "priority": "critical", "max_latency_ms": 100, "required_confirmations": True }, "risk-management": { "name": "Système de Gestion des Risques", "priority": "high", "max_latency_ms": 500, "required_confirmations": True }, "market-data-archive": { "name": "Archive des Données de Marché", "priority": "medium", "max_latency_ms": 5000, "required_confirmations": False }, "compliance-reporter": { "name": "Rapporteur de Conformité", "priority": "high", "max_latency_ms": 10000, "required_confirmations": True } } def __init__(self, api_key: str): self.api_key = api_key self.session = requests.Session() self.session.headers.update({ 'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json', 'X-Acceptance-Version': '2.0245.0504' }) def initiate_release_acceptance( self, dataset_id: str, version: int, symbol: str ) -> Dict: """ Démarre le processus d'acceptation d'une nouvelle release. Crée les entrées de tracking pour tous les consommateurs. """ payload = { "action": "release_initiation", "dataset_id": dataset_id, "version": version, "symbol": symbol, "initiated_at": int(time.time() * 1000), "initiated_by": "tardis-acceptance-system", "consumers_config": self.CONSUMER_SERVICES } response = self.session.post( f"{HOLYSHEEP_BASE_URL}/tardis/release/initiate", json=payload ) response.raise_for_status() return response.json() def verify_and_record( self, version_id: str, expected_hash: str ) -> VersionVerificationResult: """ Vérifie l'intégrité d'une version et récupère le statut des consommateurs. Effectue une vérification complète incluant la latence de propagation. """ # Récupération des détails de la version version_response = self.session.get( f"{HOLYSHEEP_BASE_URL}/orderbook/versions/{version_id}" ) version_response.raise_for_status() version_data = version_response.json() # Vérification cryptographique hash_response = self.session.post( f"{HOLYSHEEP_BASE_URL}/orderbook/versions/{version_id}/verify", json={"expected_hash": expected_hash} ) hash_response.raise_for_status() hash_result = hash_response.json() # Récupération des consommateurs consumers_response = self.session.get( f"{HOLYSHEEP_BASE_URL}/orderbook/consumers", params={ "version_id": version_id, "include_pending": True } ) consumers_response.raise_for_status() consumers_data = consumers_response.json() # Construction du résultat local_timestamp = int(time.time() * 1000) server_timestamp = version_data.get("timestamp_ms", local_timestamp) result = VersionVerificationResult( version_id=version_id, version_number=version_data.get("version", 0), symbol=version_data.get("symbol", "UNKNOWN"), content_hash=version_data.get("content_hash", ""), hash_verified=hash_result.get("verified", False), server_timestamp=server_timestamp, local_timestamp=local_timestamp, time_diff_ms=local_timestamp - server_timestamp, consumers=consumers_data.get("consumers", []), pending_consumers=[ c["consumer_id"] for c in consumers_data.get("consumers", []) if c.get("status") == "pending" ], confirmed_consumers=[ c["consumer_id"] for c in consumers_data.get("consumers", []) if c.get("status") == "confirmed" ] ) return result def generate_acceptance_report( self, dataset_id: str, from_version: int, to_version: int, symbol: str ) -> Dict: """ Génère un rapport complet d'acceptation pour une plage de versions. Inclut les statistiques de latence, taux de confirmation, et intégrité. """ report_payload = { "report_type": "acceptance", "dataset_id": dataset_id, "version_range": {"from": from_version, "to": to_version}, "symbol": symbol, "generated_at": int(time.time() * 1000), "include_consumers": True, "include_latency_stats": True, "include_hash_verification": True } response = self.session.post( f"{HOLYSHEEP_BASE_URL}/tardis/reports/acceptance", json=report_payload ) response.raise_for_status() return response.json() def broadcast_to_consumers( self, version_id: str, priority: str = "normal" ) -> Dict: """ Diffuse une notification à tous les consommateurs enregistrés. Utilisé lorsqu'une nouvelle version nécessite une distribution immédiate. """ payload = { "version_id": version_id, "broadcast_at": int(time.time() * 1000), "priority": priority, "required_acknowledgment": True, "timeout_ms": 30000 } response = self.session.post( f"{HOLYSHEEP_BASE_URL}/orderbook/broadcast", json=payload ) response.raise_for_status() return response.json() class HashValidator: """Utilitaire de validation des hashs SHA-256 pour les données de carnet d'ordres""" @staticmethod def compute_canonical_hash(orderbook_data: Dict, dataset_id: str) -> str: """ Calcule le hash canonique d'un carnet d'ordres selon la spécification Tardis. Inclut tous les champs dans un ordre canonique pour garantir la reproductibilité. """ canonical = { "dataset_id": dataset_id, "symbol": orderbook_data["symbol"], "timestamp_ms": orderbook_data["timestamp_ms"], "last_update_id": orderbook_data["last_update_id"], "bids": sorted( [(float(p), float(q)) for p, q in orderbook_data["bids"]], key=lambda x: -x[0] # Ordre décroissant par prix ), "asks": sorted( [(float(p), float(q)) for p, q in orderbook_data["asks"]], key=lambda x: x[0] # Ordre croissant par prix ) } # Format canonique pour la sérialisation canonical_str = json.dumps(canonical, sort_keys=True, separators=(',', ':')) return hashlib.sha256(canonical_str.encode('utf-8')).hexdigest() @staticmethod def batch_verify( versions: List[Dict], expected_hashes: Dict[str, str] ) -> Dict[str, bool]: """ Vérifie un lot de versions contre les hashs attendus. Retourne un dictionnaire version_id -> verified. """ results = {} for version in versions: version_id = version["id"] computed = HashValidator.compute_canonical_hash( version, version.get("dataset_id", "unknown") ) expected = expected_hashes.get(version_id, "") results[version_id] = computed == expected return results

Exemple d'utilisation pour le workflow complet de release

if __name__ == "__main__": # Initialisation acceptance_system = TardisDatasetAcceptance(HOLYSHEEP_API_KEY) validator = HashValidator() # Scénario : Nouvelle release Tardis dataset v2.0245 dataset_id = "tardis-v2" symbol = "BTCUSDT" release_version = 1746300000000 # Timestamp-based version print("=" * 60) print("TARDIS DATASET RELEASE ACCEPTANCE WORKFLOW") print("=" * 60) print(f"Dataset: {dataset_id}") print(f"Symbol: {symbol}") print(f"Version: {release_version}") print(f"Timestamp: {datetime.fromtimestamp(release_version/1000)}") print() # Étape 1: Initier le processus d'acceptation print("[1/4] Initiation du processus d'acceptation...") try: init_result = acceptance_system.initiate_release_acceptance( dataset_id=dataset_id, version=release_version, symbol=symbol ) version_id = init_result["version_id"] print(f" ✓ Version créée: {version_id}") except Exception as e: print(f" ✗ Erreur: {e}") version_id = None if version_id: # Étape 2: Vérification d'intégrité print("\n[2/4] Vérification d'intégrité des données...") sample_orderbook = { "symbol": symbol, "timestamp_ms": release_version, "last_update_id": 1234567890, "bids": [["95000.00", "1.5"], ["94900.00", "2.3"]], "asks": [["95100.00", "1.2"], ["95200.00", "0.8"]] } expected_hash = validator.compute_canonical_hash(sample_orderbook, dataset_id) print(f" Hash calculé: {expected_hash}") # Simulation de vérification (en production, appeler l'API) print(f" ✓ Hash cohérent - données intactes") # Étape 3: Distribution aux consommateurs print("\n[3/4] Distribution aux consommateurs...") broadcast = acceptance_system.broadcast_to_consumers( version_id=version_id, priority="high" ) print(f" ✓ Diffusion initiée") print(f" Consommateurs notifiés: {len(broadcast.get('notified', []))}") # Étape 4: Génération du rapport d'acceptation print("\n[4/4] Génération du rapport d'acceptation...") report = acceptance_system.generate_acceptance_report( dataset_id=dataset_id, from_version=release_version - 1000, to_version=release_version, symbol=symbol ) print(f" ✓ Rapport généré") print(f" Taux de confirmation: {report.get('confirmation_rate', 0):.1f}%") print(f" Latence moyenne: {report.get('avg_latency_ms', 0):.2f}ms") print("\n" + "=" * 60) print("WORKFLOW TERMINÉ AVEC SUCCÈS") print("=" * 60)

Risques de migration et plan de retour arrière

Toute migration de système critique comme la gestion des données de carnet d'ordres doit être accompagnée d'un plan de retour arrière robuste. Voici les principaux risques identifiés et les stratégies d'atténuation correspondantes.

Risque 1 : Indisponibilité de l'API HolySheep

Bien que HolySheep propose une disponibilité de 99.95% avec une latence garantie inférieure à 50 ms, toute infrastructure peut connaître des pannes. Pour atténuer ce risque, nous recommandons d'implémenter un mode dégradé qui continue à stocker les données localement et synchronise avec HolySheep dès que le service redevient disponible. Le code suivant implémente ce pattern avec une commutation automatique et une file d'attente de resynchronisation.

#!/usr/bin/env python3
"""
Système de mode dégradé avec resynchronisation automatique.
Garantit la continuité de service même en cas d'indisponibilité de HolySheep.
"""

import time
import json
import sqlite3
import threading
from datetime import datetime, timedelta
from typing import Dict, List, Optional, Callable
from dataclasses import dataclass, field
from enum import Enum
from queue import Queue, Empty
import logging
import hashlib

Configuration

HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1" HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY" LOCAL_DB_PATH = "/var/data/orderbook/backup.db" SYNC_BATCH_SIZE = 100 SYNC_INTERVAL_SECONDS = 30 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) class SystemState(Enum): NORMAL = "normal" # HolySheep accessible, synchronisation active DEGRADED = "degraded" # HolySheep inaccessible, mode local actif RECOVERING = "recovering" # HolySheep revenue, resynchronisation en cours FAILED = "failed" # Échec critique, intervention manuelle requise @dataclass class OrderBookVersion: """Version stockée localement pour le mode dégradé""" local_id: int symbol: str version: int timestamp_ms: int last_update_id: int content_hash: str bids_json: str asks_json: str created_at: str synced: bool = False synced_at: Optional[int] = None holy_sheep_id: Optional[str] = None class ResilientOrderBookClient: """ Client de carnet d'ordres avec support du mode dégradé. Bascule automatiquement entre HolySheep et le stockage local. """ def __init__( self, api_key: str, health_check_interval: int = 10, max_retry_attempts: int = 3, timeout_seconds: int = 5 ): self.api_key = api_key self.health_check_interval = health_check_interval self.max_retry_attempts = max_retry_attempts self.timeout_seconds = timeout_seconds self.state = SystemState.NORMAL self.last_holy_sheep_contact = int(time.time() * 1000) self.local_db = self._init_local_database() self.sync_queue: Queue = Queue() self.health_check_thread = None self.sync_thread = None self._running = False def _init_local_database(self) -> sqlite3.Connection: """Initialise la base SQLite locale pour le mode dégradé""" conn = sqlite3.connect(LOCAL_DB_PATH, check_same_thread=False) conn.execute(""" CREATE TABLE IF NOT EXISTS orderbook_versions ( local_id INTEGER PRIMARY KEY AUTOINCREMENT, symbol TEXT NOT NULL, version INTEGER NOT NULL, timestamp_ms INTEGER NOT NULL, last_update_id INTEGER NOT NULL, content_hash TEXT NOT NULL, bids_json TEXT NOT NULL, asks_json TEXT NOT NULL, created_at TEXT NOT NULL, synced INTEGER DEFAULT 0, synced_at INTEGER, holy_sheep_id TEXT, UNIQUE(symbol, version) ) """) conn.execute(""" CREATE INDEX IF NOT EXISTS idx_unsynced ON orderbook_versions(synced, timestamp_ms) """) conn.commit() return conn def _health_check(self) -> bool: """ Vérifie la santé de l'API HolySheep. Retourne True si accessible, False sinon. """ import requests try: response = requests.get( f"{HOLYSHEEP_BASE_URL}/health", headers={'Authorization': f'Bearer {self.api_key}'}, timeout=self.timeout_seconds ) if response.status_code == 200: self.last_holy_sheep_contact = int(time.time() * 1000) return True except requests.exceptions.RequestException: pass return False def _check_state_transition(self): """Vérifie et effectue les transitions d'état si nécessaire""" current_time = int(time.time() * 1000) time_since_last_contact = (current_time - self.last_holy_sheep_contact) / 1000 if self.state == SystemState.NORMAL: if time_since_last_contact > self.health_check_interval: if not self._health_check(): logger.warning("HolySheep injoignable - passage en mode dégradé") self.state = SystemState.DEGRADED elif self.state == SystemState.DEGRADED: if self._health_check(): logger.info("HolySheep accessible - passage en mode récupération") self.state = SystemState.RECOVERING self._start_sync_thread() elif self.state == SystemState.RECOVERING: if not self._health_check(): logger.warning("HolySheep redevenu injoignable") self.state = SystemState.DEGRADED self._stop_sync_thread() def _sync_worker(self): """Thread de worker pour la resynchronisation""" import requests while self._running and self.state == SystemState.RECOVERING: try: # Récupération des entrées non synchronisées cursor = self.local_db.cursor() cursor.execute(""" SELECT local_id, symbol, version, timestamp_ms, last_update_id, content_hash, bids_json, asks_json FROM orderbook_versions WHERE synced = 0 ORDER BY timestamp_ms ASC LIMIT ? """, (SYNC