cache
Кеширование Telegram API ответов
Проблема
Telegram API возвращает FLOOD_WAIT (29) при частых запросах списка диалогов. Нужен кеш на уровне GraphQL резолвера.
Решение
jellydator/ttlcache/v3 — in-memory кеш с generics и автоматическим cleanup.
- TTL 30-60 сек (хватает чтобы не ловить FLOOD_WAIT)
- Кеш-ключ: account ID
- Кеш в резолвере GraphQL — перехватываем до вызова Telegram RPC
import "github.com/jellydator/ttlcache/v3"
// Инициализация (один раз, например в Env или resolver struct)
dialogCache := ttlcache.New[string, []*model.Dialog](
ttlcache.WithTTL[string, []*model.Dialog](30 * time.Second),
)
go dialogCache.Start() // автоматический cleanup expired записей
// В резолвере
func (r *queryResolver) Dialogs(ctx context.Context, accountID string) ([]*model.Dialog, error) {
item := dialogCache.Get(accountID)
if item != nil {
return item.Value(), nil
}
dialogs, err := r.env.ListDialogs(ctx, accountID)
if err != nil {
return nil, err
}
dialogCache.Set(accountID, dialogs, ttlcache.DefaultTTL)
return dialogs, nil
}
Почему ttlcache
| Либа | Выбор | Причина |
|---|---|---|
| jellydator/ttlcache/v3 | выбрана | generics, auto-cleanup, loader func, активно поддерживается |
| patrickmn/go-cache | нет | не обновляется с 2017, нет generics, any везде |
| sync.Map + time | нет | велосипед, ручной cleanup |
| dgraph-io/ristretto | нет | overkill для одного кеша, сложный API |
| SQLite таблица | нет | миграция + сериализация ради 30 сек TTL — лишнее |
| dgraph-io/badger | нет | отдельный data dir, тяжёлая зависимость |