Publication
Partagez vos connaissances.
Dois-je envoyer des TXS parallèles ? ,
Les gars, j'ai un récepteur Sui en langage Go, mais le TPS est faible, comment puis-je le rendre plus rapide, dois-je envoyer des TXS en parallèle ? , RequestType : « WaitForEffectScert », est très lent pour une utilisation individuelle
- Sui
Réponses
10Oui, l'envoi de transactions en parallèle peut améliorer considérablement votre débit. L'utilisation séquentielle de WaitForEffectScert pour chaque transaction vous ralentira. Regroupez plutôt vos transactions et traitez les réponses de manière asynchrone. Pensez également à utiliser WaitForLocalExecution uniquement lorsque cela est nécessaire. Optimisez en réutilisant les connexions et en ajustant les paramètres de simultanéité du SDK.
Oui, utilisezTxS parallèlespour augmenter le TPS. WaitForEffectsCert
ajoute de la latence : requêtes de commutation WaitForLocalExecution
ou requêtes groupées.
// Example: Send TXs concurrently in Go
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
// Your Sui TX code here
}()
}
wg.Wait()
Optimisations clés :
1.TX parallèles : utilisez des goroutines (évitez les limites de débit).
2.Demandes par lots : combinez les TX dans la mesure du possible.
3. WaitForLocalExecution``WaitForEffectsCert
Confirmation plus rapide : préférez.
Oui, si lestransactions par seconde (TPS) sont lentes et que votrerécepteur Suidans Go est en retard lors du traitement séquentiel des transactions, l'envoi detransactions parallèlespeut améliorer considérablement le débit. L'WaitForEffectsCert
opération**** peut constituer un goulot d'étranglement dans l'exécution d'un seul thread, mais la parallélisation de la soumission des transactions et de l'attente des effets peut améliorer l'efficacité. Voici un aperçu de la manière de résoudre ce problème :
1.Paralléliser les soumissions de transactions
*Envoyer des transactions parallèles : au lieu d'attendre les effets de chaque transaction de manière séquentielle, vous pouvez envoyer plusieurs transactions en parallèle. Cela permet au système de traiter les transactions simultanément, améliorant ainsi le TPS.
- Dans Go, vous pouvez utiliser desgoroutinespour envoyer des transactions en parallèle, ce qui peut vous aider à optimiser le débit. Assurez-vous que les transactions sont indépendantes les unes des autres (c'est-à-dire qu'elles ne dépendent pas des résultats les unes des autres).
Exempleutilisantgoroutinespour envoyer des transactions parallèles :
package main
import (
"fmt"
"sync"
)
// Simulate sending a transaction
func sendTransaction(txID int, wg *sync.WaitGroup) {
defer wg.Done()
// Send transaction logic here
fmt.Printf("Transaction %d sent\n", txID)
}
func main() {
var wg sync.WaitGroup
txCount := 10 // Number of transactions to send
for i := 0; i < txCount; i++ {
wg.Add(1)
go sendTransaction(i, &wg) // Launch goroutine to send transaction
}
wg.Wait() // Wait for all transactions to be sent
fmt.Println("All transactions sent.")
}
###2. WaitForEffectsCert
Optimiser
*Paralléliser l'attente des effets : WaitForEffectsCert
peut ralentir l'exécution séquentielle car elle attend que les effets de chaque transaction soient confirmés un par un. Pour pallier ce problème :
*Attente par lots : au lieu d'attendre les effets de chaque transaction en série, vous pouvez gérer et attendre leseffets de plusieurs transactions à la fois. Cela réduit le temps d'attente.
WaitForEffectsCert
*Utiliser la concurrency : implémentez un pool de travailleurs ou utilisezgoroutinespour gérer plusieurs demandes en parallèle.
WaitForEffectsCert
Exemplede parallélisation (pseudo-code) :
// Pseudo-code to parallelize effect wait
effectsChannel := make(chan Result, txCount)
for i := 0; i < txCount; i++ {
go func(txID int) {
// Wait for effect cert
result := waitForEffectsCert(txID)
effectsChannel <- result
}(i)
}
// Collect results
for i := 0; i < txCount; i++ {
result := <-effectsChannel
fmt.Printf("Effect for Transaction %d: %v\n", result.txID, result)
}
3.Utilisez l'TransactionBlock
API efficacement
*Blocs de transactions : au lieu d'envoyer des transactions individuelles, regroupez plusieurs opérations dans unbloc de transaction. Cela réduit les frais liés à l'envoi individuel de chaque transaction et peut accélérer le traitement.
*Soumission groupée : l'API de Sui vous permet d'envoyer plusieurs actions en une seule transaction, ce qui peut améliorer considérablement le débit. L'organisation des opérations en transactions plus importantes réduit le nombre d'WaitForEffectsCert
appels requis.
##4.Surveiller et ajuster la configuration du client su
- Si vous utilisez unclient Sui RPCpour envoyer des transactions, vérifiez si la configuration du client (telle que la taille des lots ou le délai d'expiration des demandes) est optimisée pour un débit élevé. *Taille du lot : L'ajustement de la taille des lots pour la soumission de plusieurs transactions peut contribuer à réduire les frais généraux. *Délais et récupérations : Assurez-vous que votre client est configuré pour gérer efficacement les délais d'attente et les nouvelles tentatives. Les problèmes de réseau ou la charge du serveur peuvent entraîner des retards. L'optimisation des délais d'attente et des politiques relatives aux nouvelles tentatives peut donc contribuer à améliorer les temps de réponse.
##5.Équilibrage de charge et partage
- Si vous avez affaire à unvolume élevé de transactions, pensez àéquilibrer la chargeou àpartagervos demandes. Répartissez vos transactions sur plusieurs nœuds ou clients pour éviter les blocages causés par une seule connexion.
- Cela peut être fait en distribuant différents ensembles de transactions à différentsvalidateurs Suioupoints de terminaison RPC, garantissant un traitement parallèle sur plusieurs ressources.
##6.Examiner les dépendances des transactions
- Si les transactions dépendent les unes des autres (par exemple, si une transaction doit avoir lieu avant une autre), vous devrez attendre les effets de chaque transaction de manière séquentielle. Cependant, si les transactions sontindépendantes, vous pouvez les envoyer en parallèle et attendre les effets indépendamment.
- Si possible, restructurez les transactions afin de réduire les interdépendances, en permettant une plus grande parallélisation.
##7.Optimiser les demandes RPC
*Regroupement de connexions : si vous effectuez plusieurs requêtes RPC, assurez-vous de réutiliser lesconnexions persistantespour éviter les frais liés à l'établissement de nouvelles connexions pour chaque demande. *Traitement par lots de requêtes : si le Sui RPC le prend en charge, envisagez deregrouper plusieurs demandes en une seulepour réduire les frais liés à plusieurs appels réseau aller-retour.
##8.Tenez compte des performances des nodes
*Charge du validateur : si vous envoyez des transactions à un seul nœud de validation Sui, assurez-vous que le nœud estcapable de gérer un TPSélevé. Vous devrez peut-être faire évoluer l'infrastructure ou répartir les demandes entre plusieurs validateurs pour améliorer les performances.
En résumé :
*Transactions parallèles : utilisez lesgoroutinesdans Go pour envoyer et attendre des transactions simultanément, réduisant ainsi la latence.
*Transactions par lots : regroupez plusieurs actions en une seule transaction pour réduire les frais généraux.
*Optimiser WaitForEffectsCert
: gérez plusieurs WaitForEffectsCert
appels simultanément pour améliorer le débit.
*Configuration du client : vérifiez les paramètres du client tels que le délai d'expiration et la taille des lots pour garantir des performances optimales.
*Mise à l'échelle de l'infrastructure : si nécessaire, répartissez la charge sur plusieurs validateurs Sui ou nœuds pour augmenter le TPS.
En appliquant ces stratégies, vous devriez être en mesure d'améliorer de manière significative le débit et les performances de votre récepteur Sui, le rendant ainsi plus adapté aux cas d'utilisation en temps réel.
Oui, lestransactions parallèlesaugmenteront votre TPS. Le design de Sui repose sur une exécution parallèle. Voici comment optimiser :
###Corrections rapides :
1.Envoyer des SMS simultanément— Utilisez des goroutines pour regrouper les transactions (Sui les traite en parallèle).
2.Ignorer WaitForEffectsCert
— Pour les TX non dépendants, utilisez :
RequestType: "ImmediateReturn" // Faster, but check status later
ProgrammableTransactionBlock
PTBs par lots — Combinez des actions en une seule.
Principaux gains : ✔Pas de conflits ? → Parallélisez librement (Sui gère automatiquement le verrouillage des objets). ✔Textes dépendants ? Regroupez en PTB ou ne séquencez que les étapes critiques.
Exemple de flux :
// Launch 100 TXs concurrently
for i := 0; i < 100; i++ {
go submitTx(txData[i])
}
Surveillez : -Pics de gazen cas de forte simultanéité. -Dépendances d'ordonnance(utilisez les PTB si les TX partagent des objets).
Oui, envoyez des transactions parallèles pour augmenter le TPS. WaitForEffectsCert
est lent car il attend un consensus un par un. Utilisez l'exécution simultanée avec des objets d'expéditeur ou des horodatages uniques pour éviter les conflits. Sui gère la parallélisation : il suffit de garantir des transactions indépendantes et de regrouper correctement.
###1. Traitement TX parallèle (essentiel)
// Worker pool pattern
func processInParallel(txChan <-chan *Transaction, workers int) {
var wg sync.WaitGroup
wg.Add(workers)
for i := 0; i < workers; i++ {
go func() {
defer wg.Done()
for tx := range txChan {
submitTx(tx) // Your TX submission logic
}
}()
}
wg.Wait()
}
Paramètres clés :
- Travailleurs optimaux =
2 * CPU cores
- Taille du lot =
50-100 TXs/worker
###2. Mode de confirmation plus rapide
Remplacer WaitForEffectsCert
par :
requestType := "WaitForLocalExecution" // 3-5x faster
// OR for max speed (risky):
requestType := "ImmediateReturn" // + async status checks
###3. Regroupement de connexions
import "github.com/valyala/fasthttp"
client := &fasthttp.Client{
MaxConnsPerHost: 1000, // Default is 512
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxIdleConnDuration: 30 * time.Second,
}
###4. Optimisations spécifiques à Sui ####Gestion des objets gazeus
// Pre-load 1000 gas objects
gasObjects := make(chan string, 1000)
go func() {
for i := 0; i < 1000; i++ {
obj := getNewGasObject() // Your implementation
gasObjects <- obj
}
}()
####Bâtiment TX
txBatch := make([]*Transaction, 0, 50)
for i := 0; i < 50; i++ {
txBatch = append(txBatch, buildTx())
}
submitParallel(txBatch) // Implement batch RPC
###5. Critères de performance | Approche | TPS (Go) | Latence | | -------------------| ---------| | Séquentiel | 50-100 | 500 ms+ | | Parallèle (10 travailleurs) | 800-1200 | 80 ms | | Lot (50 TX/RPC) | Plus de 3 000 | 200 ms |
###Contrôles critiques 1.Charge du noeud
watch -n 1 'curl -s http://localhost:9000/metrics | grep "rpc_queue"'
2.Gestion des erreurs
if errors.Is(err, sui.ErrTxQueueFull) {
time.Sleep(100 * time.Millisecond)
retry(tx)
}
Pour des performances maximales :
sui.NewClient(grpcDialOpts)
- UtilisezgRPCau lieu de JSON-RPC ()
- Activez lacompression :
dialOpts := []grpc.DialOption{
grpc.WithDefaultCallOptions(grpc.UseCompressor("gzip")),
}
Oui, si vous constatez un faible débit lors de l'utilisation de RequestType: "WaitForEffectsCert"
votre récepteur Sui basé sur Go, alorsl'envoi séquentiel de transactions est votre principal goulot d'étranglement. Pour augmenter significativement votre TPS (transactions par seconde), vous devez absolumentenvoyer des transactions en parallèleplutôt que d'attendre que chacune soit pleinement confirmée avant d'envoyer la suivante.
Le WaitForEffectsCert
mode attend que la transaction soit exécutée et que ses effets soient certifiés avant de revenir. C'estsûr mais lentementpour les applications à haut débit telles que les robinets, les NFT mints ou les robots DeFi. Lorsque vous attendez les effets un par un, vous limitez le débit au temps aller-retour par transaction, qui peut être de 1 à 2 secondes.
Voici comment vous pouvez l'accélérer :
✅ Meilleures pratiques pour augmenter le débit
*Battez et parallélisez les transactionsà l'aide de Goroutines.
- Utilisez le type de requête**"Aucune » ou « WaitForLocalExecution"**si vous pouvez tolérer une latence mineure lors de la vérification des effets.
- Limitez la simultanéité pour éviter d'atteindre les limites de débit RPC (par exemple, 20 à 50 TX parallèles selon le nœud).
- Préparez les transactions à l'avance en les utilisant
TransactionBlockBuilder
, signez-les et envoyez-les en parallèle.
Exemple de modèle en Go (conceptuel) :
for i := 0; i < txCount; i++ {
go func(i int) {
tx := BuildTx(i) // your custom tx builder
resp, err := suiClient.ExecuteTransaction(tx, "WaitForLocalExecution")
if err != nil {
log.Println("TX error:", err)
} else {
log.Println("TX confirmed:", resp.Digest)
}
}(i)
}
⚠️ Remarques :
- « WaitForLocalExecution » est beaucoup plus rapide et vous donne tout de même l'assurance que le nœud a vu le TX.
- Surveillez le mempool et bloquez la propagation si vous créez un bot en production.
- Utilisez unportefeuille chaud avec un bilan d'essence élevé, ou faites tourner plusieurs payeurs d'essence pour réduire les collisions.
En savoir plus sur les options d'exécution des transactions : https://docs.sui.io/build/transaction-types
Oui, l'envoi de transactions en parallèle peut améliorer considérablement votre débit. L'utilisation séquentielle de WaitForEffectScert pour chaque transaction vous ralentira. Regroupez plutôt vos transactions et traitez les réponses de manière asynchrone. Pensez également à utiliser WaitForLocalExecution uniquement lorsque cela est nécessaire. Optimisez en réutilisant les connexions et en ajustant les paramètres de simultanéité du SDK.
Si le TPS de votre expéditeur de transactions Sui basé à Go est faible, le goulot d'étranglement est probablement dû à l'envoi séquentiel des transactions avec RequestType : « WaitForEffectScert ». Ce type de demande attend d'être complètement finalisé avant de poursuivre, ce qui n'est pas optimisé pour le débit lorsqu'il est effectué une par une. Pour améliorer les performances, vous devez implémenter l'envoi de transactions en parallèle ou par lots.
La parallélisation permet à plusieurs transactions d'être en cours en même temps, en utilisant efficacement la capacité de Sui à traiter les transactions simultanément, en particulier lorsque les transactions concernent des objets disjoints. Vous devez implémenter un pool de travailleurs ou des goroutines pour soumettre des transactions simultanément. Assurez-vous de gérer correctement les nonce (numéros de séquence) ou les références aux objets afin de ne pas provoquer de conflits dans la propriété des objets.
Lorsque vous envoyez des transactions parallèles, évitez de superposer les objets d'entrée à moins que la logique du contrat n'autorise un accès partagé (par exemple, avec des références &mut). Soyez conscient du risque de conflit d'objets et assurez-vous que votre code gère correctement les nouvelles tentatives et les erreurs transitoires. Vous pouvez optimiser davantage en ajustant le niveau de simultanéité, en commençant petit (par exemple, 10 goroutines) et en augmentant en fonction des résultats.
Vous pouvez également envisager d'utiliser WaitForLocalExecution au lieu de WaitForEffectScert si vous souhaitez une confirmation légèrement plus rapide mais pouvez tolérer des résultats non finaux. Cependant, pour les mises à jour d'état sensibles ou les soldes destinés aux utilisateurs, WaitForEffectScert est plus sûr. Vous pouvez également pré-signer les transactions et les envoyer par rafales afin de minimiser la latence entre chaque demande.
Assurez-vous que votre nœud Sui ou votre point de terminaison RPC peut gérer un volume de demandes élevé. Pensez à utiliser un fournisseur RPC à charge équilibrée ou à hautes performances. Profilez votre client Go pour voir si la surcharge HTTP ou de sérialisation contribue à la latence. Utilisez des clients HTTP asynchrones tels que fasthttp ou des connexions gRPC persistantes, s'ils sont disponibles dans le SDK.
Enfin, enregistrez et analysez les transactions ayant échoué afin de détecter les goulots d'étranglement ou les modèles de contentieux. Avec un parallélisme approprié et des objets d'entrée bien répartis, vous devriez être en mesure d'améliorer considérablement votre TPS.
Si le TPS de votre expéditeur de transactions Sui basé à Go est faible, le goulot d'étranglement est probablement dû à l'envoi séquentiel des transactions avec RequestType : « WaitForEffectScert ». Ce type de demande attend d'être complètement finalisé avant de poursuivre, ce qui n'est pas optimisé pour le débit lorsqu'il est effectué une par une. Pour améliorer les performances, vous devez implémenter l'envoi de transactions en parallèle ou par lots.
Connaissez-vous la réponse ?
Veuillez vous connecter et la partager.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Gagne ta part de 1000 Sui
Gagne des points de réputation et obtiens des récompenses pour avoir aidé la communauté Sui à se développer.
- Pourquoi BCS exige-t-il un ordre de champs exact pour la désérialisation alors que les structures Move ont des champs nommés ?65
- Comment maximiser la détention de profits SUI : Sui Staking contre Liquid Staking515
- « Erreurs de vérification de sources multiples » dans les publications du module Sui Move - Résolution automatique des erreurs55
- Erreur Sui Move - Impossible de traiter la transaction Aucune pièce de gaz valide n'a été trouvée pour la transaction419
- Échec de la transaction Sui : objets réservés pour une autre transaction410