Publicación
Comparte tu conocimiento.
¿Debo enviar txs en paralelo? ,
chicos, tengo un receptor sui en el idioma go, pero el TPS es bajo, ¿cómo puedo hacerlo más rápido? ¿Debería tener que enviar txs en paralelo? , requestType: «waitForEffectsCert», es muy lento para uno por uno
- Sui
Respuestas
10Sí, el envío de transacciones en paralelo puede mejorar significativamente el rendimiento. El uso de waitForeEffectsCert para cada transacción de forma secuencial te ralentizará. En su lugar, agrupa tus transacciones y procesa las respuestas de forma asincrónica. Además, considera usar WaitForLocalExecution solo cuando sea necesario. Optimice reutilizando las conexiones y ajustando la configuración de simultaneidad del SDK.
Sí, usaTX paralelospara aumentar el TPS. WaitForEffectsCert``WaitForLocalExecution
añade latencia: cambia a las solicitudes o las envía por lotes.
// 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()
Optimizaciones clave:
1.Impuestos paralelos: usa rutinas (evita los límites de velocidad).
2.Solicitudes por lotes: combina los TX siempre que sea posible.
3. WaitForLocalExecution``WaitForEffectsCert
Confirmación más rápida: Prefiero en lugar de.
Sí, si tienestransacciones por segundo (TPS) lentas y tureceptor Suien Go está retrasado al procesar las transacciones de forma secuencial, el envío detransacciones paralelaspuede mejorar significativamente el rendimiento. La WaitForEffectsCert
operación****puede ser un obstáculo en la ejecución con un solo subproceso, pero al enviar las transacciones en paralelo y esperar a que surtan efecto se puede aumentar la eficacia. Este es un desglose de cómo abordar este problema:
1.Paralelice los envíos de transacciones
*Enviar transacciones paralelas: en lugar de esperar a que se produzcan los efectos de cada transacción de forma secuencial, puede enviar varias transacciones en paralelo. Esto permite que el sistema procese las transacciones de forma simultánea, lo que mejora el TPS.
- En Go, puedes usargoroutinespara enviar transacciones en paralelo, lo que puede ayudar a maximizar el rendimiento. Asegúrate de que las transacciones sean independientes entre sí (es decir, que no dependan del resultado de las demás).
Ejemplousandogoroutinespara enviar transacciones paralelas:
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
Optimizar
*Paralelizar la espera de los efectos: WaitForEffectsCert
puede ralentizar la ejecución secuencial porque espera a que los efectos de cada transacción se confirmen uno por uno. Para mitigar esto:
*Espera por lotes: en lugar de esperar a que se produzcan los efectos de cada transacción en serie, puedes gestionar y esperar a que surtan losefectos de varias transacciones a la vez. Esto reduce el tiempo de espera.
WaitForEffectsCert
*Usa la concurrencia: implementa un grupo de trabajadores o usagoroutinespara gestionar varias solicitudes en paralelo.
WaitForEffectsCert
Ejemplode paralelización (pseudocódigo):
// 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. TransactionBlock
Utilice la API de forma eficiente
*Bloques de transacciones: en lugar de enviar transacciones individuales, agrupe varias operaciones en unbloque de transacciones. Esto reduce la sobrecarga de enviar cada transacción de forma individual y puede acelerar el procesamiento.
*Envío masivo: la API de Sui te permite enviar varias acciones en una transacción, lo que puede mejorar significativamente el rendimiento. WaitForEffectsCert
La organización de las operaciones en transacciones más grandes reduce la cantidad de llamadas necesarias.
4.Supervise y ajuste la configuración del cliente Sui
- Si utilizas uncliente Sui RPCpara enviar transacciones, comprueba si la configuración del cliente (como el tamaño del lote o el tiempo de espera de las solicitudes) está optimizada para ofrecer un alto rendimiento. *Tamaño del lote: ajustar el tamaño de los lotes para enviar varias transacciones puede ayudar a reducir los gastos generales. *Tiempos de espera y reintentos: asegúrese de que su cliente esté preparado para gestionar los tiempos de espera y los reintentos de forma eficiente. Los problemas de red o la carga del servidor pueden provocar retrasos, por lo que la optimización de las políticas de tiempos de espera y reintentos puede ayudar a mejorar los tiempos de respuesta.
5.Equilibrio de carga y compartición
- Si tienes ungran volumen de transacciones, considera la posibilidad de balancear la cargaocompartir**tus solicitudes. Divida sus transacciones entre varios nodos o clientes para evitar los cuellos de botella causados por una sola conexión.
- Esto se puede hacer distribuyendo diferentes conjuntos de transacciones entre diferentesvalidadores Suiopuntos finales de RPC, lo que garantiza el procesamiento paralelo de varios recursos.
6.Revisa las dependencias de las transacciones
- Si las transacciones dependen unas de otras (por ejemplo, si una transacción debe realizarse antes que otra), tendrás que esperar a que surtan efecto cada transacción de forma secuencial. Sin embargo, si las transacciones sonindependientes, puedes enviarlas en paralelo y esperar a que surtan efecto de forma independiente.
- Si es posible, reestructure las transacciones para reducir las interdependencias y permitir una mayor paralelización.
7.Optimice las solicitudes de RPC
*Agrupación de conexiones: si realizas varias solicitudes de RPC, asegúrate de reutilizar lasconexiones persistentespara evitar la sobrecarga de establecer nuevas conexiones para cada solicitud. *Procesamiento por lotes de solicitudes: si el Sui RPC lo admite, considera la posibilidad de agrupar varias solicitudes en una**para reducir la sobrecarga de varias llamadas de red de ida y vuelta.
8.Considere el rendimiento del nodo
*Carga del validador: si vas a enviar transacciones a un único nodo validador de Sui, asegúrate de que el nodo seacapaz de gestionar un nivel de TPS alto. Es posible que necesite escalar la infraestructura o distribuir las solicitudes entre varios validadores para obtener un mejor rendimiento.
En resumen:
*Transacciones paralelas: usagoroutinesen Go para enviar y esperar transacciones al mismo tiempo, lo que reduce la latencia.
*Transacciones por lotes: agrupa varias acciones en una sola transacción para reducir la sobrecarga.
*Optimizar WaitForEffectsCert
: gestione varias WaitForEffectsCert
llamadas al mismo tiempo para mejorar el rendimiento.
*Configuración del cliente: compruebe los ajustes del cliente, como el tiempo de espera y el tamaño del lote, para garantizar un rendimiento óptimo.
*Escalado de la infraestructura: si es necesario, distribuya la carga entre varios nodos o validadores de Sui para aumentar el TPS.
Al aplicar estas estrategias, debería poder mejorar significativamente el rendimiento y el rendimiento de su receptor Sui, haciéndolo más adecuado para casos de uso en tiempo real.
Sí, lastransacciones paralelasaumentarán tu TPS. El diseño de Sui se basa en la ejecución paralela. A continuación se explica cómo optimizar:
###Soluciones rápidas:
1.Envía mensajes de texto simultáneamente: usa rutinas para procesar transacciones por lotes (Sui las procesa en paralelo).
2.Omitir WaitForEffectsCert
— Para TX no dependientes, utilice:
RequestType: "ImmediateReturn" // Faster, but check status later
ProgrammableTransactionBlock
PTBs por lotes: combina acciones en una sola.
Ganancias clave: ✔** ¿Sin conflictos?** → Paralelice libremente (Sui gestiona automáticamente los bloqueos de objetos). ✔** ¿TX dependientes?** Agrupe en PTB o secuencie solo los pasos críticos.
Flujo de ejemplo:
// Launch 100 TXs concurrently
for i := 0; i < 100; i++ {
go submitTx(txData[i])
}
Esté atento a: -Picas de gasoen condiciones de alta concurrencia. -Dependencias de pedidos(utilice PTB si las TX comparten objetos).
Sí, envía transacciones paralelas para aumentar el TPS. WaitForEffectsCert
es lento porque espera el consenso uno por uno. Utilice la ejecución simultánea con marcas de tiempo o objetos remitentes únicos para evitar conflictos. Sui se encarga de la paralelización; solo tiene que garantizar la independencia de las transacciones y los lotes de forma adecuada.
1. Procesamiento TX paralelo (esencial)**
// 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()
}
Ajustes clave:
- Trabajadores óptimos =
2 * CPU cores
- Tamaño del lote =
50-100 TXs/worker
2. Modo de confirmación más rápido**
WaitForEffectsCert
Sustituir por:
requestType := "WaitForLocalExecution" // 3-5x faster
// OR for max speed (risky):
requestType := "ImmediateReturn" // + async status checks
3. Agrupación de conexiones**
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. Optimizaciones específicas para Sui** ####Gestión de objetos de gas
// Pre-load 1000 gas objects
gasObjects := make(chan string, 1000)
go func() {
for i := 0; i < 1000; i++ {
obj := getNewGasObject() // Your implementation
gasObjects <- obj
}
}()
####Edificio TX por bates
txBatch := make([]*Transaction, 0, 50)
for i := 0; i < 50; i++ {
txBatch = append(txBatch, buildTx())
}
submitParallel(txBatch) // Implement batch RPC
###5. Puntos de referencia de rendimiento** | Enfoque | TPS (Go) | Latencia | ----------| ---------| | ---------| | Secuencial | 50-100 | 500ms+ | | Paralelo (10 trabajadores) | 800-1200 | 80 ms | | Lote (50 TX/RPC) | Más de 3000 | 200 ms |
###Comprobaciones críticas 1.Carga de nodos
watch -n 1 'curl -s http://localhost:9000/metrics | grep "rpc_queue"'
2.Gestión de errores
if errors.Is(err, sui.ErrTxQueueFull) {
time.Sleep(100 * time.Millisecond)
retry(tx)
}
Para un rendimiento máximo:
sui.NewClient(grpcDialOpts)
- UsagRPCen lugar de JSON-RPC ()
- Habilita lacompresión:
dialOpts := []grpc.DialOption{
grpc.WithDefaultCallOptions(grpc.UseCompressor("gzip")),
}
Sí, si observas un rendimiento bajo mientras lo utilizas RequestType: "WaitForEffectsCert"
en tu receptor Sui basado en Go, tu principal obstáculo esenviar transacciones de forma secuencial. Para aumentar de forma significativa tu TPS (transacciones por segundo), tienes queenviar transacciones en paralelo**en lugar de esperar a que cada una de ellas se confirme por completo antes de enviar la siguiente.
El WaitForEffectsCert
modo espera hasta que se ejecute la transacción y se certifiquen sus efectos antes de regresar. Esto esseguro pero lentopara aplicaciones de alto rendimiento, como faucets, NFT mints o DeFi bots. Cuando esperas a que se produzcan los efectos uno por uno, estás limitando el rendimiento al tiempo de ida y vuelta por transacción, que puede ser de 1 a 2 segundos.
A continuación, te explicamos cómo puedes acelerarlo:
✅ Mejores prácticas para aumentar el rendimiento
*Agrupa y paraleliza las transaccionescon Goroutines.
- Usa el tipo de solicitud**"None» o «WaitForLocalExecution"**si puedes tolerar una latencia leve en la verificación de efectos.
- Limite la concurrencia para evitar alcanzar los límites de velocidad del RPC (por ejemplo, de 20 a 50 TX en paralelo, según el nodo).
- Prepare las transacciones con antelación utilizándolas
TransactionBlockBuilder
, fírmelas y compártalas en paralelo.
Ejemplo de patrón en Go (conceptual) :
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)
}
⚠️ Notas:
- «WaitForLocalExecution» es mucho más rápido y, aun así, te da la confianza de que el nodo vio el TX.
- Supervise el mempool y bloquee la propagación si está creando un bot de nivel de producción.
- Usa una cartera barata con un alto balance de gasol**o rota varios pagadores de gasolina para reducir las colisiones en cualquier momento.
Más información sobre las opciones de ejecución de transacciones: https://docs.sui.io/build/transaction-types
Sí, el envío de transacciones en paralelo puede mejorar significativamente el rendimiento. El uso de waitForeEffectsCert para cada transacción de forma secuencial te ralentizará. En su lugar, agrupa tus transacciones y procesa las respuestas de forma asincrónica. Además, considera usar WaitForLocalExecution solo cuando sea necesario. Optimice reutilizando las conexiones y ajustando la configuración de simultaneidad del SDK.
Si tienes un nivel de TPS bajo en tu remitente de transacciones Sui basado en Go, es probable que el cuello de botella se deba a que las transacciones se envían de forma secuencial con RequestType: «waitForEffectsCert». Este tipo de solicitud espera a que finalice por completo antes de continuar, por lo que no está optimizado para el rendimiento cuando se realiza de una en una. Para mejorar el rendimiento, debes implementar el envío de transacciones en paralelo o por lotes.
La paralelización permite que varias transacciones estén en marcha al mismo tiempo, utilizando de manera eficaz la capacidad de Sui para procesar transacciones de forma simultánea, especialmente cuando las transacciones tocan objetos disjuntos. Deberías implementar un grupo de trabajadores o rutinas para enviar las transacciones de forma simultánea. Asegúrese de gestionar correctamente las referencias a objetos o números de secuencia para no provocar conflictos en la propiedad de los objetos.
Cuando envíes transacciones paralelas, evita la superposición de objetos de entrada, a menos que la lógica del contrato permita el acceso compartido (por ejemplo, con referencias &mut). Tenga en cuenta la posibilidad de que haya conflictos de objetos y asegúrese de que su código gestione correctamente los reintentos y los errores transitorios. Puedes optimizar aún más ajustando el nivel de concurrencia, empezando con algo pequeño (por ejemplo, 10 rutinas) y escalándolo en función de los resultados.
Además, puedes usar waitForLocalExecution en lugar de waitForEffectsCert si quieres que la confirmación sea un poco más rápida, pero puedes tolerar que los resultados no sean definitivos. Sin embargo, en el caso de actualizaciones de estado delicadas o saldos orientados al usuario, WaitForEffectsCert es más seguro. También puedes firmar previamente las transacciones y enviarlas en ráfagas para minimizar la latencia entre cada solicitud.
Asegúrate de que tu nodo Sui o punto final de RPC pueda gestionar un volumen de solicitudes elevado. Considera la posibilidad de utilizar un proveedor de RPC de alto rendimiento o con equilibrio de carga. Crea un perfil de tu cliente Go para ver si la sobrecarga de HTTP o de serialización contribuye a la latencia. Usa clientes HTTP asíncronos, como fastttp, o conexiones gRPC persistentes, si están disponibles en el SDK.
Por último, registra y analiza las transacciones fallidas para detectar cuellos de botella o patrones de contención. Con el paralelismo adecuado y los objetos de entrada bien distribuidos, debería poder mejorar significativamente su TPS.
Si tienes un nivel de TPS bajo en tu remitente de transacciones Sui basado en Go, es probable que el cuello de botella se deba a que las transacciones se envían de forma secuencial con RequestType: «waitForEffectsCert». Este tipo de solicitud espera a que finalice por completo antes de continuar, por lo que no está optimizado para el rendimiento cuando se realiza de una en una. Para mejorar el rendimiento, debes implementar el envío de transacciones en paralelo o por lotes.
Sabes la respuesta?
Inicie sesión y compártalo.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Gana tu parte de 1000 Sui
Gana puntos de reputación y obtén recompensas por ayudar a crecer a la comunidad de Sui.
- ¿Por qué BCS requiere un orden de campo exacto para la deserialización cuando las estructuras Move tienen campos con nombre?65
- Cómo maximizar la retención de ganancias SUI: Sui Staking versus Liquid Staking515
- «Errores de verificación de múltiples fuentes» en las publicaciones del módulo Sui Move: resolución automática de errores55
- Error de movimiento: no se puede procesar la transacción No se han encontrado monedas de gasolina válidas para la transacción419
- Fallo en la transacción Sui: objetos reservados para otra transacción410