<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>khorost.tech</title><link>https://khorost.tech/</link><description>Заметки об IT и жизни. Docker, Go, инфраструктура и не только.</description><language>ru</language><managingEditor>Александр Хохлов</managingEditor><lastBuildDate>Mon, 12 Oct 2026 19:50:37 +0000</lastBuildDate><atom:link href="https://khorost.tech/index.xml" rel="self" type="application/rss+xml"/><item><title>Distributed SQL и NewSQL: CockroachDB, YugabyteDB, TiDB и OceanBase</title><link>https://khorost.tech/databases/distributed-sql-newsql/</link><pubDate>Mon, 12 Oct 2026 14:00:00 +0300</pubDate><guid>https://khorost.tech/databases/distributed-sql-newsql/</guid><media:content url="https://img.khorost.tech/YKVUgsdG-xX0dg88fwnm1W8t26aDqTR81OS75Kf3hyA/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvZGlzdHJpYnV0ZWQtc3FsLW5ld3NxbC12Mi5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/twcApcSyKRiiQzuIRHgqzLCACbyBbsfWgC60-nq7S30/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvZGlzdHJpYnV0ZWQtc3FsLW5ld3NxbC12Mi5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/YKVUgsdG-xX0dg88fwnm1W8t26aDqTR81OS75Kf3hyA/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvZGlzdHJpYnV0ZWQtc3FsLW5ld3NxbC12Mi5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Зачем нужен distributed SQL — горизонтальный масштаб с сохранением SQL и ACID-транзакций, как под капотом работают шардинг и консенсус (Raft у трёх движков, Paxos у OceanBase), чем платим латентностью распределённых транзакций и когда это оправдано против одиночного PostgreSQL с репликами. Все числа сняты на одном стенде: четыре движка, одинаковые замеры, назначенная задержка между узлами</description></item><item><title>Плагины Picodata на Rust: pike, миграции и blue-green</title><link>https://khorost.tech/databases/picodata-rust-plugins/</link><pubDate>Mon, 12 Oct 2026 12:00:00 +0300</pubDate><guid>https://khorost.tech/databases/picodata-rust-plugins/</guid><media:content url="https://img.khorost.tech/diyzxnqlMRSP5ovyuX2ScdkrL8TXyO_Hd-ou5z1jvaE/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGF0YWJhc2VzL3BpY29kYXRhLXBsdWdpbnMucG5n" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/euAREBKjQCe3lpW0dQtXkPGQLV3qgcENW_MtbcCOfIM/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGF0YWJhc2VzL3BpY29kYXRhLXBsdWdpbnMucG5n"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/diyzxnqlMRSP5ovyuX2ScdkrL8TXyO_Hd-ou5z1jvaE/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGF0YWJhc2VzL3BpY29kYXRhLXBsdWdpbnMucG5n" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Когда SQL не хватает, Picodata расширяют плагином на Rust: сервис внутри кластера со своим жизненным циклом, миграциями схемы и обновлением версий без остановки. Разбор на рабочем плагине — от скелета через pike до blue-green, включая места, где всё это ведёт себя не так, как ожидаешь</description></item><item><title>Метрики и Prometheus: RED, USE и бизнес-метрики</title><link>https://khorost.tech/observability/metrics-prometheus-red-use/</link><pubDate>Mon, 12 Oct 2026 10:00:00 +0300</pubDate><guid>https://khorost.tech/observability/metrics-prometheus-red-use/</guid><media:content url="https://img.khorost.tech/hI7rLL6Jb-wx4HshCDnkDlKZQJHJdpe0VwFuWyFbiVI/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvb2JzZXJ2YWJpbGl0eS9tZXRyaWNzLXByb21ldGhldXMtcmVkLXVzZS5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/BXS7Pi-_NFCFLo0QB3ys4kPY9kUpDIhD6WFb_ZWO7l8/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvb2JzZXJ2YWJpbGl0eS9tZXRyaWNzLXByb21ldGhldXMtcmVkLXVzZS5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/hI7rLL6Jb-wx4HshCDnkDlKZQJHJdpe0VwFuWyFbiVI/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvb2JzZXJ2YWJpbGl0eS9tZXRyaWNzLXByb21ldGhldXMtcmVkLXVzZS5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Метрики по делу: типы (counter/gauge/histogram), методологии RED и USE, кастомные бизнес-метрики через OTel Metrics, PromQL и главная ловушка Prometheus — кардинальность лейблов. Экспорт OTel в Prometheus. Практика на Go и Java.</description></item><item><title>«Доступна новая версия сайта»: как вкладка узнаёт о выкладке и почему не перезагружается сама</title><link>https://khorost.tech/architecture/vog-web-app-version-banner/</link><pubDate>Sun, 11 Oct 2026 14:00:00 +0300</pubDate><guid>https://khorost.tech/architecture/vog-web-app-version-banner/</guid><media:content url="https://img.khorost.tech/48Uk0q_3l8tF26QCmY-a1aiZelYwEgkuBRwEshDjdBo/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi92b2ctd2ViLWFwcC12ZXJzaW9uLWJhbm5lci5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/kpTZyF4uILICBd8CQkRMHiW_PVGxHROx4z2DXJqgcFI/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi92b2ctd2ViLWFwcC12ZXJzaW9uLWJhbm5lci5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/48Uk0q_3l8tF26QCmY-a1aiZelYwEgkuBRwEshDjdBo/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi92b2ctd2ViLWFwcC12ZXJzaW9uLWJhbm5lci5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Сайт VOG перестал перезагружать страницу при переходах, и вкладка стала жить часами на коде, загруженном до выкладки. Как вкладка узнаёт о новой сборке почти без лишней нагрузки на сервер — из заголовков обычных ответов и редкого опроса, — почему обновление предлагается кнопкой, а не делается само, и как одна строка ?v= дала на странице две копии React</description></item><item><title>Time-series БД: TimescaleDB и VictoriaMetrics</title><link>https://khorost.tech/databases/timeseries-databases/</link><pubDate>Sun, 11 Oct 2026 12:00:00 +0300</pubDate><guid>https://khorost.tech/databases/timeseries-databases/</guid><media:content url="https://img.khorost.tech/3kloBrwfAjXcziu22DBikI6JRqrjOVqntcAXlSB9XmA/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvdGltZXNlcmllcy1kYXRhYmFzZXMtdjMucG5n" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/YdzGZhz66xHSqkrWRGnf97_MTp8_vASHrIghBsWtkk0/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvdGltZXNlcmllcy1kYXRhYmFzZXMtdjMucG5n"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/3kloBrwfAjXcziu22DBikI6JRqrjOVqntcAXlSB9XmA/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvdGltZXNlcmllcy1kYXRhYmFzZXMtdjMucG5n" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Две школы хранения временных рядов — PostgreSQL с гипертаблицами TimescaleDB и метрические движки Prometheus и VictoriaMetrics — на одном стенде: как continuous aggregate отстаёт от свежих и опоздавших данных и стирает историю после ретеншна, во что обходятся точка и ряд в каждой системе и почему increase() в Prometheus и VictoriaMetrics отвечает по-разному</description></item><item><title>Установщик на Go для Windows-клиента: как VOG ушёл от MSI и redist</title><link>https://khorost.tech/go/vog-go-windows-launcher/</link><pubDate>Sat, 10 Oct 2026 14:00:00 +0300</pubDate><guid>https://khorost.tech/go/vog-go-windows-launcher/</guid><media:content url="https://img.khorost.tech/e_b2RelfqQACqreoLSdWEzY67PpamXKYwwVHjepztdw/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi92b2ctZ28td2luZG93cy1sYXVuY2hlci5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/KvSutJ47tUytodo5IdNXg6vpW-mjzzzqYCgkx22dbiQ/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi92b2ctZ28td2luZG93cy1sYXVuY2hlci5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/e_b2RelfqQACqreoLSdWEzY67PpamXKYwwVHjepztdw/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi92b2ctZ28td2luZG93cy1sYXVuY2hlci5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Старый MSI-установщик VOG перестал ставиться на свежие Windows из-за распространяемого пакета Visual C++. Как вместо него появился загрузчик на Go — один статический файл без cgo и без единой сторонней зависимости, с окном на голом WinAPI, модульной установкой, откатом версий, двумя слоями подписей Ed25519 и честными отношениями с антивирусами</description></item><item><title>Мигратор схемы: на чём он стоит и что ломается вне ванильного PostgreSQL</title><link>https://khorost.tech/architecture/schema-migrators-across-databases/</link><pubDate>Sat, 10 Oct 2026 12:00:00 +0300</pubDate><guid>https://khorost.tech/architecture/schema-migrators-across-databases/</guid><media:content url="https://img.khorost.tech/znD2oKVCbBpu55tRAZ8nPskpQdqecegMgnuK0gI2_jI/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvYXJjaGl0ZWN0dXJlL3NjaGVtYS1taWdyYXRvcnMtYWNyb3NzLWRhdGFiYXNlcy5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/q9IFWamejUi6qtAnYxsbW0oTDMLT-rReM8bRR1rddBQ/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvYXJjaGl0ZWN0dXJlL3NjaGVtYS1taWdyYXRvcnMtYWNyb3NzLWRhdGFiYXNlcy5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/znD2oKVCbBpu55tRAZ8nPskpQdqecegMgnuK0gI2_jI/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvYXJjaGl0ZWN0dXJlL3NjaGVtYS1taWdyYXRvcnMtYWNyb3NzLWRhdGFiYXNlcy5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Мигратор — не «скрипты по порядку», а программа со своими требованиями к СУБД: журнал версий, транзакционный DDL, интроспекция каталогов. Живая матрица пяти инструментов (goose, Flyway, Liquibase, Atlas, Alembic) против PostgreSQL, CockroachDB и Picodata: на Picodata ни один не дошёл до первой миграции, на CockroachDB два споткнулись о собственную служебную часть. Плюс декларативный против императивного, привязка к формату и что на самом деле стоит денег в бесплатных редакциях</description></item><item><title>Распределённый SQL Picodata: планы, motion и цена ключа шардирования</title><link>https://khorost.tech/databases/picodata-distributed-sql-sbroad/</link><pubDate>Fri, 09 Oct 2026 12:00:00 +0300</pubDate><guid>https://khorost.tech/databases/picodata-distributed-sql-sbroad/</guid><media:content url="https://img.khorost.tech/41TkvOwBx95n0FiuA7SXyVqjG3J1ug2uZXFumlSxGFo/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGF0YWJhc2VzL3BpY29kYXRhLXNicm9hZC5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/AZjQ1CJw5CS4T2JrFIche5KiTL1k-etM9zhqVzK9lm4/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGF0YWJhc2VzL3BpY29kYXRhLXNicm9hZC5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/41TkvOwBx95n0FiuA7SXyVqjG3J1ug2uZXFumlSxGFo/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGF0YWJhc2VzL3BpY29kYXRhLXNicm9hZC5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Как Picodata исполняет SQL на кластере: план, адресация к бакетам, двухфазная агрегация и motion — перенос данных между узлами. Почему соединение по ключу шардирования обходится без переноса, а обычное на объёме просто не выполняется, и откуда берутся два лимита, в которые упирается всё</description></item><item><title>Логи и корреляция: структурные логи, trace_id и Loki</title><link>https://khorost.tech/observability/logs-correlation-loki/</link><pubDate>Fri, 09 Oct 2026 10:00:00 +0300</pubDate><guid>https://khorost.tech/observability/logs-correlation-loki/</guid><media:content url="https://img.khorost.tech/yFZFrTgH2c9FtR0dx5N2UL2sgjJA6yDpURoEgrNgifg/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvb2JzZXJ2YWJpbGl0eS9sb2dzLWNvcnJlbGF0aW9uLWxva2kucG5n" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/suwtHL_0vKD_AxYFkmp_wnTChOFEdHFo5x4wvitlUTc/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvb2JzZXJ2YWJpbGl0eS9sb2dzLWNvcnJlbGF0aW9uLWxva2kucG5n"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/yFZFrTgH2c9FtR0dx5N2UL2sgjJA6yDpURoEgrNgifg/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvb2JzZXJ2YWJpbGl0eS9sb2dzLWNvcnJlbGF0aW9uLWxva2kucG5n" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Структурный лог и коррелируемый лог — не одно и то же: в Go trace_id в stdout приходится добавлять руками, в Java его кладёт агент. Разбираем модель Loki, замеряем последствия высокой кардинальности (2 стрима против 1202), выясняем, почему на OTLP-логах не работает привычный json-парсер, и ловим ошибку корреляции, которая проявляется у каждого шестнадцатого трейса.</description></item><item><title>SQLite и встраиваемые БД: когда файл бьёт сервер</title><link>https://khorost.tech/databases/sqlite-embedded-databases/</link><pubDate>Thu, 08 Oct 2026 14:00:00 +0300</pubDate><guid>https://khorost.tech/databases/sqlite-embedded-databases/</guid><media:content url="https://img.khorost.tech/Fe7WrKlXJL0DgwKjztuJfvbP8hZdZIifTSvngMeKCqI/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvc3FsaXRlLWVtYmVkZGVkLWRhdGFiYXNlcy5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/mMyn6Q5uH5Dr3e270FjX4VfZ7Zu84LMbF0tm4yjO2KI/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvc3FsaXRlLWVtYmVkZGVkLWRhdGFiYXNlcy5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/Fe7WrKlXJL0DgwKjztuJfvbP8hZdZIifTSvngMeKCqI/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvc3FsaXRlLWVtYmVkZGVkLWRhdGFiYXNlcy5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;SQLite — не игрушка и не «база для мобилок»: это самая распространённая БД в мире, которая всё чаще стоит в проде на бэкенде. На стенде с тремя плечами — где single-file БД в процессе бьёт отдельный Postgres по латентности (больше порядка величины даже без сети — 12.6–19.1 раза по кругам замера) и простоте деплоя, а где нет: на честной, полностью долговечной записи fsync выравнивает всех, и SQLite на ней слегка проигрывает, а один писатель на файл — жёсткий потолок конкурентной записи. Плюс как не потерять данные (WAL-режим, litestream, репликация) и чем embedded-семейство отличается — SQLite, DuckDB для аналитики, встраиваемые KV (RocksDB/BadgerDB)</description></item><item><title>Планирование подов вглубь: taints, affinity, topology и приоритеты</title><link>https://khorost.tech/kubernetes/k8s-pod-scheduling-affinity-taints/</link><pubDate>Thu, 08 Oct 2026 12:00:00 +0300</pubDate><guid>https://khorost.tech/kubernetes/k8s-pod-scheduling-affinity-taints/</guid><media:content url="https://img.khorost.tech/T3pPEIEzDsV5BowvNHgCppgn58b1KLSsjTATaalEAIY/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gva3ViZXJuZXRlcy9rOHMtcG9kLXNjaGVkdWxpbmctYWZmaW5pdHktdGFpbnRzLnBuZw" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/giTDb9EwH8iW8y17PduImNHVIQlNFKTR8mwS88vqlRc/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gva3ViZXJuZXRlcy9rOHMtcG9kLXNjaGVkdWxpbmctYWZmaW5pdHktdGFpbnRzLnBuZw"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/T3pPEIEzDsV5BowvNHgCppgn58b1KLSsjTATaalEAIY/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gva3ViZXJuZXRlcy9rOHMtcG9kLXNjaGVkdWxpbmctYWZmaW5pdHktdGFpbnRzLnBuZw" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;requests/limits говорят «сколько», но не «куда» — а раскладку подов по узлам определяют другие рычаги: taints/tolerations (узел отталкивает поды), node/pod affinity и anti-affinity (тянуть к или разводить), topology spread (равномерно по зонам), priority и preemption (кого выселить под важный под). Как управлять размещением осознанно и не собрать все реплики в одной стойке</description></item><item><title>Распределённый трейсинг end-to-end: контекст через HTTP, БД и брокеры</title><link>https://khorost.tech/observability/distributed-tracing-tempo/</link><pubDate>Thu, 08 Oct 2026 10:00:00 +0300</pubDate><guid>https://khorost.tech/observability/distributed-tracing-tempo/</guid><media:content url="https://img.khorost.tech/LDHtUyIsJeXWfyqcEd1OowmRu9wgKY_hwtuIeDyl5ig/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvb2JzZXJ2YWJpbGl0eS9kaXN0cmlidXRlZC10cmFjaW5nLXRlbXBvLnBuZw" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/1B6iolv1sW0meq9OQRYH6wL4Eg0GvzyZy-lLT8qu_Hs/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvb2JzZXJ2YWJpbGl0eS9kaXN0cmlidXRlZC10cmFjaW5nLXRlbXBvLnBuZw"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/LDHtUyIsJeXWfyqcEd1OowmRu9wgKY_hwtuIeDyl5ig/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvb2JzZXJ2YWJpbGl0eS9kaXN0cmlidXRlZC10cmFjaW5nLXRlbXBvLnBuZw" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Распределённый трейсинг держится на одном: контекст должен пережить каждую границу. Разбираем W3C trace context дословно с провода, проброс через HTTP, PostgreSQL и NATS, два воспроизводимых разрыва трейса, head- и tail-семплинг с фактическими долями и две ловушки TraceQL, которые дают правдоподобные неверные числа.</description></item><item><title>Порядок вывода легаси: почему VOG переносит игры по одной</title><link>https://khorost.tech/architecture/vog-legacy-decommission-order/</link><pubDate>Wed, 07 Oct 2026 14:00:00 +0300</pubDate><guid>https://khorost.tech/architecture/vog-legacy-decommission-order/</guid><media:content url="https://img.khorost.tech/Zz1VzgRuJCq5hK05ssZNVvMjA0eeyPG4NebDtz_KlI8/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi92b2ctbGVnYWN5LWRlY29tbWlzc2lvbi1vcmRlci5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/-ecQ7_LqUf0fGK4WKWR8Q5Qx78NrMMgm2sQo1mV-qAM/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi92b2ctbGVnYWN5LWRlY29tbWlzc2lvbi1vcmRlci5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/Zz1VzgRuJCq5hK05ssZNVvMjA0eeyPG4NebDtz_KlI8/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi92b2ctbGVnYWN5LWRlY29tbWlzc2lvbi1vcmRlci5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Почему перезапуск VOG не стал «переписать всё с нуля»: откуда в проекте привычка к осторожности, что пришлось сделать в 2021 году, чтобы старый C++-сервер вообще можно было собрать и запустить, и как в 2026-м выбрали порядок — сначала общее хранилище для всех игр, потом по одной игре, на каждом шаге меняется что-то одно</description></item><item><title>Picodata и PostgreSQL: где кончается совместимость</title><link>https://khorost.tech/databases/picodata-postgres-protocol/</link><pubDate>Wed, 07 Oct 2026 12:00:00 +0300</pubDate><guid>https://khorost.tech/databases/picodata-postgres-protocol/</guid><media:content url="https://img.khorost.tech/8p1jY_UVRgq7becEt4wnZ92PccRNyYt081TFCXNJzbI/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGF0YWJhc2VzL3BpY29kYXRhLXBnLXByb3RvY29sLnBuZw" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/WsiEqoILfzn8thBZpEXFdsnwuVn5LiqiiiMawEv-WcA/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGF0YWJhc2VzL3BpY29kYXRhLXBnLXByb3RvY29sLnBuZw"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/8p1jY_UVRgq7becEt4wnZ92PccRNyYt081TFCXNJzbI/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGF0YWJhc2VzL3BpY29kYXRhLXBnLXByb3RvY29sLnBuZw" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;PostgreSQL-протокол — основной способ работы с Picodata: psql, pgx и psycopg подключаются к ней тем же кодом, что к PostgreSQL. Но совместимость частичная, и граница проходит не там, где ожидаешь. Живая матрица пяти клиентов против 59 SQL-конструкций, поведение pg_dump и мигратора, и почему у Picodata собственный JDBC-драйвер</description></item><item><title>Инструментирование OpenTelemetry в Go и Java: traces, metrics, logs</title><link>https://khorost.tech/observability/otel-instrumentation-go-java/</link><pubDate>Wed, 07 Oct 2026 10:00:00 +0300</pubDate><guid>https://khorost.tech/observability/otel-instrumentation-go-java/</guid><media:content url="https://img.khorost.tech/cipku-fBL5ULK6hS94vnI-jESXuoVGQY-sUaJeKXqYs/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvb2JzZXJ2YWJpbGl0eS9vdGVsLWluc3RydW1lbnRhdGlvbi1nby1qYXZhLnBuZw" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/o-gRAZ2h0o9OeAlFwP0o-swzEHSnIYrpIPbf2d3gC88/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvb2JzZXJ2YWJpbGl0eS9vdGVsLWluc3RydW1lbnRhdGlvbi1nby1qYXZhLnBuZw"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/cipku-fBL5ULK6hS94vnI-jESXuoVGQY-sUaJeKXqYs/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvb2JzZXJ2YWJpbGl0eS9vdGVsLWluc3RydW1lbnRhdGlvbi1nby1qYXZhLnBuZw" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Как инструментировать сервисы через OpenTelemetry: разделение SDK и API, три сигнала, auto- и manual-инструментализация, spans и context propagation, экспорт в Collector по OTLP. Практика на Go (SDK + slog-bridge) и Java (OTel-агент), с замерами накладных расходов на живом стенде.</description></item><item><title>Оптимизация запросов PostgreSQL: EXPLAIN на практике</title><link>https://khorost.tech/databases/postgres-query-optimization-explain/</link><pubDate>Tue, 06 Oct 2026 12:00:00 +0300</pubDate><guid>https://khorost.tech/databases/postgres-query-optimization-explain/</guid><media:content url="https://img.khorost.tech/1KYnvJ9wXHu2KeRz8TIEzem0ZGNg9DTWT09p2TtAXO4/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvcG9zdGdyZXMtcXVlcnktb3B0aW1pemF0aW9uLWV4cGxhaW4ucG5n" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/bxHtZYQj8prkk6BzKf7tj2YSddICW1S9h-MB5o93l88/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvcG9zdGdyZXMtcXVlcnktb3B0aW1pemF0aW9uLWV4cGxhaW4ucG5n"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/1KYnvJ9wXHu2KeRz8TIEzem0ZGNg9DTWT09p2TtAXO4/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvcG9zdGdyZXMtcXVlcnktb3B0aW1pemF0aW9uLWV4cGxhaW4ucG5n" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Чтение EXPLAIN (ANALYZE, BUFFERS) на практике: seq scan против index и bitmap scan, типы индексов (btree/GiN/GiST/BRIN), статистика и планировщик, частые антипаттерны (функции по колонке, OR, N+1) и поиск тяжёлых запросов через pg_stat_statements</description></item><item><title>Ресурсы в Kubernetes: requests, limits и QoS</title><link>https://khorost.tech/kubernetes/k8s-resources-requests-limits-qos/</link><pubDate>Tue, 06 Oct 2026 11:00:00 +0300</pubDate><guid>https://khorost.tech/kubernetes/k8s-resources-requests-limits-qos/</guid><media:content url="https://img.khorost.tech/gs_nU6759J9KbzE9i7CD1QRuPEwn7Ga-qYdFbkbYUkQ/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gva3ViZXJuZXRlcy9rOHMtcmVzb3VyY2VzLXJlcXVlc3RzLWxpbWl0cy1xb3MucG5n" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/2usghZlSzzinTP6NqS4BGA5Yh-hmmcj1_3byytDIs24/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gva3ViZXJuZXRlcy9rOHMtcmVzb3VyY2VzLXJlcXVlc3RzLWxpbWl0cy1xb3MucG5n"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/gs_nU6759J9KbzE9i7CD1QRuPEwn7Ga-qYdFbkbYUkQ/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gva3ViZXJuZXRlcy9rOHMtcmVzb3VyY2VzLXJlcXVlc3RzLWxpbWl0cy1xb3MucG5n" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;requests и limits — не одно и то же, и путаница между ними стоит дорого: CPU throttling там, где нагрузки нет, и OOMKill там, где памяти хватало. Разбираем QoS-классы, механику CFS и cgroups и как выставлять ресурсы по факту, а не наугад.</description></item><item><title>Passkeys и WebAuthn на вебе: passwordless без фишинга</title><link>https://khorost.tech/security/auth-passkeys-webauthn/</link><pubDate>Mon, 05 Oct 2026 14:00:00 +0300</pubDate><guid>https://khorost.tech/security/auth-passkeys-webauthn/</guid><media:content url="https://img.khorost.tech/NDdIO49VyovLmHFCkHfMo9KiJZR-2kfB_EZ-zQ_dbtw/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1wYXNza2V5cy13ZWJhdXRobi5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/VGK4QGr2R5nCMoHhFd01bKX_e5X0c2xjtPUyP2XlzOw/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1wYXNza2V5cy13ZWJhdXRobi5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/NDdIO49VyovLmHFCkHfMo9KiJZR-2kfB_EZ-zQ_dbtw/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1wYXNza2V5cy13ZWJhdXRobi5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Как убрать пароль на вебе: WebAuthn/FIDO2 — асимметричная криптография вместо секрета, сервер хранит только публичный ключ, а подпись привязана к origin — поэтому фишинг и утечка БД перестают давать вход. Registration (attestation) и login (assertion), resident keys и синхронизируемые passkeys, привязка к origin, UX и фолбэки — и что нужно на бэкенде, чтобы это принять</description></item><item><title>Picodata: что это на самом деле, а не «Tarantool с кластером»</title><link>https://khorost.tech/databases/picodata-architecture-fork-vs-product/</link><pubDate>Mon, 05 Oct 2026 12:00:00 +0300</pubDate><guid>https://khorost.tech/databases/picodata-architecture-fork-vs-product/</guid><media:content url="https://img.khorost.tech/Gx25SrtDTCYk2no6duJ1Ypcadet7vIeIvmtagkFYTKs/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGF0YWJhc2VzL3BpY29kYXRhLWFyY2hpdGVjdHVyZS5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/z-fXaxnv_TsM29iShV3M5HVwZ3-XLBiKavvxQPXB6LE/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGF0YWJhc2VzL3BpY29kYXRhLWFyY2hpdGVjdHVyZS5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/Gx25SrtDTCYk2no6duJ1Ypcadet7vIeIvmtagkFYTKs/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGF0YWJhc2VzL3BpY29kYXRhLWFyY2hpdGVjdHVyZS5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Picodata выросла из форка Tarantool, но это самостоятельная СУБД: свой планировщик распределённых запросов, свой кластер-менеджер на Raft, PostgreSQL как основной протокол и расширение плагинами на Rust. Разбор устройства на живом кластере — репликасеты, бакеты, тиры — и что происходит с ответами на запросы, когда узлы выходят из строя</description></item><item><title>Реальный IP клиента за HAProxy: PROXY protocol в C++-сервере из 2000-х</title><link>https://khorost.tech/infrastructure/proxy-protocol-cpp-server/</link><pubDate>Mon, 05 Oct 2026 10:00:00 +0300</pubDate><guid>https://khorost.tech/infrastructure/proxy-protocol-cpp-server/</guid><media:content url="https://img.khorost.tech/PZPoFYGzRvJykeNLcP8GDeysg9MxWH6FIk56FDjuD-4/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi9wcm94eS1wcm90b2NvbC1jcHAtc2VydmVyLnBuZw" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/9b3_KTzANUWYHoSxwx7vs4w3gwERAV1hkqUBiSecCBE/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi9wcm94eS1wcm90b2NvbC1jcHAtc2VydmVyLnBuZw"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/PZPoFYGzRvJykeNLcP8GDeysg9MxWH6FIk56FDjuD-4/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi9wcm94eS1wcm90b2NvbC1jcHAtc2VydmVyLnBuZw" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Игровые серверы VOG переехали на закрытую площадку за HAProxy в режиме TCP — и перестали видеть адрес игрока. Как PROXY protocol v1/v2 вернул адрес клиента без изменений в клиентах, как выглядит доработка старого C++-сервера и что в ней стоит исправить</description></item><item><title>VOG — Vinco Online Games: почти 30 лет настольных игр онлайн, от Windows-клиента до браузера</title><link>https://khorost.tech/hobby/vog-transformation/</link><pubDate>Sun, 04 Oct 2026 12:00:00 +0300</pubDate><guid>https://khorost.tech/hobby/vog-transformation/</guid><media:content url="https://img.khorost.tech/4MmzXWW5qjtl4YdpRF_F7DnIIMCrBmcVIwdB8GRgS-4/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi92b2ctdHJhbnNmb3JtYXRpb24ucG5n" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/Xc_KyQhDPCdtYKvQ2fI7JAJm6-mbkQK7y-UZhTY1Mss/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi92b2ctdHJhbnNmb3JtYXRpb24ucG5n"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/4MmzXWW5qjtl4YdpRF_F7DnIIMCrBmcVIwdB8GRgS-4/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvdm9nY2x1Yi92b2ctdHJhbnNmb3JtYXRpb24ucG5n" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Закулисье vogclub.com от разработчика, который работал над ним в 1999–2003 годах и в 2021-м забрал проект за шаг до закрытия: отдельные Windows-программы на vog.ru, оболочка VOG Shell, ставка на ActiveX, долгая пауза и перезапуск 2026 года на Go и Kubernetes с веб-клиентом. Первая статья серии о технологиях VOG</description></item><item><title>MFA и TOTP: второй фактор, recovery-коды и step-up</title><link>https://khorost.tech/security/auth-mfa-totp/</link><pubDate>Sat, 03 Oct 2026 12:00:00 +0300</pubDate><guid>https://khorost.tech/security/auth-mfa-totp/</guid><media:content url="https://img.khorost.tech/Q_wIHbSTfgxLFdJOtiYMOsfG_3NPL-uTk47muG_f99g/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1tZmEtdG90cC5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/bu7nLvV9M63J2B7SL3B0XFM3-SXLlfLmUiVb8IeuH-E/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1tZmEtdG90cC5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/Q_wIHbSTfgxLFdJOtiYMOsfG_3NPL-uTk47muG_f99g/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1tZmEtdG90cC5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Пароль или OAuth — один фактор; второй закрывает кражу учётки. Как устроен TOTP (RFC 6238: общий секрет + время → код), почему он лучше SMS, как хранить секрет и восстанавливать доступ (recovery-коды), что такое step-up authentication (запросить фактор только на опасное действие) и куда движется мир после паролей — мостик к passkeys</description></item><item><title>OAuth2 и OIDC вглубь: authorization code, PKCE, device flow</title><link>https://khorost.tech/security/auth-oauth2-oidc-flows/</link><pubDate>Fri, 02 Oct 2026 14:00:00 +0300</pubDate><guid>https://khorost.tech/security/auth-oauth2-oidc-flows/</guid><media:content url="https://img.khorost.tech/aOnHu_jm9q46Ce5eSZs-AC6hOwHnQAtWhCD02jPtYRo/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1vYXV0aDItb2lkYy1mbG93cy5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/T7H-7jonsgpvelfpVZBwUANqQl-grxGjkUxTh4PQnSg/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1vYXV0aDItb2lkYy1mbG93cy5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/aOnHu_jm9q46Ce5eSZs-AC6hOwHnQAtWhCD02jPtYRo/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1vYXV0aDItb2lkYy1mbG93cy5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Не «какой провайдер подключить», а как устроены сами флоу: authorization code + PKCE (и почему implicit умер), client credentials для сервис-сервис, device flow для TV/CLI, token introspection (opaque) vs локальная валидация JWT по JWKS, OIDC discovery. Разница между OAuth2 (делегирование доступа) и OIDC (аутентификация поверх)</description></item><item><title>Партиционирование, VACUUM и борьба с bloat в PostgreSQL</title><link>https://khorost.tech/databases/postgres-partitioning-vacuum-bloat/</link><pubDate>Fri, 02 Oct 2026 10:00:00 +0300</pubDate><guid>https://khorost.tech/databases/postgres-partitioning-vacuum-bloat/</guid><media:content url="https://img.khorost.tech/Pcm1Hz0UW4nyGNMPImYPmBdZP-0Zd4mufthk8ZwlHjE/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvcG9zdGdyZXMtcGFydGl0aW9uaW5nLXZhY3V1bS1ibG9hdC5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/SWzUJY6SJMJfqLFWWzSxOhoYT4TFyTotu9A7WVZ5I8I/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvcG9zdGdyZXMtcGFydGl0aW9uaW5nLXZhY3V1bS1ibG9hdC5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/Pcm1Hz0UW4nyGNMPImYPmBdZP-0Zd4mufthk8ZwlHjE/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvcG9zdGdyZXMtcGFydGl0aW9uaW5nLXZhY3V1bS1ibG9hdC5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Обслуживание хранилища PostgreSQL: declarative partitioning (range/list/hash), MVCC и природа bloat, тюнинг autovacuum, VACUUM против VACUUM FULL и pg_repack, transaction ID wraparound и freeze, мониторинг раздувания таблиц</description></item><item><title>Refresh на клиенте: несколько устройств и вкладок</title><link>https://khorost.tech/security/auth-client-refresh-multi-device-tabs/</link><pubDate>Thu, 01 Oct 2026 14:00:00 +0300</pubDate><guid>https://khorost.tech/security/auth-client-refresh-multi-device-tabs/</guid><media:content url="https://img.khorost.tech/yqEEoqoY2aDLQ_zkKPikuZ-2tr3sd7GDS9sIuqyj1xA/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1jbGllbnQtcmVmcmVzaC5wbmc" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/ODqmmNZyY_pZcSjgEpiKiiGQH2Fx66KQaJ2ZnimcqL8/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1jbGllbnQtcmVmcmVzaC5wbmc"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/yqEEoqoY2aDLQ_zkKPikuZ-2tr3sd7GDS9sIuqyj1xA/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1jbGllbnQtcmVmcmVzaC5wbmc" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Самая болезненная часть авторизации — обновление токенов на клиенте: независимые сессии на устройствах, гонка refresh нескольких вкладок с общей cookie (перезапись токена, ложный разлогин, фантомные сессии) и её решение — grace-period и refresh-lock на сервере плюс BroadcastChannel и Web Locks на клиенте</description></item><item><title>Архитектура Kubernetes: control plane и reconciliation loop</title><link>https://khorost.tech/kubernetes/k8s-architecture-control-plane/</link><pubDate>Thu, 01 Oct 2026 11:00:00 +0300</pubDate><guid>https://khorost.tech/kubernetes/k8s-architecture-control-plane/</guid><media:content url="https://img.khorost.tech/GYXcxKPVluBxJbx5odAbSbiVdeG1ZY2VdnbmCJm7P4M/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gva3ViZXJuZXRlcy9rOHMtYXJjaGl0ZWN0dXJlLWNvbnRyb2wtcGxhbmUucG5n" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/O0i8sHSlTjgnlGdTya7LqlCl49AGppOqL2nnQIdmGEU/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gva3ViZXJuZXRlcy9rOHMtYXJjaGl0ZWN0dXJlLWNvbnRyb2wtcGxhbmUucG5n"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/GYXcxKPVluBxJbx5odAbSbiVdeG1ZY2VdnbmCJm7P4M/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gva3ViZXJuZXRlcy9rOHMtYXJjaGl0ZWN0dXJlLWNvbnRyb2wtcGxhbmUucG5n" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Что крутится, когда вы делаете kubectl apply: API server как единственная дверь к etcd, scheduler раскладывает поды по узлам, controller manager бесконечно сверяет желаемое с фактическим (reconciliation loop), kubelet на узле воплощает поды через CRI, а CNI/CSI дают им сеть и хранилище. Ментальная модель k8s как набора контроллеров вокруг декларативного состояния — фундамент под всю практику</description></item><item><title>Вход и регистрация: email-код, OAuth, OTP, Telegram</title><link>https://khorost.tech/security/auth-login-registration-oauth-otp-telegram/</link><pubDate>Wed, 30 Sep 2026 14:00:00 +0300</pubDate><guid>https://khorost.tech/security/auth-login-registration-oauth-otp-telegram/</guid><media:content url="https://img.khorost.tech/aHbNoPL82aqYcYI0SZ18Cm92E4EzdgiON4_sKlDa8k8/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1sb2dpbi1yZWdpc3RyYXRpb24ucG5n" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/DIccppbPCDBkCckHL6DwXGS_yNfpEtozvdtDG-iSzkE/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1sb2dpbi1yZWdpc3RyYXRpb24ucG5n"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/aHbNoPL82aqYcYI0SZ18Cm92E4EzdgiON4_sKlDa8k8/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1sb2dpbi1yZWdpc3RyYXRpb24ucG5n" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Методы входа и как они сходятся к единой сессии: беспарольный email-код и OTP с лимитами, OAuth поверх OIDC со state/PKCE, вход через Telegram (widget-HMAC и небезопасный OAuth-контраст), авто-регистрация при первом входе — и почему методы намеренно НЕ сливаются в один аккаунт по непроверенному email (fail-safe, а не готовый merge)</description></item><item><title>Пулинг соединений PostgreSQL: PgBouncer и pgcat</title><link>https://khorost.tech/databases/postgres-pooling-pgbouncer/</link><pubDate>Wed, 30 Sep 2026 10:00:00 +0300</pubDate><guid>https://khorost.tech/databases/postgres-pooling-pgbouncer/</guid><media:content url="https://img.khorost.tech/o1ScbVRfUytddJCx60LJwmEu8J1DzNQapb-WjsLX3KA/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvcG9zdGdyZXMtcG9vbGluZy1wZ2JvdW5jZXIucG5n" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/xnxJTlwFGjn0gmnN_rEksLld0lnu3WpDcpwMf2G0kqA/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvcG9zdGdyZXMtcG9vbGluZy1wZ2JvdW5jZXIucG5n"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/o1ScbVRfUytddJCx60LJwmEu8J1DzNQapb-WjsLX3KA/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvZGIvcG9zdGdyZXMtcG9vbGluZy1wZ2JvdW5jZXIucG5n" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Инфраструктурный пулер перед PostgreSQL: почему соединения дорогие, режимы session/transaction/statement pooling, PgBouncer против pgcat (шардинг, балансировка), подводные камни transaction pooling (prepared statements, SET) и где ставить пул</description></item><item><title>Визуализаторы событийных потоков: зачем они и какие бывают</title><link>https://khorost.tech/messaging/event-stream-visualizers-purpose/</link><pubDate>Tue, 29 Sep 2026 14:00:00 +0300</pubDate><guid>https://khorost.tech/messaging/event-stream-visualizers-purpose/</guid><media:content url="https://img.khorost.tech/HCyp0t4RMwb14-BLUgMDLHxDftrpZsgQU_Mea5_RdA0/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvbWVzc2FnaW5nL2V2ZW50LXN0cmVhbS12aXN1YWxpemVycy1wdXJwb3NlLnBuZw" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/RqhGE2nhsJvBJ0toI5AOBk-aA3Ia4qXXLLA17BCTVn8/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvbWVzc2FnaW5nL2V2ZW50LXN0cmVhbS12aXN1YWxpemVycy1wdXJwb3NlLnBuZw"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/HCyp0t4RMwb14-BLUgMDLHxDftrpZsgQU_Mea5_RdA0/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvbWVzc2FnaW5nL2V2ZW50LXN0cmVhbS12aXN1YWxpemVycy1wdXJwb3NlLnBuZw" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Что такое визуализаторы Kafka и событийных потоков, зачем они нужны и почему под одним словом скрываются пять разных классов инструментов с разными целями — от учебных симуляторов до runtime-lineage</description></item><item><title>Сложный путь: выделенный auth, JWT и refresh в Redis</title><link>https://khorost.tech/security/auth-multi-service-jwt-refresh-redis/</link><pubDate>Tue, 29 Sep 2026 12:00:00 +0300</pubDate><guid>https://khorost.tech/security/auth-multi-service-jwt-refresh-redis/</guid><media:content url="https://img.khorost.tech/1f8vE61dBLmghVp3mJwOZQXaN5A3e91XyyNau4TRRxg/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1tdWx0aS1zZXJ2aWNlLnBuZw" medium="image" type="image/png"/><media:thumbnail url="https://img.khorost.tech/cvE_qy-37XAh8IhkdWpMvuFVh-2nQL0BC4cRve3y1lg/rs:fit:400:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1tdWx0aS1zZXJ2aWNlLnBuZw"/><description>&lt;p&gt;&lt;img src="https://img.khorost.tech/1f8vE61dBLmghVp3mJwOZQXaN5A3e91XyyNau4TRRxg/rs:fit:1200:0/aHR0cHM6Ly9jZG4ua2hvcm9zdC50ZWNoL3RlY2gvc2VjdXJpdHkvYXV0aC1tdWx0aS1zZXJ2aWNlLnBuZw" alt="khorost.tech" loading="lazy"&gt;&lt;/p&gt;Авторизация для многих микросервисов без общей БД сессий в горячем пути: выделенный auth-сервис выпускает JWT access + opaque refresh, сервисы валидируют JWT локально общим middleware, refresh-сессии в Redis, роли в claims, глобальный logout — и честная цена stateless: отзыв только через короткий TTL access и ревокацию refresh</description></item></channel></rss>