Допис
Діліться своїми знаннями.
Чи потрібно мені надсилати паралельні txs? ,
хлопці, у мене є приймач sui на мові go, але tps низький, як я можу зробити це швидше, чи потрібно мені надсилати паралельні tx? , RequestType: «WaitForEffectsCert», дуже повільний для одного
- Sui
Відповіді
10Так, паралельна відправка транзакцій може значно покращити вашу пропускну здатність. Використання WaitForEffectsCert для кожної транзакції послідовно сповільнить вас. Натомість пакетуйте транзакції та обробляйте відповіді асинхронно. Крім того, розгляньте можливість використання waitForLocalExecution лише тоді, коли це необхідно. Оптимізуйте за допомогою повторного використання з'єднань та налаштування параметрів паралельності SDK.
Так, використовуйтепаралельні TXSдля підвищення TPS. WaitForEffectsCert
додає затримку — перемикання на WaitForLocalExecution
або пакетні запити.
// 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()
Ключові оптимізації:
1.Паралельні TXS: Використовуйте горотини (уникайте обмежень швидкості).
2.Пакетні запити: Об'єднуйте TX, де це можливо.
3. WaitForLocalExecution``WaitForEffectsCert
Швидше підтвердження: Віддавайте перевагу.
Так, якщо ви відчуваєте повільнітранзакції за секунду (TPS), а вашприймач Suiв Go відстає при послідовній обробці транзакцій, надсиланняпаралельних транзакційможе значно покращити пропускну здатність. Операці WaitForEffectsCert
я****може бути вузьким місцем у однопотоковому виконанні, але паралелізація подання транзакцій та очікування ефектів може підвищити ефективність. Ось розбивка, як вирішити це:
1.Паралелізуйте подання транзакцій
*Надіслати паралельні транзакції: Замість того, щоб чекати наслідків кожної транзакції послідовно, ви можете надсилати кілька транзакцій паралельно. Це дозволяє системі обробляти транзакції одночасно, покращуючи TPS.
- У Go ви можете використовуватиgoroutinesдля паралельного надсилання транзакцій, що може допомогти максимізувати пропускну здатність. Переконайтеся, що транзакції незалежні одна від одної (тобто вони не залежать від результату одна одної).
Прикладвикористанняgoroutinesдля надсилання паралельних транзакцій:
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
Оптимізуй
*Паралелізація очікування ефектів: Може WaitForEffectsCert
уповільнити послідовне виконання, оскільки чекає, поки ефекти кожної транзакції будуть підтверджені один за одним. Щоб пом'якшити це:
*Пакетне очікування: Замість того, щоб чекати наслідків кожної транзакції послідовно, ви можете керувати та чекатиефектів кількох транзакцій одразу раз. Це скорочує час очікування.
WaitForEffectsCert
*Використовуйте одночасність: Реалізуйте пул працівників або використовуйтеgoroutinesдля паралельної обробки кількох запитів.
WaitForEffectsCert
Прикладдля паралелізації (псевдокод):
// 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
API
*Блоки транзакцій: Замість надсилання окремих транзакцій згрупуйте кілька операцій ублок транзакції. Це зменшує накладні витрати на відправку кожної транзакції окремо та може прискорити обробку.
*Масове надсилання: API Sui дозволяє надсилати кілька дій за одну транзакцію, що може значно покращити пропускну здатність. Організація операцій у більші транзакції зменшує кількість WaitForEffectsCert
необхідних дзвінків.
4.** Моніторинг та налаштування конфігурації клієнта Sui**
- Якщо ви використовуєклієнт Sui RPCдля надсилання транзакцій, перевірте, чи оптимізована конфігурація клієнта (наприклад, розмір партії або тайм-аут запиту) для високої пропускної здатності. *Розмір партії: коригування розмірів партій для подання декількох транзакцій може допомогти зменшити накладні витрати. *Таймаути та вилучення: Переконайтеся, що ваш клієнт налаштований на ефективну обробку тайм-аутів та повторних спроб. Проблеми з мережею або завантаження сервера можуть спричинити затримки, тому оптимізація тайм-аутів та політик повторної спроби може допомогти покращити час відповіді.
5.Балансування навантаження
- Якщо ви маєте справу звеликим обсягом транзакцій, подумайте про балансування навантаженняабоподілити**ваші запити. Розділіть свої транзакції на кілька вузлів або клієнтів, щоб уникнути вузьких місць, спричинених одним з'єднанням.
- Це можна зробити шляхом розподілу різних наборів транзакцій на різніSui валідаториабокінцеві точки RPC, забезпечуючи паралельну обробку на кількох ресурсах.
6.Перегляньте залежності транзакції
- Якщо транзакції залежать один від одного (наприклад, якщо одна транзакція повинна відбутися перед іншою), вам потрібно буде чекати наслідків кожної транзакції послідовно. Однак, якщо транзакції єнезалежними, ви можете надсилати їх паралельно і чекати ефектів самостійно.
- Якщо можливо, реструктуруйте транзакції, щоб зменшити взаємозалежності, дозволяючи більшу паралелізацію.
7.** Оптимізація запитів RPC**
*Об'єднання з'єднань: Якщо ви надсилаєте декілька запитів RPC, переконайтеся, що ви повторно використовуєтепостійні з'єднання, щоб уникнути накладних витрат на встановлення нових з'єднань для кожного запиту. *Пакування запитів: Якщо Sui RPC підтримує це, подумайте про те, щобпакетувати кілька запитів в один, щоб зменшити витрати на кілька мережевих дзвінків в обидві сторони.
8.Враховуйте продуктивність вузла
*Навантаження валідатора: Якщо ви надсилаєте транзакції на один вузол валідатора Sui, переконайтеся, що вузолздатний обробляти високі TPS. Можливо, вам доведеться масштабувати інфраструктуру або розподілити запити між кількома валідаторами для кращої продуктивності.
Підсумовуючи:
*Паралельні транзакції: Використовуйтеgoroutinesв Go, щоб одночасно надсилати та чекати транзакцій, зменшуючи затримку.
*Пакетні транзакції: Групуйте кілька дій в одну транзакцію, щоб зменшити накладні витрати.
*Оптимізу WaitForEffectsCert
йте: обробляти кілька WaitForEffectsCert
дзвінків одночасно для підвищення пропускної здатності.
*Конфігурація клієнта: Перевірте налаштування клієнта, такі як тайм-аут та розмір партії, щоб забезпечити оптимальну продуктивність.
*Масштабування інфраструктури: При необхідності розподіліть навантаження між кількома валідаторами або вузлами Sui, щоб збільшити TPS.
Застосовуючи ці стратегії, ви зможете значно покращити пропускну здатність та продуктивність вашого приймача Sui, зробивши його більш придатним для випадків використання в режимі реального часу.
Так,паралельні транзакціїпідвищать ваш TPS. Дизайн Суй процвітає при паралельному виконанні. Ось як оптимізувати:
###Швидкі виправлення:
1.Одночасне надсилання ТХ— Використовуйте горотини для пакетних транзакцій (Sui обробляє їх паралельно).
2.Пропустити WaitForEffectsCert
— Для незалежних TX використовуйте:
RequestType: "ImmediateReturn" // Faster, but check status later
ProgrammableTransactionBlock
Пакетні PTB— Об'єднайте дії в одному.
Ключові переваги: ✔Ніяких конфліктів? → Паралелізуйте вільно (Sui обробляє блокування об'єктів автоматично). ✔Залежні TX? Згрупуйте в PTB або послідовно виконуйте лише критичні кроки.
Приклад потоку:
// Launch 100 TXs concurrently
for i := 0; i < 100; i++ {
go submitTx(txData[i])
}
Слідкуйте за: -Спки газупри високій паралельності. -Залежності замовлення(використовуйте PTB, якщо TX мають спільні об'єкти).
Так, надсилайте паралельні транзакції для збільшення TPS. WaitForEffectsCert
повільний, тому що чекає консенсусу один за одним. Використовуйте одночасне виконання з унікальними об'єктами відправника або мітками часу, щоб уникнути конфліктів. Sui обробляє паралелізацію - просто забезпечуйте незалежні транзакції та належним чином партію.
###1. Паралельна обробка TX (необхідна)
// 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()
}
Ключові налаштування:
- Оптимальні працівники =
2 * CPU cores
- Розмір партії =
50-100 TXs/worker
###2. Швидший режим підтвердження
Замі WaitForEffectsCert
нити на:
requestType := "WaitForLocalExecution" // 3-5x faster
// OR for max speed (risky):
requestType := "ImmediateReturn" // + async status checks
###3. Об'єднання з'єднань
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. Оптимізація, специфічна для SUI ####Управління газовими об'єктами
// Pre-load 1000 gas objects
gasObjects := make(chan string, 1000)
go func() {
for i := 0; i < 1000; i++ {
obj := getNewGasObject() // Your implementation
gasObjects <- obj
}
}()
####Пакетне будівництво TX
txBatch := make([]*Transaction, 0, 50)
for i := 0; i < 50; i++ {
txBatch = append(txBatch, buildTx())
}
submitParallel(txBatch) // Implement batch RPC
###5. Орієнтовні показники продуктивності | Підхід | TPS (Go) | Затримка | | -------------------| ---------| | Послідовний | 50-100 | 500мс+ | | Паралельний (10 робітників) | 800-1200 | 80 мс | | Пакетна (50 TX/RPC) | 3000+ | 200 мс |
###Критичні перевіри 1.Навантаження вузла
watch -n 1 'curl -s http://localhost:9000/metrics | grep "rpc_queue"'
2.Обробка помилки
if errors.Is(err, sui.ErrTxQueueFull) {
time.Sleep(100 * time.Millisecond)
retry(tx)
}
Для максимальної продуктивності:
sui.NewClient(grpcDialOpts)
- ВикористовуйтеGRPCзамість JSON-RPC ()
- Увімкнутистиснення:
dialOpts := []grpc.DialOption{
grpc.WithDefaultCallOptions(grpc.UseCompressor("gzip")),
}
Так, якщо ви бачите низьку пропускну здатність під час використання RequestType: "WaitForEffectsCert"
у своєму приймачі Sui на базі GO, топослідовне надсилання транзакцій є вашим головним вузьким місцем. Щоб значно збільшити ваш TPS (транзакції в секунду), вам абсолютно потрібнонадсилати транзакції паралельном**, а не чекати, поки кожна з них повністю підтвердиться, перш ніж надсилати наступну.
Реж WaitForEffectsCert
им чекає, поки транзакція не буде виконана, а її ефекти будуть сертифіковані перед поверненням — цебезпечно, але повільнодля високопродуктивних додатків, таких як крани, монети NFT або боти DeFi. Коли ви чекаєте ефектів один за одним, ви обмежуєте пропускну здатність часом в обидва кінці за транзакцію, який може становити 1-2 секунди.
Ось як ви можете прискорити це:
✅ Найкращі практики підвищення пропускної здатності
*Пакетуйте та паралелізуйте транзакціїза допомогою Goroutines.
- Використовуйте тип запиту**"None» або «WaitForLocalExecution"**, якщо ви можете терпіти незначну затримку в фактичній перевірці.
- Обмежте паралельність, щоб уникнути досягнення лімітів швидкості RPC (наприклад, 20—50 паралельних TX залежно від вузла).
- Підготуйте транзакції заздалегідь, використовуючи
TransactionBlockBuilder
, підписуйте їх та просувайте їх паралельно.
Приклад шаблону в Go (концептуальний) :
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)
}
⚠️ Примітки:
- «WaitForLocalExecution» набагато швидше і все ще дає вам впевненість, що вузол побачив TX.
- Відстежуйте мемпул та поширення блоків, якщо ви створюєте бота на рівні виробництва.
- Використовуйтегарячий гаманець з високим балансом газуабо обертайте кількох платників газу, щоб зменшити випадкове зіткнення.
Детальніше про варіанти виконання транзакції: https://docs.sui.io/build/transaction-types
Так, паралельна відправка транзакцій може значно покращити вашу пропускну здатність. Використання WaitForEffectsCert для кожної транзакції послідовно сповільнить вас. Натомість пакетуйте транзакції та обробляйте відповіді асинхронно. Крім того, розгляньте можливість використання waitForLocalExecution лише тоді, коли це необхідно. Оптимізуйте за допомогою повторного використання з'єднань та налаштування параметрів паралельності SDK.
Якщо ви відчуваєте низький TPS у відправника транзакцій Sui на базі GO, вузьке місце, ймовірно, пов'язане з послідовним надсиланням транзакцій за допомогою requestType: «waitForEffectsCert». Цей тип запиту чекає на повну остаточність, перш ніж продовжувати, що не оптимізується для пропускної здатності, коли виконується по одному. Для підвищення продуктивності слід реалізувати паралельне або пакетне надсилання транзакцій.
Паралелізація дозволяє одночасно здійснювати кілька транзакцій, ефективно використовуючи здатність Sui обробляти транзакції одночасно, особливо коли транзакції стосуються несумісних об'єктів. Для одночасного надсилання транзакцій слід реалізувати пул працівників або горовини. Переконайтеся, що ви правильно керуєте nonce (порядковими номерами) або посиланнями на об'єкти, щоб не викликати конфліктів у власності на об'єкти.
Під час надсилання паралельних транзакцій уникайте перекриття вхідних об'єктів, якщо логіка контракту не дозволяє спільний доступ (наприклад, за допомогою посилань &mut). Будьте в курсі потенційного конфлікту об'єктів і переконайтеся, що ваш код грамотно обробляє повторні спроби та перехідні помилки. Ви можете додатково оптимізувати, налаштувавши рівень паралельності - починаючи з малого (наприклад, 10 горотинів) та масштабуючи на основі результатів.
Крім того, ви можете розглянути можливість використання waitForLocalExecution замість waitForEffectsCert, якщо ви хочете трохи швидше підтвердити, але можете терпіти неостаточні результати. Однак для чутливих оновлень стану або балансів, що стосуються користувача, WaitForEffectsCert є більш безпечним. Ви також можете попередньо підписувати транзакції та надсилати їх послідовно, щоб мінімізувати затримку між кожним запитом.
Переконайтеся, що ваш вузол Sui або кінцева точка RPC може обробляти високий обсяг запитів — розгляньте можливість використання збалансованого навантаження або високопродуктивного постачальника RPC. Профілізуйте свій клієнт Go, щоб перевірити, чи витрати на HTTP або серіалізацію сприяють затримці. Використовуйте асинхронні HTTP-клієнти, такі як fasthttp або постійні з'єднання gRPC, якщо вони доступні в SDK.
Нарешті, реєструйте та аналізуйте невдалі транзакції, щоб виявити вузькі місця або моделі суперечок. З належним паралелізмом та добре розподіленими об'єктами введення ви повинні мати можливість значно покращити свій TPS.
Якщо ви відчуваєте низький TPS у відправника транзакцій Sui на базі GO, вузьке місце, ймовірно, пов'язане з послідовним надсиланням транзакцій за допомогою requestType: «waitForEffectsCert». Цей тип запиту чекає на повну остаточність, перш ніж продовжувати, що не оптимізується для пропускної здатності, коли виконується по одному. Для підвищення продуктивності слід реалізувати паралельне або пакетне надсилання транзакцій.
Ви знаєте відповідь?
Будь ласка, увійдіть та поділіться нею.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Зароби свою частку з 1000 Sui
Заробляй бали репутації та отримуй винагороди за допомогу в розвитку спільноти Sui.
- Чому BCS вимагає точного порядку полів для десеріалізації, коли структури Move мають названі поля?65
- Як максимізувати прибуток від SUI: Sui Staking проти Liquid Staking515
- Помилки перевірки кількох джерел» у публікаціях модуля Sui Move - автоматичне вирішення помилок55
- Помилка Sui Move - Неможливо обробити транзакцію Не знайдено дійсних газових монет для транзакції419
- Невдала операція Sui: об'єкти, зарезервовані для іншої транзакції410