prog_stuff | Unsorted

Telegram-канал prog_stuff - Сохранёнки программиста

7565

Бесплатные лекции, курсы, книги, подкасты по программированию Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media

Subscribe to a channel

Сохранёнки программиста

Как настроить распределённую трассировку Java-микросервисов с OpenTelemetry

Обстоятельный разбор OpenTelemetry показывает, как связать путь запроса через Java-микросервисы и найти сервис, запрос к базе или внешний вызов, который добавляет задержку.

Карта материала:
1. почему разрозненные логи и метрики не восстанавливают путь запроса;
2. как SDK собирает трассы, метрики и логи, а процессоры фильтруют и группируют их;
3. как подключить Maven, экспорт по OTLP, Jaeger и собственные участки трассы.

Примеры рассчитаны на Spring Boot 3.x и OpenTelemetry 1.35.0: стартер автоматически охватывает HTTP, JDBC, JPA, Kafka и RabbitMQ. Локальный Jaeger запускается через Docker Compose; бизнес-операции можно размечать собственными участками трассы.

Подойдёт Java-бэкендерам и SRE: на тестовом стенде проверьте сквозной идентификатор trace_id, а перед рабочей средой пересмотрите выборку в 100%.

Читать полностью…

Сохранёнки программиста

Почему одинаковый nvJPEG2000 даёт разные результаты в тестах

Обстоятельный разбор показывает, как границы таймера и подача кадров меняют результаты nvJPEG2000 на RTX 4090. Асинхронная очередь GPU делает методику частью результата.

В образце NVIDIA декодирование замеряют CUDA-событиями корректно, но разбор сжатого потока считают в целых секундах. Миллисекунды превращаются в ноль, поэтому число охватывает лишь часть работы. В подробном разборе методики авторский стенд включает оба этапа; код и логи открыты.

Есть и второй подвох: восемь потоков с двумя кадрами в работе дают 16 одновременных задач, хотя пакетного вызова у библиотеки нет. Разбор пригодится разработчикам GPU-конвейеров и авторам бенчмарков: сверяйте не только кадры в секунду, но и границы таймера, синхронизацию и число активных кадров.

Читать полностью…

Сохранёнки программиста

Go 1.27: что проверить перед обновлением сервисов

Практический обзор Go 1.27 отделяет ускорение после пересборки от изменений, которые требуют проверки кода. Для типичных серверных нагрузок автор приводит прирост 3–5%, для отдельных микротестов до 10%. Причины: более точное встраивание функций компилятором и меньше расходов на выделение памяти.

Отдельно разобраны сборщик мусора для сервисов с сотнями гигабайт живых данных и встроенная функция clear. Она очищает срезы и карты без нового выделения памяти, что пригодится при повторном использовании буферов. Данные DWARF помогают отладчику лучше показывать переменные, а go mod tidy оставляет меньше шума в изменениях go.mod.

В практическом гайде на DEV Community можно сверить детали перед обновлением. Сохраните его, если поддерживаете Go-сервисы: пересоберите стенд и сравните скорость, паузы сборщика мусора и отладку на своей нагрузке.

Читать полностью…

Сохранёнки программиста

Как агенты тестируют код и почему одного промпта мало

В исследовании агенты реализовывали Zstd на Rust и по указанию применяли TDD (разработку через тесты), фаззинг, тестирование свойств или формальные методы. Автор сравнил 26 вариантов промпта и 4 навыка, по 80 запусков на условие и уровень рассуждений.

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

Агенты доказывали малозначимые свойства или перебирали случайные данные, часто попадая в отбраковку. Тест с 4 одинаковыми входными потоками не замечал их перестановку. Исследование How well do agents use test/verification techniques? стоит прочитать тем, кто принимает агентный код: проверяйте, какую ошибку способен обнаружить тест, а не только зелёный результат.

Читать полностью…

Сохранёнки программиста

30 паттернов распределённых систем

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

Материал можно читать от своей задачи:
• упорядочить изменения: логические часы Лэмпорта, гибридные часы и векторы версий;
• синхронизировать копии: ведущий с последователями, реплицируемый журнал и консенсус Paxos;
• ускорить запросы: чтение с ведомых узлов, пакеты и конвейер запросов;
• обслуживать журналы: отмечать последнюю репликацию и часть, которую уже можно удалить.

Catalog of Patterns of Distributed Systems даёт краткое описание каждого решения и ссылки на главы онлайн-книги. Архитекторам и бэкенд-разработчикам стоит сопоставить сбой или узкое место своей системы с готовым механизмом, прежде чем проектировать свой протокол.

Читать полностью…

Сохранёнки программиста

Как читать Big O и находить лишнюю сложность в коде

Обстоятельная интерактивная статья объясняет Big O без секундомера: нотация показывает, как растёт время работы вместе с объёмом входа. O(1), O(log n), O(n) и O(n²) разобраны на графиках и примерах JavaScript.

Карта материала:
1. сумма циклом растёт линейно, а формула (n × (n + 1)) / 2 требует постоянного числа операций;
2. пузырьковая сортировка в худшем случае проходит n элементов n раз;
3. бинарный поиск отбрасывает половину вариантов за шаг и находит число среди миллиарда не более чем за 31 попытку.

Практический блок переносит теорию в код. Поиск в массиве имеет O(n), в Set: O(1), но создание new Set(items) требует O(n). Материал пригодится, чтобы оценивать алгоритмы по росту затрат и учитывать цену подготовки вместо единичных замеров.

Читать полностью…

Сохранёнки программиста

Как устроен исполняемый файл Linux и как разобрать его вручную

Обстоятельная первая часть серии об ELF, формате исполняемых и компонуемых файлов, начинается с программы на ассемблере x86-64, которая печатает hi there. После сборки NASM и компоновки файл занимает 8,68 КиБ, а gzip -9 сжимает его до 372 байт.

Вместо готовых анализаторов автор читает шестнадцатеричный дамп, учитывает порядок байтов от младшего к старшему и находит таблицу заголовков секций по смещению 0x2140. Записи в ней указывают, где начинаются части файла и сколько байтов занимают. Затем автор пишет собственный разбор с библиотекой nom.

Материал fasterthanli.me полезен системным разработчикам и тем, кто хочет связать сырые байты ELF с кодом, данными и именами секций. Страница не обновлялась около семи лет, поэтому это учебный разбор, а не справочник по текущим инструментам.

Читать полностью…

Сохранёнки программиста

Как SQLite обеспечивает атомарный коммит

Транзакция выглядит так, будто записалась целиком или не записалась вовсе, хотя питание может пропасть посреди записи. Разбор SQLite объясняет, как база создаёт эту гарантию с журналом отката. WAL работает иначе.

Материал пригодится при создании VFS для SQLite и разборе повреждений после сбоя: проверьте гарантии накопителя, драйвера и ОС для записи и синхронизации.

Читать полностью…

Сохранёнки программиста

Как LMAX вынесла торговую логику в один поток

Разбор архитектуры LMAX показывает, почему многопоточность не всегда ускоряет критический путь. Бизнес-логика торговой платформы последовательно обрабатывала заявки в памяти. На сервере с двумя четырёхъядерными процессорами Nehalem по 3 ГГц и 32 ГБ памяти один поток достигал 6 млн заявок в секунду. Это исторический результат 2011 года, а не ориентир для любой системы.

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

Статья Мартина Фаулера об архитектуре LMAX даёт карту этих компромиссов. Читать стоит разработчикам высоконагруженных систем: чтобы перед добавлением потоков отделить вычисления от ввода-вывода и измерить варианты на своей нагрузке.

Читать полностью…

Сохранёнки программиста

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

Обстоятельная статья Расса Кокса сравнивает алгоритм, применяемый Perl и рядом языков, с автоматом Томпсона, построенным из состояний и переходов.

В тесте 2007 года Perl сопоставлял строку из 29 букв «a» больше 60 секунд, а реализация автомата Томпсона справилась за 20 микросекунд, в миллион раз быстрее. Её код занимал менее 400 строк на C. Автор ведёт от синтаксиса выражений и конечных автоматов к преобразованию выражения в автомат и его реализации.

Граница: обратные ссылки вроде \1 выводят шаблон за пределы регулярных языков и в худшем случае требуют экспоненциального поиска. Материал стоит читать разработчикам движков и тем, кто выбирает библиотеку: для шаблонов без обратных ссылок проверяйте, использует ли она автомат Томпсона.

Читать полностью…

Сохранёнки программиста

Как собрать модель пиковой нагрузки из боевой телеметрии

Обстоятельный гайд о замене выгрузок, таблиц и догадок запросами к телеметрии. В примере ручная подготовка занимает 13–22 человеко-часа, автоматическая: менее 5 минут.

Метод ведёт от самого нагруженного дня к часу и минуте. Затем пик переводят в запросы в секунду, рассчитывают доли сценариев и число одновременно работающих виртуальных пользователей. Запросы даны для New Relic и Dynatrace.

Peak Workload Analyzer выполняет шесть этапов и формирует HTML-панель, JSON-отчёт и карту пользовательских путей. Для запуска нужны Java 11+, Maven 3.6+ и минимум 30 дней боевого трафика с известным пиком.

В руководстве freeCodeCamp есть формулы и логика шагов. Читать инженерам производительности и надёжности перед сезонным нагрузочным тестом: модель стоит строить из реальных сессий и транзакций, а не из памяти команды.

Читать полностью…

Сохранёнки программиста

Как работает однопошаговый отладчик Linux на ptrace

Обстоятельная статья разбирает основу отладчика. Дочерний процесс вызывает PTRACE_TRACEME и запускает программу через execl. Ядро останавливает её перед первой инструкцией и уведомляет родителя. Тот выполняет PTRACE_SINGLESTEP, ждёт следующей остановки и повторяет цикл.

На этом каркасе автор показывает, как считать инструкции и читать регистры через PTRACE_GETREGS. Тест с Hello World даёт более 100 000 инструкций при динамической компоновке, около 7 000 при статической и ровно 7 в версии на ассемблере. Счётчик захватывает загрузчик библиотек, инициализацию и очистку библиотеки C, а не только main.

Статья Эли Бендерски даёт модель взаимодействия отладчика с ОС. Код для 32-битной Ubuntu зависит от платформы, поэтому переносить его буквально не стоит. Читать системным разработчикам и тем, кто хочет понять механику пошаговой отладки.

Читать полностью…

Сохранёнки программиста

Как тестирование на основе свойств отделяет правило от примера

Обстоятельная статья Increment разбирает подход на Python и Hypothesis. Обычный тест проверяет проект с лимитом в 3 участника и тремя пользователями. Название обещает работу с любым лимитом, хотя код подтверждает только этот набор. Тест на основе свойств вместо одного примера задаёт допустимые входы и условие для каждого из них.

Hypothesis получает диапазоны входов через @given. Здесь меняются название проекта и список пользователей с уникальными адресами, а лимит равен длине списка. Случайные детали тестовых данных перестают быть скрытыми требованиями.

На Argon2 подход нашёл старый баг: при hash_len=513 фиксированный буфер C-библиотеки приводил к ошибке проверки созданного хеша. Если поддерживаете тестовую базу, найдите тесты, чьи названия обещают больше одного примера, и отделите меняющиеся входы от проверяемого правила.

Читать полностью…

Сохранёнки программиста

В 2001 году появился SpaceWeb — тогда же весь рунет жил в аське, разбирался с первыми сайтами и понятия не имел, что такое биткоин. К своему 25-летию компания вместе с Типичным программистом сделала анкету, которая возвращает в те годы: школьные вопросы про спорт, лучшего друга и обои на рабочий стол, а рядом — Winamp, QIWI-терминалы во дворах, Покемон Go и попытка заглянуть в будущее.

Читать полностью…

Сохранёнки программиста

Как сделать распределённую блокировку безопасной

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

В обстоятельном разборе распределённых блокировок Мартин Клеппманн разделяет две задачи:
— для экономии допустим редкий повтор работы;
— для корректности два владельца означают потерю данных или расхождение состояния.

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

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

Читать полностью…

Сохранёнки программиста

Как собрать GraphRAG для данных ServiceNow на Python и Neo4j

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

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

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

Читать полностью…

Сохранёнки программиста

Как отсекать партиции PostgreSQL при поиске не по ключу разбиения

Таблица событий разбита по времени, но запрос по session_id обращается ко всем партициям. Локальный индекс ускоряет поиск в каждой, однако их число не сокращает: при сотне партиций это похоже на запрос к сотне таблиц.

Приём применим, когда события только добавляются, ID сессий растут последовательно, а сессии обычно длятся минуты или часы. Тогда ID связан со временем: для каждой партиции можно задать его диапазон через CHECK. Оптимизатор исключит партицию, где нужного ID быть не может. В примере для ID 1000 сканируется только партиция 2025 года вместо двух.

В обстоятельной статье Хаки Бениты разобраны локальные и глобальные индексы, выбросы и схема «пробелы и острова». Материал пригодится тем, кто выбирает ключ разбиения таблицы: проверьте связь данных и план через EXPLAIN, прежде чем закреплять диапазоны ограничениями.

Читать полностью…

Сохранёнки программиста

Как Uber переписала шардирование Schemaless на Go без простоя

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

Карта материала:

1. чтение выполняли обе реализации, после чего ответы сравнивали;

2. долю проверки меняли настройкой, поскольку она удваивала запросы к узлам хранения;

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

После миграции медианная задержка всех запросов уменьшилась на 85%, 99-й перцентиль на 70%, загрузка процессора более чем на 85%.

В разборе Uber Engineering стоит изучить совместимость и переключение долей трафика. Для критичного сервиса заранее разделите проверки чтения и записи.

Читать полностью…

Сохранёнки программиста

Как устроена база данных: собираем клон SQLite на C

Это обстоятельная серия для тех, кому знаком SQL, но путь данных от запроса до файла скрыт за интерфейсом СУБД. Автор строит клон SQLite с нуля на C и документирует каждый слой. Всего 15 частей: маршрут идёт от цикла чтения команд и компилятора SQL к многоуровневому B-дереву.

Сначала появляются цикл чтения команд, простейший компилятор SQL и виртуальная машина. Затем одна таблица в памяти получает тесты, сохранение на диск и курсор для обхода записей. Дальше автор разбирает формат узлов B-дерева, двоичный и рекурсивный поиск, разделение узлов и обновление их родителей.

В серии How Does a Database Work? удобно идти по порядку и смотреть, как знакомые операции превращаются в структуры данных. Читать стоит разработчикам, которые работают с SQL и хотят разобраться в индексах, полном сканировании таблицы и границе между памятью и диском.

Читать полностью…

Сохранёнки программиста

Как устроена машина Тьюринга и где проходит граница вычислимого

Интерактивная статья ведёт от устройства машины к пределам вычислений. У неё четыре части: лента, головка, программа и состояние. Пять команд позволяют печатать символ, двигать головку, менять состояние и останавливать выполнение.

Примеры запускаются в тексте и прокручиваются пошагово вперёд или назад. Сначала машина бесконечно печатает нули, затем чередует 0 и 1 и складывает 2 и 6 в двоичной записи.

Дальше разбор «Turing Machines» переходит к задаче остановки: нельзя написать программу, которая по любой программе и входным данным наверняка определит, завершится вычисление или будет идти вечно. Через этот предел объясняется полнота по Тьюрингу: система полна, если может смоделировать машину Тьюринга.

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

Читать полностью…

Сохранёнки программиста

Как реализовать get or create в PostgreSQL без гонок и раздувания таблицы

Обстоятельный разбор операции: вернуть существующую строку или создать новую, не обновляя совпавшие данные, как при upsert. На таблице тегов видно, почему SELECT перед INSERT даёт идемпотентность, но ломается при двух одновременных запросах.

Карта решений:
1. Перехват нарушения уникальности закрывает гонку, но неудачная вставка оставляет мёртвую строку до очистки;
2. 50 000 попыток вставить существующий тег заняли около 12 секунд и увеличили таблицу с 8192 байт до 1776 КБ;
3. VACUUM убрал мёртвые строки и вернул размер к 8192 байтам. Обычно очистку по заданным порогам запускает autovacuum.

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

Читать полностью…

Сохранёнки программиста

Как одну проверку Clippy ускорили в 3133 раза

Казалось бы, проверить скобки в вызовах макросов Rust просто. Но Clippy делал это после раскрытия макросов, когда [], () или {} уже нельзя получить напрямую. Знак восстанавливали по фрагменту исходного кода.

В обстоятельном разборе показана цена решения: для каждого выражения, инструкции и элемента программы проверка поднималась по цепочке раскрытий, дважды запрашивала данные компилятора и блокировала таблицу преобразования идентификаторов в строки. Одна функция забирала 25% времени Clippy.

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

Читать полностью…

Сохранёнки программиста

Как выбрать равновероятную выборку из потока неизвестной длины

Интерактивный разбор объясняет reservoir sampling, или резервуарную выборку. Алгоритм держит k элементов. Для элемента с номером n шанс попасть в массив равен k/n; при выборе он заменяет один из сохранённых случайным образом. Поэтому каждый элемент потока имеет равный шанс остаться в результате.

Механизм показан на картах, а затем на сервисе сбора логов. При k=5 сервис хранит не больше пяти сообщений и раз в секунду отправляет выборку: при потоке до пяти сообщений сохраняет все, а во время всплеска выбирает пять без преимущества у первых событий. Цена предсказуемой памяти: логи поступают пачками, а не непрерывно.

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

Читать полностью…

Сохранёнки программиста

Как процессор предсказывает ветвления

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

В учебной модели ветвления составляют 20% инструкций, а промах стоит 20 тактов. Без предсказания получается 4,8 такта на инструкцию, с идеальным — один. Прогноз по последнему результату ветвления повышает точность до 85%.

Материал «Branch prediction» ведёт от статических правил к таблице истории и объясняет, почему разные переходы могут занять одну её ячейку. Читать стоит тем, кто исследует низкоуровневую производительность или хочет понимать работы о предсказателях. Расчёты сделаны на упрощённой модели, поэтому цену ветвлений в коде нужно измерять.

Читать полностью…

Сохранёнки программиста

Как проверять изменения без риска для всего трафика

Компактный разбор о снижении риска при выкатывании изменений. Если сразу перевести на новую версию весь рабочий трафик, поломка проявится у пользователей.

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

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

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

Читать полностью…

Сохранёнки программиста

Как работает фильтр Блума и когда его неточность экономит память

Фильтр Блума сообщает: «элемента точно нет» или «элемент, возможно, есть». Ложные срабатывания допустимы, но добавленное значение он не пропускает. Так можно отсечь часть запросов перед точной проверкой.

В обстоятельном разборе Bloom Filters при добавлении значения хеш-функции выбирают позиции в битовом массиве и записывают в них единицы. Совпадение всех позиций означает «возможно». Автор объясняет, как заполнение повышает долю ложных срабатываний, как подобрать размер массива и число функций, почему удаление может стереть следы других значений.

В примере список из миллиона вредоносных ссылок занимает 20 МБ. Фильтр с одним ложным срабатыванием на миллион проверок занимает 3,59 МБ, на 82% меньше; ответ «возможно» можно сверить с полной базой через API. Для отсева заранее оцените объём данных и приемлемую долю ошибок.

Читать полностью…

Сохранёнки программиста

Как конечные автоматы индексируют миллиарды строк

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

Далее библиотека fst на Rust и опыты. Индекс 16 млн заголовков Wikipedia объёмом 384 МБ построился за 18,3 секунды и занял 157 МБ. Поиск по регулярному выражению занял 0,023 секунды, нечёткий поиск с двумя правками: 0,094 секунды. Финал: более 1,6 млрд URL из Common Crawl объёмом 134 ГБ.

В лонгриде Эндрю Галланта разобраны границы: нужен быстрый доступ к произвольному участку файла, а структура не универсальна. Читать разработчикам поиска и словарей, чтобы оценить вариант индекса.

Читать полностью…

Сохранёнки программиста

Как устроен асинхронный веб-краулер на Python

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

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

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

В главе «A Web Crawler With asyncio Coroutines» из 500 Lines or Less код написан для Python 3.4. Читайте ради механики цикла событий; перед копированием сверяйте API с документацией.

Читать полностью…

Сохранёнки программиста

Как Discord перенёс триллионы сообщений с Cassandra на ScyllaDB

В обстоятельном разборе Discord показывает перестройку всего пути запроса. В начале 2022 года Cassandra состояла из 177 узлов, но один перегруженный раздел мог замедлить весь кластер.

Между API и базой появились сервисы данных на Rust. Одновременные запросы одной строки объединялись: базу опрашивала одна задача, остальные клиенты получали её результат. Маршрутизация по идентификатору канала направляла такие запросы в один экземпляр сервиса, чтобы объединение срабатывало чаще.

Готовый переносчик оценил миграцию в три месяца. Собственный вариант на Rust сократил оценку до девяти дней и переносил до 3,2 млн сообщений в секунду. Разбор пригодится при защите базы от всплесков и переходе без простоя: смены СУБД недостаточно, параллельные запросы нужно ограничивать до неё, а ответы двух систем сверять во время миграции.

Читать полностью…

Сохранёнки программиста

Как читать Rust-код: карта синтаксиса за полчаса

Это обстоятельный разбор базовой грамматики Rust. Автор читает множество коротких фрагментов и объясняет значение ключевых слов и символов.

Путь начинается с let, типов и повторного объявления имени, которое создаёт новую переменную. Затем идут кортежи, функции и блоки-выражения. На примерах видно, почему отсутствие точки с запятой возвращает значение блока, как _ отбрасывает ненужный результат и чем вызов метода через точку отличается от :: в пути к имени. Отдельно разобраны импорт через use, автоматически доступные стандартные имена, структуры и их разбор на поля.

A half-hour to learn Rust стоит открыть перед первым чтением Rust-кода. Страница обновлялась около семи лет назад: актуальные библиотеки и практики нужно сверять со свежей документацией, а основы синтаксиса здесь остаются удобной системой координат.

Читать полностью…
Subscribe to a channel