Пост
Поделитесь своими знаниями.
Нужно ли мне отправлять параллельные текстовые сообщения? ,
ребята, у меня есть приемник sui на языке go, но скорость в секунду низкая, как мне сделать его быстрее, нужно ли мне отправлять параллельные TXS? , RequestType: «waitforEffectScert», работает очень медленно
- Sui
Ответы
10Да, параллельная отправка транзакций может значительно повысить пропускную способность. Последовательное использование waitForEffectScert для каждой транзакции замедлит вашу работу. Вместо этого пакетируйте транзакции и обрабатывайте ответы асинхронно. Кроме того, используйте waitForLocalExecution только в случае необходимости. Оптимизируйте, повторно используя соединения и настраивая параметры параллелизма в SDK.
Да, используйтепараллельные TXдля повышения 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.Параллельные TX: используйте горутины (избегайте ограничений скорости).
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. Дизайн Sui основан на параллельном исполнении. Вот как можно оптимизировать:
###Быстрые исправления:
1.Одновременная отправка текстовых сообщений— используйте подпрограммы для пакетной обработки транзакций (Sui обрабатывает их параллельно).
2.Пропустить WaitForEffectsCert
— Для независимых TX используйте:
RequestType: "ImmediateReturn" // Faster, but check status later
ProgrammableTransactionBlock
Пакетные PTBS— объединение действий в одно.
Ключевые преимущества: ✔Конфликтов нет? → Свободно распараллеливайте (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. Специальная оптимизация ####Управление газовыми объектами
// 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.
Если у отправителя транзакций Sui на базе Go наблюдается низкий уровень TPS, проблема, скорее всего, связана с последовательной отправкой транзакций с помощью requestType: «waitforEffectScert». Этот тип запроса ожидает полной обработки, прежде чем продолжить обработку, что не позволяет оптимизировать пропускную способность каждого запроса по отдельности. Для повышения производительности следует внедрить параллельную или пакетную отправку транзакций.
Параллелизация позволяет выполнять несколько транзакций одновременно, эффективно используя возможность Sui обрабатывать транзакции одновременно, особенно когда транзакции касаются непересекающихся объектов. Следует внедрить пул сотрудников или подпрограммы для одновременной отправки транзакций. Убедитесь, что вы правильно управляете примечаниями (порядковыми номерами) или ссылками на объекты, чтобы не создавать конфликтов при владении объектами.
При отправке параллельных транзакций избегайте перекрытия входных объектов, если логика контракта не предусматривает совместного доступа (например, со ссылками &mut). Помните о потенциальной конкуренции между объектами и следите за тем, чтобы ваш код корректно обрабатывал повторы и временные ошибки. Дальнейшую оптимизацию можно проводить, настраивая уровень параллелизма, начиная с малого (например, 10 программ) и увеличивая масштаб в зависимости от результатов.
Кроме того, вы можете использовать waitForLocalExecution вместо waitForEffectScert, если вы хотите немного ускорить подтверждение, но при этом допускаете неокончательные результаты. Однако для конфиденциальных обновлений состояния или балансов, доступных пользователям, WaitforEffectScert безопаснее. Вы также можете предварительно подписывать транзакции и отправлять их пакетами, чтобы минимизировать задержку между каждым запросом.
Убедитесь, что ваш узел Sui или конечная точка RPC могут обрабатывать большие объемы запросов. Рассмотрите возможность использования поставщика RPC с балансировкой нагрузки или высокопроизводительным поставщиком RPC. Профилируйте свой клиент Go, чтобы узнать, способствуют ли задержкам накладные расходы на HTTP или сериализацию. Используйте асинхронные HTTP-клиенты, такие как fasthttp или постоянные соединения gRPC, если они доступны в SDK.
Наконец, регистрируйте и анализируйте неудачные транзакции для выявления узких мест или моделей конкуренции. При правильном параллелизме и правильном распределении объектов ввода вы сможете значительно улучшить TPS.
Если у отправителя транзакций Sui на базе Go наблюдается низкий уровень TPS, проблема, скорее всего, связана с последовательной отправкой транзакций с помощью 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: стейкинг и ликвидный стейкинг515
- «Ошибки проверки нескольких источников» в публикациях модуля Sui Move — автоматическое устранение ошибок55
- Ошибка Sui Move — невозможно обработать транзакцию Не найдено действительных газовых монет для транзакции419
- Сбой транзакции Sui: объекты, зарезервированные для другой транзакции410