Sobes.tech
Senior

A szolgáltatás a produkcióban nem működik stabilan 5 percnél tovább. Sikerült lokalizálni a problémát: van egy P() nevű függvény egy külső könyvtárban, amely bizonyos valószínűséggel pánikot okoz. Hogyan oldjuk meg ezt a problémát? A könyvtár nyílt forráskódú, a kód megtekinthető a vendor mappában.

sobes.tech MI

Válasz az MI-től

Если функция P() из сторонней библиотеки с вероятностью вызывает панику, а код библиотеки открыт, можно предпринять следующие шаги:

  1. Обернуть вызов функции P() в конструкцию recover для перехвата паники и предотвращения падения всего сервиса.

  2. Изучить код функции P() в vendor, чтобы понять причины паники — возможно, это ошибка в логике или неправильное использование.

  3. Если возможно, исправить ошибку в библиотеке и собрать её заново.

  4. Если исправление невозможно или требует времени, можно написать обёртку вокруг P(), которая будет безопасно вызывать функцию и обрабатывать ошибки.

Пример обёртки с recover на Go:

func safeP() (err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("panic caught: %v", r)
        }
    }()
    P() // вызов проблемной функции
    return nil
}

Таким образом, сервис не будет падать из-за паники, а можно будет логировать и анализировать ошибки.