appcore-peer-rpc
Stable 1.0.0 · MSRV Rust 1.89 · crates.io · docs.rs · code source
Guide et exemples maintenus par le crate
Le dépôt Runtime maintient le guide détaillé, exemple débutant et exemple intermédiaire. Le wiki résume la frontière publique ; les détails d’API et d’exécution restent avec le code du crate.
Responsabilité : client peer authentifié, host HTTP, validation et replay protection.
Dépendances internes : core, distributed contracts, security et transport.
API principale : traits token issuer/authenticator/dispatcher et implémentations HashToken/static; nonce stores mémoire/fichier; config, validator et hashes ; retry/client config et trait transport ; transports pooled et standard one-shot ; HTTP state et host.
Utilisez PooledPeerRpcTransport pour réutiliser des connexions bornées par
origine. StdPeerRpcTransport conserve le comportement V1 one-shot avec
Connection: close.
Les deux consomment l'allocation owned du body du DTO HTTP. Les bodies V1 non
compressés et V2 exacts conservent le même Vec<u8> dans HttpRequest, sans
clone intégral à la frontière du transport.
Le client V1 déplace un payload outbound owned dans une enveloppe conservée pendant les retries bornés. Chaque retry renouvelle toujours les champs temporels, le nonce, la liaison du token et l'encodage HTTP. Avec un payload de 4 Mio sur cinq processus release Apple M1, le p50 est resté à +0,08 %, le RSS de pic a baissé de 7,21 %, le delta RSS du workload de 9,02 % et le delta RSS retenu de 7,99 %.
À l'entrée, decode_peer_rpc_envelope_json applique le plafond encodé et
désérialise le body V1 non compressé directement depuis les octets HTTP
empruntés. Le Runtime déplace ensuite l'allocation du payload décodé vers
CommandEnvelope. Un workload de 4 Mio sur cinq processus a réduit le p50 de
53,06 à 52,35 ms, le RSS de pic de 35,80 à 23,81 Mio et le delta RSS de workload
de 39,52 %.
À utiliser uniquement si tenant, cluster, source, cible, protocole, expiry,
nonce et intégrité sont établis. AllowPeerAuthenticator est réservé aux tests.
Le Debug des DTO peer request, response, outbound et HTTP expose les tailles
et omet bytes opaques, credentials, valeurs nonce/idempotence et details
d'erreur distante.
Le BoundedReplayStore local au processus valide chaque nonce avec une limite
de 128 octets, borne entrées actives et octets retenus estimés et n'autorise
jamais un plafond par défaut supérieur à 32 Mio. L'opérateur peut choisir un
plafond plus strict et consulter octets courants, pic, maximum et rejets sans
exposer les nonces.
Maturité : surface peer V1 stable.
Codec V2 borné
PeerRpcChunkEncoder et PeerRpcChunkAssembler traitent un stream V2
explicitement sélectionné un chunk borné à la fois. Les limites par défaut sont
64 KiB décodés par chunk, 96 KiB encodés, 64 MiB agrégés et 1 024 chunks.
Les octets encodés utilisent une chaîne JSON base64 canonique, jamais un tableau
d'entiers. Séquence, taille décodée exacte, SHA-256 par chunk et total, deadline,
annulation et quota après gzip échouent de manière fermée. Un commit échoué
n'expose jamais le sink partiel comme complet. Les chunks identity déplacent la
même allocation owned de la source à la frame puis à l'assembler, sans cloner
les octets décodés à chaque frontière. Une sonde fixe sur stack sur tout le
chunk évite le gzip spéculatif uniquement s'il semble déjà incompressible ;
les chunks structurés compressibles utilisent toujours gzip.
PeerRpcStreamRegistry possède les sessions partielles sous des quotas exacts
de sessions et d'octets décodés. Les chunks de requête utilisent des fichiers
exclusifs dans un répertoire de spool existant réservé au propriétaire; seuls
les commits vérifiés atteignent le dispatcher et les réponses utilisent des
pulls explicites et bornés. Erreur, annulation, expiration et fin libèrent le
fichier et la réservation. Le snapshot expose sessions, octets réservés,
saturations et nettoyages.
Unix valide le propriétaire effectif et les modes répertoire/fichier
0700/0600. Windows rejette les reparse points et tout allow ACE hors du SID
propriétaire du processus courant. Les autres plateformes échouent fermées.
Activez les routes HTTP signées uniquement avec
PeerRpcHttpHost::with_v2_stream_registry; le host par défaut reste V1-only.
query_stream_v2 et command_stream_v2 lient chaque body JSON exact à un
bearer token et déplacent request/response une frame à la fois. Le JSON
canonique est sérialisé directement dans SHA-256 pour cette liaison, sans
conserver un second body encodé complet à côté de la frame. Les dépendants
réutilisent ce chemin byte-exact via json_payload_hash. L'admission open
vérifie tenant, cluster, cible, trace, deadline, idempotence command et nonce
replay borné. Les frames ambiguës ne sont pas répétées; l'annulation best effort
est soutenue par le nettoyage autoritaire de la deadline.
JSON reste le défaut V2. Le framing binaire exige with_v2_binary_codec() sur
le host et with_stream_codec_v2(PeerRpcStreamCodecV2::Binary) sur le client.
Des paths query/command séparés exigent le media type Postcard exact et lient le
token au body binaire exact. Les bodies binaires n'utilisent jamais gzip HTTP;
bornes décodées, gzip optionnel du chunk et hashes d'intégrité restent
inchangés. Un support binaire absent ou incompatible est terminal, sans
fallback JSON.
Rejets V2 typés
Le candidat appcore-peer-rpc 1.0.2-rc consomme PeerRpcWireErrorV2 depuis les
endpoints explicites de appcore-distributed-contracts 1.0.2-rc.
Le code fixe phase et retryability; le délai est borné à 300
secondes, la corrélation à 128 octets et le message expurgé contrôlé par le
protocole à 256 octets. Le client rejette les métadonnées connues
contradictoires. Un code inconnu abandonne message/hint distants et devient un
unique résultat unknown, observable et terminal.
Les réponses V1 stables conservent leur JSON. Le client mappe uniquement les
codes exacts du host vers PeerRpcError::RemoteRejected; seuls les rejets
exacts endpoint/capacité replay entrent dans le retry borné existant. Aucune
sous-chaîne ou message libre ne contrôle le retry. L'ambiguïté d'un ACK V2
interdit toujours le retry automatique d'une frame.
Mettez à jour caller et target avant de sélectionner l'endpoint V2. V1 stable reste supporté pour les deployments legacy et n'est jamais mis à niveau, converti ou désactivé automatiquement.
La certification release clean-source à 6f3bc38 mesure 25 % d'octets body en
moins, un p99 codec réduit de 93 % et un buffer borné réduit de 14 % entre
64 Kio et 4 Mio. Le cas 1 Kio progresse de 38 %/65 %/18 %; le RSS maximal de la
suite est 306 448 Kio. /v1/peer/* analyse uniquement V1 et n'infère jamais V2.
Le codec binaire reste en développement sans preuve Linux/Windows.