Пачка PDF положила прод. Расследование багов в Go библиотеках

chappihappymeal 13 минут назад Пачка PDF положила прод. Расследование багов в Go библиотеках Средний 8 мин 535 Go * Open source * Отладка * Реверс-инжиниринг * Кейс Из песочницы У меня в управлении и разработке сервис,...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: chappihappymeal 13 минут назад Пачка PDF положила прод. Расследование багов в Go библиотеках Средний 8 мин 535 Go * Open source * Отладка * Реверс-инжиниринг * Кейс Из песочницы У меня в управлении и разработке сервис, который обрабатывает большой поток PDF файлов, собранных различными генераторами. В начале июня произошел инцидент, в котором поды поднялись в пик количества по HPA и наглухо зависли на 30 минут.
100% CPU, обработка стоит, очередь копится, алерты летят пачками спустя 30 минут зависания. Тогда было принято решение чинить не проблему, а симптом. Как по мне, лучшее решение в ситуации с инцидентом.
Технические детали
Но недавно руки дошли выявить корень проблемы, и крылся он в используемом open source. Это история о том, как закомментированный panic превращается в бесконечный цикл, а санитайзер, не знающий полный алфавит, молча портит данные. Действующие лицаДля Go экосистема PDF‑парсинга растет из одного корня:rsc/pdf — библиотека Расса Кокса, которая заархивирована уже как 8 лет;ledongthuc/pdf — самый живой наследник, 615 звезд, 358 импортов.
Не обновляется с прошлого года;dslipak/pdf — форк, который используется у меня на проде (достался с легаси‑частью проекта). Все 3 — это, по сути, одна кодовая база с разными наборами патчей. ИнцидентСимптомы: воркер берет из очереди PDF, уходит в page.
Content() и не возвращается. Нет ошибок, нет паник, тишина и несколько ретраев. Файл это легальный документ, сгенерированный коммерческим генератором документов.
Отраслевые последствия
Документ можно открыть любым просмотрщиком PDF‑документов. pdftotext разбирает его без каких либо проблем. Первое, что бросилось в глаза, это стримы, закодированные /ASCII85Decode, что само по себе не самое частое явление, ведь большинство генераторов кладут бинарный flate.
Первая гипотеза: проблема в ASCII85. СпойлерЗабегая вперед, гипотеза оказалась ложной, но об этом чуть позжеКостыль, который пошел в продКогда прод лежит, не до красоты. Я сделал 2 слоя защиты.
Слой первый — жесткий таймаут вокруг распознавания. Библиотека синхронная, отменять ее изнутри нечем, поэтому пошел по классике:var RecognizeTimeout = 30 * time. Second func RecognizeDataCtx(ctx context.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.






