Сервизът на продакшън не работи стабилно повече от 5 минути. Успяхме да локализираме проблема: има функция P() в външна библиотека, която с определена вероятност причинява паника. Как да решим този проблем? Библиотеката е с отворен код, кодът може да се види в vendor.
sobes.tech AI
Отговор от AI
Ако функцията P() от външна библиотека с вероятност причинява паника, а кодът на библиотеката е отворен, могат да се предприемат следните стъпки:
-
Обгърнете извикването на функцията P() с конструкция
recover, за да уловите паниката и да предотвратите падането на цялата услуга. -
Изучете кода на функцията P() във vendor, за да разберете причините за паниката — може би това е грешка в логиката или неправилна употреба.
-
Ако е възможно, поправете грешката в библиотеката и я препостройте.
-
Ако поправката не е възможна или изисква време, можете да напишете обвивка около P(), която да извиква функцията безопасно и да обработва грешките.
Пример за обвивка с recover на Go:
func safeP() (err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("засечена паника: %v", r)
}
}()
P() // извикване на проблемната функция
return nil
}
По този начин, услугата няма да пада заради паника, а ще може да се логват и анализират грешки.