Сохранёнки программиста
6.45K subscribers
1.28K photos
59 videos
10 files
2K links
Заметки и ссылки на будущее, чтобы изучить когда будет время.

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/med
Download Telegram
Общий ключ шардирования помогает оставить JOIN внутри одной базы

Таблицы клиентов и заказов распределили по разным серверам: клиентов — по id, заказы — по собственному id. Теперь запросу «клиент и его заказы» приходится собирать данные с нескольких шардов.

В разборе групп шардирования показан другой подход: размещать заказы по customer_id, используя то же правило распределения, что и для клиентов. Связанные строки окажутся на одном шарде, где можно выполнить JOIN и транзакцию локально.

Перед выбором ключа выпишите основные запросы приложения. Какие таблицы они соединяют? Какие строки меняются вместе? Какой идентификатор известен в начале запроса?

Эти ответы помогут выбрать размещение данных. Особенно полезно проверить запросы, в которых будущего ключа шардирования вообще нет: для них может потребоваться обращение к нескольким шардам.
GitHub автоматизировал пересмотр доступов внешних участников

Подрядчик закончил работу, тестовый проект закрыли, а права на репозиторий остались. Когда таких проектов десятки, ручную проверку легко отложить.

В GitHub для общей организации создали приложение Evergreen. Раз в квартал оно открывает задачу со списком внешних участников. Владелец подтверждает тех, кому доступ ещё нужен. По истечении срока неподтверждённые права отзываются.

Отдельный процесс ищет репозитории без недавней активности людей: сначала предупреждает владельца, затем архивирует проект. Решения и изменения сохраняются в задачах и JSON-файлах управляющего репозитория.

Для своей команды можно начать с одного действия: назначить владельца каждому репозиторию и дату следующего пересмотра доступов. Затем автоматизировать напоминания и журнал решений.
Два распаковщика могут увидеть разные файлы в одном tar-архиве

Сервис проверяет архив и видит безопасный файл. Установщик открывает тот же архив — и находит дополнительный файл с другим содержимым.

Такое возможно, когда программы по-разному трактуют записи tar. В разборе tar-codec есть примеры расхождений, из-за которых проверка и последующая распаковка получают разные наборы файлов.

Команда Astral столкнулась с этим при работе над uv и написала более строгий парсер. Начиная с uv 0.13 он используется для обработки исходных пакетов Python.

Если ваш сервис принимает архивы, проверьте всю цепочку: чем проверяете содержимое, чем распаковываете и какие варианты формата разрешаете. Добавьте в тесты архивы с повторяющимися именами и неоднозначными заголовками. Проверяющая и использующая файл части системы должны одинаково понимать его содержимое.
❤1
WAF может проверить ответ сервера перед отправкой клиенту

Запрос пытается открыть служебную страницу без авторизации. Приложение возвращает HTML административной панели. Проверка ответа помогает увидеть, что сервер действительно отдал закрытое содержимое.

В Cloudflare WAF добавили сопоставление запроса с ответом. Правило может учитывать путь, состояние авторизации, код ответа и другие доступные признаки. При совпадении WAF подменяет ответ страницей блокировки до отправки клиенту.

Начать можно с узкого сценария: проверить обращения к административным адресам и посмотреть, какие ответы получает неавторизованный посетитель. Сначала соберите события в журнал, затем настройте блокировку.

Пользовательские правила по содержимому тела ответа пока недоступны. Блокировка ответа также не отменяет действия, которые приложение уже успело выполнить на сервере.
SQL-запросы и ход расследования можно хранить рядом с кодом

Нашли причину сбоя, отправили вывод в чат, закрыли вкладки. Через месяц похожая проблема возникает снова, и запросы приходится собирать заново.

В Supabase появились Explorer и Notebooks: в одном документе можно сохранить запросы к базе и логам, графики и заметки о проверках. Файл хранится в папке supabase, попадает в Git и проходит обычное ревью. При повторном запуске запросы получают актуальные данные.

Так удобно оформлять проверки после деплоя: какие ошибки появились, какие запросы замедлились, что изменилось в нагрузке.

Explorer пока доступен в режиме предварительного просмотра. Начните с одного повторяющегося расследования и сохраните шаги, по которым коллега сможет его воспроизвести.
Go 1.27 сохраняет HTTP-соединение после закрытия непрочитанного ответа

Клиенту нужен только статус ответа, поэтому он вызывает resp.Body.Close() и идёт дальше. В Go до версии 1.27 непрочитанное тело HTTP/1-ответа мешало повторно использовать соединение. Следующий запрос мог снова тратить время на TCP и TLS.

В Go 1.27 транспорт дочитывает остаток в фоне: на это выделено до 50 мс и 256 КБ. Если тело удалось прочитать до конца, соединение можно вернуть в пул. При заголовке Connection: close эта работа пропускается.

В примере команды Go сто последовательных HTTP/1-запросов заняли около 150 мс вместо 710 мс на прежней версии.

Проверьте код, где тело ответа закрывается сразу после получения статуса или чтения JSON. На Go 1.27 обычного Close() достаточно, чтобы транспорт сам попробовал сохранить соединение.
😁1
Возможность отката стоит закладывать при проектировании функции

Новый формат записали на диск, внутренний метод открыли внешним клиентам — вокруг решения начинают появляться зависимости. Позже его изменение потребует миграции данных и согласования с пользователями API.

В Google Testing Blog собрали приёмы, которые сохраняют возможность передумать:

— включать новую логику через флаг;
— ограничивать доступ к API, пока интерфейс меняется;
— разделять формат хранения и структуры для обработки данных;
— запускать новую логику параллельно со старой и сравнивать результаты.

Перед следующей большой правкой задайте один вопрос: что потребуется, чтобы вернуть прежнее поведение?

Если ответ включает переделку нескольких сервисов или восстановление данных, предусмотрите путь назад до запуска.
Облачные PostgreSQL можно сравнить на воспроизводимой нагрузке

При выборе базы полезно видеть вместе пропускную способность, задержки и стоимость. Для этого в DBArena публикуют конфигурации и исходные результаты тестов, которые можно повторить самостоятельно. Проект финансирует Supabase.

В первом наборе сравнивают Supabase, Amazon RDS и Google Cloud SQL на PostgreSQL 17. Есть два сценария: данные помещаются в память или превышают её объём в четыре раза.

Каждый запуск включает 30 минут прогрева и час измерений. Сохраняются версии, параметры окружения и команды запуска; инструменты доступны с открытым кодом.

Материал пригодится при подготовке собственного нагрузочного теста. Возьмите из него порядок измерений, затем добавьте характерные для приложения запросы и проверьте задержки при ожидаемом числе клиентов.
Профиль Go показывает горутины, которые навсегда застряли в ожидании

Функция запустила несколько обработчиков и собирает ответы через канал. Первый обработчик вернул ошибку, функция завершилась. Остальные продолжают отправлять результаты в канал, который уже никто не читает.

Такие горутины удерживают память и накапливаются при повторных вызовах. В Go 1.27 появился профиль goroutineleak, который обнаруживает часть постоянных блокировок на каналах и примитивах пакета sync.

Если в сервисе уже подключён net/http/pprof, профиль доступен через диагностический обработчик:

curl http://localhost:6060/debug/pprof/goroutineleak > leak.prof
go tool pprof leak.prof


Начните проверку с ранних выходов по ошибке: кто после них продолжает работу, куда отправляет результат и как узнаёт об отмене.
Токен Supabase можно ограничить одним проектом и нужными действиями

Скрипту генерации типов нужен доступ к структуре базы. Токен с правами на весь аккаунт заодно открывает ему другие проекты и операции.

В Supabase можно выбрать ресурсы, разрешения и срок действия токена. Для чтения базы одного проекта достаточно выделить этот проект и включить соответствующее разрешение. Скрипту деплоя можно выдать отдельный токен.

Есть важная деталь: общий набор прав Read-only включает чтение секретов, в том числе API-ключей. Для узкой задачи настройку лучше начать с No access и включить нужные пункты вручную.

Посмотрите, какие токены сейчас используют CI и локальные инструменты. Для каждого выпишите задачу, необходимые права и срок работы. По этому списку проще заменить общие ключи отдельными.
ИИ-агенту нужны актуальные правила Selenium, чтобы писать устойчивые тесты

Агент добавил sleep(5), скопировал длинный XPath и подключил лишнюю библиотеку для драйвера. Тест проходит локально, а в CI периодически падает.

Команда Selenium разобрала повторяющиеся ошибки агентов и подготовила рекомендации для файлов инструкций проекта. Агенту стоит передать версию Selenium, актуальную документацию и рабочие примеры. Найденные локаторы — проверить на настоящей странице.

Особенно внимательно смотрите на исправления нестабильных тестов. Попросите указать, какое условие ещё не выполнилось: элемент не появился, кнопка недоступна, загрузка продолжается. Затем настройте явное ожидание этого условия.

Сохраните правила в AGENTS.md или другом файле, который читает ваш инструмент. Они будут применяться и к следующим задачам.
Фоновая очистка GitHub исчерпала подключения к общей базе

Задача очистки следила за отставанием реплик и замедляла запись при росте задержки. Нагрузку на основной сервер она не учитывала. В результате база достигла лимита подключений, а зависимые запросы начали сбоить.

В разборе сентябрьского инцидента GitHub описаны ещё два фактора: вызовы базы долго ждали без быстрого тайм-аута, а повторные попытки создания токенов добавляли новые записи. Для восстановления пришлось снизить внутреннюю нагрузку и остановить очистку.

Проверьте свои фоновые задачи: по каким метрикам они замедляются, сколько подключений могут занять и как быстро их можно остановить.

Отдельно посмотрите на повторы при ошибках базы. У них должны быть ограничение числа попыток и паузы, чтобы перегруженный сервер успел восстановиться.
🖥 Cloudflare сократила расход памяти на сборку DNS-зон на 85%

Изменение одной настройки могло запускать полную пересборку DNS-зоны с миллионами записей. На крупных зонах такая работа занимала время и создавала высокую нагрузку на память.

Cloudflare добавила планировщик сборки, который определяет минимальный безопасный объём изменений. Для подходящих операций система обрабатывает только необходимую часть зоны.

На своей нагрузке компания сократила число полных сборок на 40%, пиковое потребление памяти — на 85%, а задержку сборки уменьшила вдвое.

Разбор стоит сохранить, если небольшой запрос в вашей системе запускает большой пересчёт. Проверьте, какие зависимости действительно требуют полной обработки и как проверить корректность частичного результата.
Please open Telegram to view this post
VIEW IN TELEGRAM
😇1
🖥 Проверка CVE в реестре помогает отсеять выдуманные уязвимости из ИИ-ревью

ИИ-ревьюер нашёл опасную проблему, сослался на CVE и предложил исправление. При проверке выяснилось, что такого идентификатора вообще нет.

В кейсе Docker разобраны две части защиты. Среда ограничивает возможности агента: доступ к файлам, сети и секретам. Отдельная проверка сверяет упомянутые CVE с реестром NVD.

В примере отчёт остаётся текстом, который агент не может сам опубликовать или превратить в действие. Неизвестный CVE помечает результат как непроверенный.

Добавьте проверку идентификаторов в обработку отчёта. Затем сверяйте описание, затронутые версии и предложенные изменения с оригинальной карточкой уязвимости.
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 OrioleDB использует undo-журнал для хранения предыдущих версий строк PostgreSQL

В PostgreSQL частые обновления создают старые версии строк. Их очистка и накопление влияют на размер таблиц и работу базы.

OrioleDB предлагает другой механизм хранения: прежние версии данных размещаются в undo-журнале. Проект также использует собственную организацию таблиц и индексов.

В разборе публичной беты показано, как движок работает с таблицами, в которых много обновлений, и какие изменения это вносит в эксплуатацию PostgreSQL.

Для знакомства выберите таблицу с характерной нагрузкой и воспроизведите её отдельно. Измеряйте размер данных, задержки, поведение длительных транзакций и восстановление после сбоя. Проект находится в публичной бете.
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 pg-delta строит изменения PostgreSQL из описания желаемой схемы

В проекте растёт история SQL-миграций. Чтобы понять текущее устройство базы, приходится восстанавливать его по десяткам файлов.

При декларативном подходе вы храните желаемую схему в SQL-файлах. Инструмент сравнивает её с текущим состоянием и готовит изменения для перехода.

В разборе Declarative Schemas 2.0 показана работа pg-delta: от описания объектов до получения миграции.

Сначала попробуйте подход на локальной базе. Просмотрите сгенерированный SQL, проверьте удаление и переименование объектов, затем прогоните миграцию на копии с данными. Полученный план стоит ревьюить вместе с изменением схемы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Отдельный локальный проект Supabase позволяет агентам независимо менять базу

Два агента работают в разных ветках, но подключены к одной локальной базе. Один меняет таблицу, второй запускает тесты на прежней схеме. Результат начинает зависеть от порядка действий.

В руководстве Supabase показано, как выделить каждому агенту собственный локальный проект. Есть варианты запуска с Docker и без него.

Так у каждой задачи появляются независимые данные и состояние базы. Агент может применять миграции и сбрасывать тестовое окружение в пределах своего проекта.

Добавьте подготовку базы в создание рабочей среды. Зафиксируйте начальные данные, способ запуска и очистку после завершения задачи. Тесты должны явно получать адрес своей базы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Отдельная реплика PostgreSQL помогает изолировать тяжёлые запросы

Аналитический запрос читает большую таблицу и конкурирует за ресурсы с пользовательскими операциями. Для таких запросов можно выделить отдельную реплику.

PlanetScale разобрала управление репликами PostgreSQL: каждой можно назначить свой размер и подключение. Одну использовать для аналитики, другую — для векторного поиска.

Реплики получают изменения асинхронно. При маршрутизации запросов нужно определить, где допустима задержка данных, а где требуется самое свежее состояние.

Начните с отчётов и длительных выборок. Измерьте отставание реплики, время выполнения и влияние на основную базу. Для каждого сценария задайте допустимую свежесть результата.
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Общая папка, worktree и клон дают агенту разную степень независимости

Способ подключения репозитория к агенту влияет на то, какие файлы он меняет и как его работа пересекается с вашей.

В разборе Docker Sandboxes сравниваются три варианта. Общая папка даёт доступ к текущим файлам. Git worktree создаёт отдельное рабочее дерево с общей историей репозитория. Клон получает собственную копию репозитория.

Для параллельных задач проверьте ещё каталоги сборки, зависимости и генерируемые файлы. Отдельная ветка сама по себе их не изолирует.

Выберите способ подготовки среды и сохраните его в команде запуска. Вместе с ним зафиксируйте установку зависимостей, запуск проверок и перенос результата на ревью.
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Zero Wire собирает описание критической уязвимости и наблюдаемые атаки в одном месте

После публикации критического CVE нужно быстро понять, какие версии затронуты, что обновлять и наблюдаются ли попытки эксплуатации.

Cloudflare запустила Zero Wire — раздел Radar с объяснениями уязвимостей, данными об атаках и шагами исправления. Сводка помогает начать проверку и перейти к техническим подробностям.

Телеметрия показывает активность, которую видит Cloudflare. Для решения о срочности сопоставьте её со своей конфигурацией: версией компонента, доступностью извне и установленными мерами защиты.

Сохраните сервис рядом с источниками уведомлений об уязвимостях. При инциденте сверяйте рекомендации с бюллетенем разработчика и фиксируйте, где именно у вас используется затронутый компонент.
Please open Telegram to view this post
VIEW IN TELEGRAM