La latencia de RPC en Sui está dominada por la distancia geográfica, la infraestructura compartida vs dedicada y el protocolo de API (JSON-RPC vs gRPC vs GraphQL). La finalidad de ~400ms de Sui establece un presupuesto de respuesta práctico. Este artículo proporciona un script de medición reproducible, guía de optimización (prefiere gRPC, usa multiGet, pagina) y distingue afirmaciones documentadas de benchmarks independientes.
Respuesta Directa: ¿Qué Determina la Latencia de RPC en Sui?
La latencia de RPC en Sui es el tiempo entre enviar una solicitud y recibir una respuesta, y está dominada por tres factores: la distancia geográfica al endpoint, si el endpoint es compartido o dedicado, y—críticamente—el protocolo de API que uses. El JSON-RPC heredado sobre HTTP es el más lento, mientras que las interfaces nativas de gRPC y GraphQL de Sui pueden reducir significativamente la latencia para la misma consulta. La finalidad de ~400ms de Sui significa que para la mayoría de las operaciones de lectura, la red en sí no es el cuello de botella; la capa RPC lo es. Para optimizar, prefiere gRPC donde sea compatible, usa endpoints multiGet para agrupar consultas y pagina eficientemente.
Este artículo explica los mecanismos detrás de la latencia de RPC en Sui, proporciona un script de medición reproducible que puedes ejecutar contra cualquier endpoint y ofrece estrategias de optimización concretas. Separamos el comportamiento documentado del protocolo de los benchmarks independientes y de tus propias mediciones, para que puedas tomar decisiones informadas sin depender de afirmaciones de proveedores.
La Arquitectura de Sui y su Impacto en la Latencia de RPC
Sui es una blockchain de prueba de participación delegada con un novedoso modelo de datos centrado en objetos. Las transacciones se procesan en paralelo y la finalidad se logra en aproximadamente 400ms (como se documenta en los documentos oficiales de Sui). Esto significa que cuando consultas la cadena por los efectos de una transacción, los datos están disponibles casi inmediatamente después del envío. Sin embargo, la capa RPC puede agregar una latencia significativa dependiendo de cómo accedas a esos datos.
Sui expone tres superficies de API principales: JSON-RPC (HTTP), gRPC y GraphQL. JSON-RPC es la interfaz heredada, ampliamente compatible pero verbosa e ineficiente para consultas complejas. gRPC utiliza HTTP/2 y serialización binaria (protobuf), reduciendo el tamaño del payload y la sobrecarga de conexión. GraphQL te permite solicitar exactamente los campos que necesitas, evitando la sobrecarga de datos. Para aplicaciones sensibles a la latencia, gRPC es generalmente el más rápido, seguido de GraphQL, siendo JSON-RPC el más lento.
Los patrones de consulta más pesados son aquellos que obtienen grandes cantidades de datos, como queryTransactionBlocks con muchos filtros, o bucles que llaman a getTransactionBlock para cada ID de transacción. Estos patrones amplifican la latencia porque cada solicitud incurre en tiempo de ida y vuelta de red y procesamiento en el servidor. Los endpoints multiGet de Sui (por ejemplo, multiGetCoins, multiGetTransactionBlocks) están diseñados para agrupar estas consultas en una sola solicitud, reduciendo drásticamente la latencia.
- Finalidad de Sui: ~400ms (documentado por documentos de Sui).
- Protocolos de API: JSON-RPC (HTTP/1.1), gRPC (HTTP/2), GraphQL.
- Patrones pesados:
queryTransactionBlocks, bucles de llamadasgetindividuales. - Agrupación:
multiGetCoins,multiGetTransactionBlocksreducen los viajes de ida y vuelta.
Medición de la Latencia de RPC en Sui: Un Script Reproducible
Para medir la latencia con precisión, necesitas un script que envíe solicitudes controladas y registre los tiempos de respuesta. A continuación se muestra un script de Node.js que mide tres tipos de llamadas: queryChainIdentifier (ligero), getTotalTransactionBlocks (medio) y multiGetCoins (más pesado). También mide una llamada gRPC si tienes el cliente @mysten/sui.js con gRPC habilitado (nota: el soporte de gRPC varía según el proveedor; verifica las capacidades de tu endpoint).
Ejecuta este script contra el endpoint de tu elección. Registra los resultados en la tabla proporcionada. Este es un método para que verifiques el rendimiento, no un benchmark de proveedor. La ubicación del endpoint, las condiciones de red y la carga del servidor causarán variación.
// guarda como measure-sui-latency.js
// Ejecuta: node measure-sui-latency.js <RPC_URL> [--grpc]
const https = require('https');
const url = process.argv[2] || 'https://fullnode.mainnet.sui.io';
const useGrpc = process.argv.includes('--grpc');
function jsonRpcCall(method, params) {
return new Promise((resolve, reject) => {
const body = JSON.stringify({ jsonrpc: '2.0', id: 1, method, params });
const start = Date.now();
const req = https.request(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' }
}, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
const latency = Date.now() - start;
resolve({ status: res.statusCode, latency, data: JSON.parse(data) });
});
});
req.on('error', reject);
req.write(body);
req.end();
});
}
async function measureGrpc() {
// Requiere @mysten/sui.js y un endpoint compatible con gRPC
const { SuiClient, getFullnodeUrl } = require('@mysten/sui.js/client');
const client = new SuiClient({ url, transport: 'grpc' });
const start = Date.now();
await client.getChainIdentifier();
return Date.now() - start;
}
(async () => {
console.log(`Endpoint: ${url}`);
console.log('Ejecutando 5 iteraciones cada uno...\n');
const results = {};
// Mediciones JSON-RPC
for (const [name, method, params] of [
['queryChainIdentifier', 'sui_getChainIdentifier', []],
['getTotalTransactionBlocks', 'sui_getTotalTransactionBlocks', []],
['multiGetCoins', 'sui_multiGetCoins', ['0x0000000000000000000000000000000000000000000000000000000000000000', null, 10]]
]) {
const latencies = [];
for (let i = 0; i < 5; i++) {
const res = await jsonRpcCall(method, params);
latencies.push(res.latency);
}
results[name] = latencies;
console.log(`${name}: promedio ${(latencies.reduce((a,b)=>a+b)/latencies.length).toFixed(0)}ms, min ${Math.min(...latencies)}ms, max ${Math.max(...latencies)}ms`);
}
if (useGrpc) {
const latencies = [];
for (let i = 0; i < 5; i++) {
latencies.push(await measureGrpc());
}
results['gRPC queryChainIdentifier'] = latencies;
console.log(`gRPC queryChainIdentifier: promedio ${(latencies.reduce((a,b)=>a+b)/latencies.length).toFixed(0)}ms, min ${Math.min(...latencies)}ms, max ${Math.max(...latencies)}ms`);
}
console.log('\nTabla de resultados (completa con los tuyos):');
console.log('| Llamada | Promedio (ms) | Mínimo (ms) | Máximo (ms) |');
console.log('|---------|---------------|-------------|-------------|');
for (const [name, lats] of Object.entries(results)) {
console.log(`| ${name} | ${(lats.reduce((a,b)=>a+b)/lats.length).toFixed(0)} | ${Math.min(...lats)} | ${Math.max(...lats)} |`);
}
})();Interpretando tus Resultados: Qué Esperar
El script genera latencias promedio, mínimas y máximas para cada llamada. Aquí te mostramos cómo interpretarlas:
Una llamada queryChainIdentifier debería ser la más rápida, a menudo por debajo de 100ms en un endpoint bien conectado. getTotalTransactionBlocks puede ser ligeramente más lenta porque requiere agregación en el servidor. multiGetCoins con un límite grande puede ser significativamente más lenta si el servidor tiene que obtener muchos objetos de monedas. Si ves latencias consistentemente por encima de 500ms, tu endpoint puede estar sobrecargado o geográficamente distante.
La finalidad de ~400ms de Sui significa que para verificaciones de estado de transacciones, un tiempo de respuesta de 400ms o menos es aceptable. Para aplicaciones con muchas lecturas, apunta a una latencia p95 por debajo de 200ms para consultas simples. Si tus mediciones superan estos umbrales, considera las optimizaciones en la siguiente sección.
- Rangos esperados (documentados / varían según el proveedor): consultas simples <100ms, medianas <200ms, pesadas <500ms en endpoints dedicados.
- Si p95 > 500ms, investiga la carga del endpoint o la ruta de red.
- Compara JSON-RPC vs gRPC: gRPC a menudo tiene una latencia 20-50% menor para la misma consulta (documentado por documentos de Sui y benchmarks independientes).
Optimizando la Velocidad de Consulta de RPC en Sui
Una vez que tengas mediciones de referencia, aplica estas optimizaciones para reducir la latencia:
- Prefiere gRPC sobre JSON-RPC: gRPC utiliza HTTP/2 y serialización binaria, reduciendo la sobrecarga. Muchos proveedores soportan gRPC en el mismo endpoint (por ejemplo,
https://fullnode.mainnet.sui.iocon puerto gRPC 443). Consulta la documentación de tu proveedor.
- Usa endpoints multiGet: En lugar de hacer bucles sobre
getCoinogetTransactionBlock, usamultiGetCoinsomultiGetTransactionBlockspara agrupar solicitudes. Esto reduce los viajes de ida y vuelta de N a 1.
- Estrategia de paginación: Usa paginación vertical (límite/desplazamiento) para conjuntos de datos pequeños, pero para conjuntos grandes, usa paginación horizontal (basada en cursor) para evitar desplazamientos profundos que causan escaneo en el servidor.
queryTransactionBlocksde Sui soporta paginación basada en cursor.
- Cachea respuestas: Para datos que no cambian con frecuencia (por ejemplo, identificador de cadena, bloques de transacciones totales), cachea a nivel de cliente o proxy. Usa encabezados de caché HTTP si están disponibles.
- Usa suscripciones: Para actualizaciones en tiempo real, usa suscripciones WebSocket en lugar de sondeos. Esto reduce la latencia para aplicaciones basadas en eventos.
- Elige un endpoint dedicado: Los endpoints compartidos están sujetos a vecinos ruidosos. Un endpoint dedicado (por ejemplo, a través del servicio de API de OnFinality) proporciona un rendimiento consistente.
Fallos Comunes y Soluciones
Al medir u optimizar la latencia de RPC en Sui, puedes encontrar estos problemas:
- Tiempos de espera agotados: Si tus solicitudes agotan el tiempo de espera, aumenta el tiempo de espera en tu cliente. El JSON-RPC de Sui puede ser lento para consultas pesadas; considera usar gRPC que tiene mejor transmisión.
- Límite de velocidad: Muchos proveedores imponen límites de velocidad. Si recibes errores 429, implementa retroceso exponencial o usa un proveedor con límites más altos (ver límites de velocidad de RPC de Sui y unidades de cómputo).
- gRPC no soportado: No todos los endpoints soportan gRPC. Consulta los documentos del proveedor o usa un servicio como el servicio de API de OnFinality que ofrece ambos.
- Paginación incorrecta: Usar
limityoffseten conjuntos de datos grandes puede causar respuestas lentas. Cambia a paginación basada en cursor usandonextCursor.
- Congestión de red: Si estás en una región diferente a la del endpoint, la latencia aumenta. Usa un proveedor con caché de borde global o implementa tu propio nodo en una región cercana a tus usuarios.
Compensaciones y Limitaciones
Aunque gRPC es más rápido, requiere un cliente que soporte protobuf, lo que puede agregar complejidad. GraphQL es flexible pero puede ser más lento que gRPC si sobrecargas la consulta. JSON-RPC es universalmente compatible pero verboso.
El almacenamiento en caché puede introducir datos obsoletos; usa TTLs apropiados. Las suscripciones mantienen conexiones persistentes, lo que puede aumentar el uso de recursos.
Los benchmarks independientes (por ejemplo, comparenodes) muestran que el rendimiento del proveedor varía ampliamente. Siempre mide tu propia carga de trabajo. Los documentos oficiales de Sui proporcionan características de rendimiento, pero la latencia del mundo real depende de tu caso de uso específico y las condiciones de red.
Próximos Pasos: Lecturas Adicionales y Herramientas
Ahora que entiendes la latencia de RPC en Sui, explora estos recursos para profundizar tu conocimiento:
- Descripción general de la red Sui - Aprende sobre la arquitectura y los endpoints de Sui.
- Guía de RPC de Sui (Asistente de RPC) - Obtén recomendaciones específicas para el uso de RPC de Sui.
- Límites de velocidad de RPC de Sui y unidades de cómputo - Comprende cómo los límites de velocidad afectan la latencia.
- Centro de aprendizaje de OnFinality - Más tutoriales y guías.
- Precios de RPC - Compara costos de endpoints dedicados vs compartidos.
- Servicio de API - Explora los endpoints RPC gestionados de OnFinality.