Go

etcd: координация ≠ ускорение

etcd: координация ≠ ускорение

Не всё в памяти — про скорость: физические данные etcd лежат на диске (persistent B+tree), в памяти — только вторичный индекс путей к ним; согласованность обеспечивает Raft, а не резидентность данных. Raft, линеаризуемые чтения, MVCC-ревизии, watch и leases — и честный разбор того, почему etcd в этой серии не шестая in-memory система, а граница таксономии, и что ломается при использовании не по назначению

Куча, стек и сборщик мусора: как языки управляют памятью

Куча, стек и сборщик мусора: как языки управляют памятью

Как C++, Rust, Go и Java решают один и тот же вопрос — кто и когда освобождает память: вручную, детерминированно по владению (корректность проверяет компилятор) или в рантайме через сборщик мусора. Стек против кучи, стоимость аллокации, паузы сборщика, утечки и фрагментация — и на что смотреть под свою нагрузку

Aerospike и Apache Ignite: масштаб и грид

Aerospike и Apache Ignite: масштаб и грид

Две системы для масштаба: Aerospike с гибридной архитектурой памяти (индекс в DRAM по умолчанию, данные в RAM или на flash) — и живая цена индекса в байтах; и Apache Ignite как in-memory data grid + compute grid, где вычисление едет к данным через affinity colocation, а экономия сети измеряется в объектах

Tarantool и Picodata: данные и вычисления рядом

Tarantool и Picodata: данные и вычисления рядом

Tarantool как in-memory DB со встроенным Lua application server: stored procedures выполняются рядом с данными — перенос вычислений к данным, а не наоборот. Движки memtx и vinyl, persistence через WAL и snapshot. И Picodata — самостоятельная СУБД на форке того же ядра, где вычисления рядом с данными живут иначе: PostgreSQL-протокол снаружи, плагины на Rust внутри, метрики Prometheus и веб-интерфейс из коробки

Как писать тестируемый код

Как писать тестируемый код

Тестопригодность — свойство дизайна, а не тестов: если тяжело написать тест, проблема в коде. Швы и инъекция зависимостей, инъекция недетерминизма (часы, случайность, ID), functional core / imperative shell, зависимость от абстракций на границах и заход в легаси через characterization-тесты — на живом Go-стенде

Redis: кэш и структуры данных в памяти как ускоритель

Redis: кэш и структуры данных в памяти как ускоритель

Redis под углом ускорения: паттерны кэширования (cache-aside, write-through, TTL, инвалидация, защита от cache stampede) и структуры данных под задачи (sorted set для leaderboard и rate-limit, HyperLogLog) — и честные трейдофы кэша. Внутреннее устройство Redis сюда намеренно не входит: оно разобрано в отдельной серии deep-dive

Горутины, корутины, потоки: модели конкурентности в разных языках

Горутины, корутины, потоки: модели конкурентности в разных языках

Как C++, Go, Rust, Java, Python и Node решают один вопрос — как исполнять независимую работу параллельно с чужими стеками и планировщиками: потоки ОС, green/virtual threads, stackless-корутины и event loop. Вытеснение против кооперации, stackful против stackless, 1:1 против M:N — и чем каждая модель платит

Очереди задач: аренда и жизненный цикл джобы

Очереди задач: аренда и жизненный цикл джобы

Джоба — не сообщение: у неё есть владелец и срок владения. Как устроен цикл claim → lease → heartbeat → complete, что на самом деле удерживает джобу за воркером (не аренда), что происходит при смерти воркера и почему штатный SIGTERM при деплое способен выполнить работу дважды

Дженерики, шаблоны, erasure: параметрический полиморфизм в разных языках

Дженерики, шаблоны, erasure: параметрический полиморфизм в разных языках

Один вопрос — как написать код, работающий для многих типов, без дублирования — языки решают принципиально по-разному: мономорфизация (C++, Rust), стирание типов (Java), гибрид GC-shape stenciling (Go), реификация (C#). За синтаксисом стоит выбор компилятора, и он даёт измеримые последствия по скорости, размеру бинаря и выразительности