context.Context отправляет в тильт (меня)
Друзья, всем большой привет!
Недавно мне поручили простое дело: добавить таймаут для запроса в кеш. Для контекста: кеш у нас хранится в виде записей в нереляционной БД т.к. туда ходить в 100 раз быстрее, чем в мастер-систему(5 мс против 300).
Казалось бы простое дело, при создании соединения добавить SetTimeout, но я буквально целый день убил, чтобы понять почему оно не работает, хотя делал точно по инструкции. Жутко задизморалился и даже целых 15 минут думал, что я слишком тупой чтобы программировать.
В итоге выяснилось, что документацию к библиотеке лучше читать полностью, а не первые три предложения: в самой последней строчке было сказано, что если context, который передаётся в метод Find имеет deadline (ограничение по времени работы), то он приоритетнее, чем таймаут операции к базе(даже если он больше).
В итоге заменил везде «местный» контекст на context.TODO() и оно завелось. Правда потом на код-ревью узнал от нашего senior, что я дурак и надо было просто сделать копию контекста через ctx, cancel := context.WithTimeoutCause(ctx, time.Second, ErrCacheTimeout) defer cancel()
Кстати, если передать в time.Second 0, то контекст сразу отменится, а не будет бесконечным как я ожидал.
Такие дела
· 30.12.2024
Интересная особенность) По первому абзацу сразу пришла идея сделать context.WithTimeout, а вы как я понял поставили ограничение именно на коннект в бд, тоже логично было так сделать, если не знать особенностей. Получается этот приоритет накладывает сама NoSQl система или гошный драйвер, использующийся для подключения к ней?
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён
· 13.01.2025
Я так понимаю, что гошный драйвер т.к. NoSQL ничего не знает про гошный контекст + как правило ограничение по таймауту ставится на стороне клиента.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён