Который раз убеждаюсь — профессия разработчика не даёт заскучать. Каждый день узнаёшь что-то новое.
Недавно со мной поделились интересной находкой: оказывается, в Nginx Ingress есть встроенная поддержка телеметрии. Можно буквально «из коробки» настроить отправку трейсов в OTLP, например, в Jaeger.
Я-то всегда был уверен, что в бесплатном Nginx такой возможности нет, и даже мысли не возникало искать её в Ingress. А зря 🙂
И самое приятное: даже для «чистого» бесплатного Nginx тоже есть решение — nginx-otel. Судя по описанию, этот модуль работает аж в 4 раза эффективнее официального варианта из Nginx Plus.
#nginx #otel #observability #devops #ingress
Недавно со мной поделились интересной находкой: оказывается, в Nginx Ingress есть встроенная поддержка телеметрии. Можно буквально «из коробки» настроить отправку трейсов в OTLP, например, в Jaeger.
Я-то всегда был уверен, что в бесплатном Nginx такой возможности нет, и даже мысли не возникало искать её в Ingress. А зря 🙂
И самое приятное: даже для «чистого» бесплатного Nginx тоже есть решение — nginx-otel. Судя по описанию, этот модуль работает аж в 4 раза эффективнее официального варианта из Nginx Plus.
#nginx #otel #observability #devops #ingress
GitHub
nginx-otel/README.md at main · nginxinc/nginx-otel
Contribute to nginxinc/nginx-otel development by creating an account on GitHub.
👍8
Самое смешное
Как правило растут, видимо ждали AI, но его не будет еще год.
Акции Apple начали падать после презентации новых гаджетов
Как правило растут, видимо ждали AI, но его не будет еще год.
Начался учебный год — у меня ещё нет пар, но в преддверии занятий делюсь полезной заметкой по БД. Часто вижу, как «на всякий случай» выбирают типы побольше — в итоге едим место, замедляем индексы и ловим баги.
❌ Антипаттерны, которые встречаю:
-
-
-
-
✅ Как делаю сам:
- Строки — по задаче:
- Деньги — только
- Булево —
- Даты/время —
- Автонумерация —
📌 Пример
-- Плохо
price FLOAT;
-- Хорошо
price NUMERIC(10,2);
⚡️ Итог: грамотный выбор типов = меньше места, быстрее запросы, меньше багов.
#БД #SQL #PostgreSQL #Оптимизация #Backend #DataEngineering
❌ Антипаттерны, которые встречаю:
-
VARCHAR(255) «для всего подряд», даже если код фиксированной длины (например, 10 символов).-
TEXT для email-адресов.-
BIGINT для счётчика, где максимум — тысяча записей.-
FLOAT для денег (теряется точность).✅ Как делаю сам:
- Строки — по задаче:
VARCHAR(254)`/`VARCHAR(320) для email (под стандарты), CHAR(2) для кода страны.- Деньги — только
NUMERIC(10,2) / DECIMAL(10,2) или целые «копейки/центы» в INT`/`BIGINT.- Булево —
BOOLEAN, а не INT.- Даты/время —
DATE / TIMESTAMP, не строка.- Автонумерация —
INT по умолчанию; BIGINT — только если реально ждёте > 2 млрд строк.📌 Пример
-- Плохо
price FLOAT;
-- Хорошо
price NUMERIC(10,2);
⚡️ Итог: грамотный выбор типов = меньше места, быстрее запросы, меньше багов.
#БД #SQL #PostgreSQL #Оптимизация #Backend #DataEngineering
🔥12👍3⚡1
В продолжении поста про PostgreSQL, поделюсь про Redis. Чаще всего используют только строку, но он гораздо многообразнее.
🧱 String
— Ключ-значение, базовый кирпич. Кэш, флаги, счётчики, токены.
— Пример:
— Паттерны: rate-limit (`INCR + EXPIRE`), простые распределённые блокировки (`SET lock val NX PX 10000`)
🧩 Hash
— «Объект» с полями: компактно хранит мелкие атрибуты.
— Пример:
— Когда: профили пользователей, настройки. Плюс — частичные обновления полей.
— Нюанс: нет TTL на отдельные поля, ставится на весь ключ.
📚 List
— Упорядоченная коллекция. Очереди (FIFO/LIFO), буферы, журналы.
— Пример:
— Когда: простые очереди, ретраи. Не забывайте
🏷 Set
— Множества без дубликатов. Теги, интересы, подписки.
— Пример:
— Когда: рекомендации по пересечению множеств, дедупликация.
🏆 Sorted Set (ZSet)
— Множество с весом (score). Рейтинги, приоритизация, «календарь по времени».
— Пример:
— Когда: топ-N, очереди с приоритетом, time-index (`score = timestamp`).
— Хитрость: чистка старых данных —
🧮 Bitmap
— Битовые флаги по смещению. Ультра-дешёвая памятью аналитика по дням.
— Примеры
— Когда: «приходил ли пользователь в день D», воронки по дням, календари активности.
📏 Bitfield
— Упакованные счётчики/флаги в одном ключе.
— Пример:
— Когда: компактные счётчики для ограниченного диапазона (экономия памяти).
🔢 HyperLogLog
— Приблизительное количество уникальных (distinct).
— Пример:
— Когда: уникальные посетители/поисковые запросы, где допустима погрешность.
📍 GEO (геоиндексы)
— Геопоиск по радиусу/полигону.
— Пример:
— Когда: «что рядом», ближайшие точки интереса.
📨 Streams
— Лог событий с потребительскими группами (Kafka-лайт).
— Пример:
— Когда: event sourcing, обработка событий с подтверждениями.
📣 Pub/Sub
— Эфемерные сообщения «здесь и сейчас».
— Пример:
— Когда: оповещения в реальном времени, без хранения истории (не путать со Streams).
🧾 RedisJSON (Redis 8+)
— Хранение JSON как дерево, выборка/патчи по путям.
— Пример:
— Когда: нужны частичные обновления и индексирование полей (с RediSearch).
— Альтернатива: String с сериализацией — просто, но без частичных апдейтов.
🧠 Итог
— В Redis выбор структуры = половина решения. Строка с JSON — ок для простого кэша, но для очередей, рейтингов, счётчиков и аналитики есть куда более точные инструменты.
#Redis #БД #Кэширование #Backend #Шпаргалка #DataEngineering
🧱 String
— Ключ-значение, базовый кирпич. Кэш, флаги, счётчики, токены.
— Пример:
SET key val, GET key, INCR views, SETNX, EXPIRE key 60— Паттерны: rate-limit (`INCR + EXPIRE`), простые распределённые блокировки (`SET lock val NX PX 10000`)
🧩 Hash
— «Объект» с полями: компактно хранит мелкие атрибуты.
— Пример:
HSET user:42 name Lev email lev@..., HGETALL user:42— Когда: профили пользователей, настройки. Плюс — частичные обновления полей.
— Нюанс: нет TTL на отдельные поля, ставится на весь ключ.
📚 List
— Упорядоченная коллекция. Очереди (FIFO/LIFO), буферы, журналы.
— Пример:
LPUSH queue job1, BRPOP queue 0— Когда: простые очереди, ретраи. Не забывайте
LTRIM для ограничения длины.🏷 Set
— Множества без дубликатов. Теги, интересы, подписки.
— Пример:
SADD tags:post:1 go devops, SINTER user:42:tags post:1:tags— Когда: рекомендации по пересечению множеств, дедупликация.
🏆 Sorted Set (ZSet)
— Множество с весом (score). Рейтинги, приоритизация, «календарь по времени».
— Пример:
ZADD leaderboard 1500 user42, ZRANGE leaderboard 0 9 WITHSCORES— Когда: топ-N, очереди с приоритетом, time-index (`score = timestamp`).
— Хитрость: чистка старых данных —
ZREMRANGEBYSCORE.🧮 Bitmap
— Битовые флаги по смещению. Ультра-дешёвая памятью аналитика по дням.
— Примеры
SETBIT active:2025-09-10 42 1, BITCOUNT active:*— Когда: «приходил ли пользователь в день D», воронки по дням, календари активности.
📏 Bitfield
— Упакованные счётчики/флаги в одном ключе.
— Пример:
BITFIELD key INCRBY u8 10 1— Когда: компактные счётчики для ограниченного диапазона (экономия памяти).
🔢 HyperLogLog
— Приблизительное количество уникальных (distinct).
— Пример:
PFADD u:visits user42, PFCOUNT u:visits— Когда: уникальные посетители/поисковые запросы, где допустима погрешность.
📍 GEO (геоиндексы)
— Геопоиск по радиусу/полигону.
— Пример:
GEOADD places 13.405 52.52 berlin, GEOSEARCH places FROMLONLAT 13.4 52.5 BYRADIUS 5 km— Когда: «что рядом», ближайшие точки интереса.
📨 Streams
— Лог событий с потребительскими группами (Kafka-лайт).
— Пример:
XADD events * type=signup user=42, XREADGROUP GROUP g c COUNT 10 STREAMS events >— Когда: event sourcing, обработка событий с подтверждениями.
📣 Pub/Sub
— Эфемерные сообщения «здесь и сейчас».
— Пример:
PUBLISH chan msg, SUBSCRIBE chan— Когда: оповещения в реальном времени, без хранения истории (не путать со Streams).
🧾 RedisJSON (Redis 8+)
— Хранение JSON как дерево, выборка/патчи по путям.
— Пример:
JSON.SET user:42 $ '{"name":"Lev","age":33}', JSON.NUMINCRBY user:42 $.age 1— Когда: нужны частичные обновления и индексирование полей (с RediSearch).
— Альтернатива: String с сериализацией — просто, но без частичных апдейтов.
🧠 Итог
— В Redis выбор структуры = половина решения. Строка с JSON — ок для простого кэша, но для очередей, рейтингов, счётчиков и аналитики есть куда более точные инструменты.
#Redis #БД #Кэширование #Backend #Шпаргалка #DataEngineering
❤6👍5🔥2❤🔥1
Нашел прям лучший подход по видению ToDo.
То есть не просто пишешь, а потом в IDE контролируешь, а сразу завешиваешь задачу. Прям гениально и просто.
P. S. Понятно что все равно не гарантия исправления.
# TODO(DEV-12346): Надо поправить конфиг
То есть не просто пишешь, а потом в IDE контролируешь, а сразу завешиваешь задачу. Прям гениально и просто.
P. S. Понятно что все равно не гарантия исправления.
👍3🔥1
Бодрый кодер
Который раз убеждаюсь — профессия разработчика не даёт заскучать. Каждый день узнаёшь что-то новое. Недавно со мной поделились интересной находкой: оказывается, в Nginx Ingress есть встроенная поддержка телеметрии. Можно буквально «из коробки» настроить отправку…
Всех причастных с профессиональным праздником, днём программиста!
Спустя неделю, пишу другу, говорю «Зацени какая фича есть», это я так с оф.доки Nginx ingress вылез, изучая что еще упустил. А он мне скидывает наш диалог, где как раз об этом рассказал, после чего я сделал пост.
И тут я понял, что рабочая неделя была напряжённой.
Спустя неделю, пишу другу, говорю «Зацени какая фича есть», это я так с оф.доки Nginx ingress вылез, изучая что еще упустил. А он мне скидывает наш диалог, где как раз об этом рассказал, после чего я сделал пост.
И тут я понял, что рабочая неделя была напряжённой.
😁7❤5
PostgreSQL 18 уже почти на подходе, и одна из самых приятных новинок для разработчиков — нативная поддержка UUIDv7.
Если раньше gen_random_uuid() выдавал только UUIDv4 (UUIDv4 генерируются случайно, поэтому новые записи вставляются в разные места B-tree индекса. Это вызывает фрагментацию, рост размера индекса и замедление операций), то теперь у нас появляется функция uuidv7(). Она генерирует идентификаторы, упорядоченные по времени, что решает старую боль с раздутием B-tree индексов (новые ключи ложатся в «хвост» индекса, как автоинкремент, и поэтому работают быстрее).
Теперь IDшники не только уникальны, но и красиво сортируются по времени создания 👌
Для распределённых систем и масштабных БД — прямо must-have.
#postgresql #uuid #uuidv7 #базыданных
Если раньше gen_random_uuid() выдавал только UUIDv4 (UUIDv4 генерируются случайно, поэтому новые записи вставляются в разные места B-tree индекса. Это вызывает фрагментацию, рост размера индекса и замедление операций), то теперь у нас появляется функция uuidv7(). Она генерирует идентификаторы, упорядоченные по времени, что решает старую боль с раздутием B-tree индексов (новые ключи ложатся в «хвост» индекса, как автоинкремент, и поэтому работают быстрее).
CREATE TABLE test (
id uuid DEFAULT uuidv7() PRIMARY KEY,
name text
);
INSERT INTO test (name) VALUES ('foo'), ('bar');
SELECT uuid_extract_timestamp(id), name FROM test ORDER BY id;
Теперь IDшники не только уникальны, но и красиво сортируются по времени создания 👌
Для распределённых систем и масштабных БД — прямо must-have.
#postgresql #uuid #uuidv7 #базыданных
🔥6👍2
Вчера ездил на экскурсию в ЦОД Яндекс, во Владимир. Получилось классно.
Инженерные решения конечно потрясающее. Особенно собственные стойки и решения по юнитам.
Ну и конечно посмотрели сердце одного из суперкомпьютеров, на котором в том числе обучают Алису.
Инженерные решения конечно потрясающее. Особенно собственные стойки и решения по юнитам.
Ну и конечно посмотрели сердце одного из суперкомпьютеров, на котором в том числе обучают Алису.
👍11🔥5❤3😍1
Бодрый кодер
PostgreSQL 18 уже почти на подходе, и одна из самых приятных новинок для разработчиков — нативная поддержка UUIDv7. Если раньше gen_random_uuid() выдавал только UUIDv4 (UUIDv4 генерируются случайно, поэтому новые записи вставляются в разные места B-tree индекса.…
Мой подписчик написал комментарий, который тянет на пост:
если бизнес логика у тебя полагается на монотонное возрастание uuidv7 (например дедубликация), а у тебя отсортировано не в том порядке — не самое приятное событие...
uuidv7 "ориентированный по времени" а не "транзакционно ориентированный"
тоесть у тебя может быть кейс когда транзакция с более поздним uuid закомитится раньше чем транзакция с более ранним uuid.
а раз раньше закомитилась — раньше вернула поток управления коду. и связанные записи (например релейшены) получают другой ордер (если это важно).
+ точность ордера ограничена 1 миллисекундой. если прилетело 5 запросов в одну миллисекунду — нет способа зарезолвить порядок. это кстати касается и бэкенда если что... но (!) при смене мастера — если часы рассинхронизированы больше чем на 1 миллисекунду возможны уже скачки во времени.
если у тебя реплики в разных датацентрах - скорее всего рассинхрон порядка 10-100мс, и значит точно будет прыгать.
что собственно не защищает и бэк, находящийся на разных инстансах за балансиром...
это не то что бы минусы uuid7, просто ограничение модели, но о них важно помнить, если не хочется гулять по граблям)
🔥2👏1
Вместо #пятничныйюмор . Так выглядит 42 года прогресса.
Мне правда еще не разу не удавалось держать стол таким девственно чистым.
Мне правда еще не разу не удавалось держать стол таким девственно чистым.
👍4💯2❤1
Понедельник начинается с хороших новостей - мой доклад про GitOps для аналитиков взяли на Analyst Days.
В этом осенне-зимнем сезоне будет всего одно выступление, ну может два.
#anystdays #доклады #выступление
В этом осенне-зимнем сезоне будет всего одно выступление, ну может два.
#anystdays #доклады #выступление
🔥15❤3
Всех с предстоящими выходными, а меня с предстоящими рабочими. Еду в Красноярск на неделю, в командировку.
#пятничныйюмор
#пятничныйюмор
🔥13😁4
Лекс Фридман записал большой подкаст с Павлом Дуровым. За четыре часа беседы основатель Telegram поделился подробностями о работе компании и собственными взглядами на разработку.
Очень много про процессы разработки, но теперь надо как-то найти время послушать - даже на x2 это 2часа :(
https://youtu.be/qjPH9njnaVU?si=vOBG2tXbIbBKF6f8
Очень много про процессы разработки, но теперь надо как-то найти время послушать - даже на x2 это 2часа :(
https://youtu.be/qjPH9njnaVU?si=vOBG2tXbIbBKF6f8
YouTube
Pavel Durov: Telegram, Freedom, Censorship, Money, Power & Human Nature | Lex Fridman Podcast #482
Pavel Durov is the founder and CEO of Telegram.
Thank you for listening ❤ Check out our sponsors: https://lexfridman.com/sponsors/ep482-sb
See below for timestamps, trannoscript, and to give feedback, submit questions, contact Lex, etc.
*Trannoscript:*
http…
Thank you for listening ❤ Check out our sponsors: https://lexfridman.com/sponsors/ep482-sb
See below for timestamps, trannoscript, and to give feedback, submit questions, contact Lex, etc.
*Trannoscript:*
http…
Forwarded from Илья ILIYM
В Южной Корее НАМЕРТВО остановилась работа всего государства — из-за одного пожара в датацентре уже неделю не работает практически ничего.
Огонь накрыл сервера Национальной службы Информационных Ресурсов (NIRS): там хостились все государственные сервисы, базы данных и облачные системы.
Всего в очищающем пламени пали 647 государственных сервисов, из них 96 уничтожены полностью. Сгорели:
— Местные госуслуги;
— Система удостоверения личности;
— Государственное облако хранения документов — миллионы записей утеряны безвозвратно;
— Государственная почта;
— Образовательные базы университетов;
— Финансовые и административные сервисы.
858 терабайт данных сгорели вместе с бэкапами — они хранились на сервере в соседней комнате.
Предварительно: причина пожара — возгорание литий-ионной батареи во время её замены.
Чиновник, которого заставили всё чинить, оценил масштаб работ и... покончил жизнь самоубийством.
Огонь накрыл сервера Национальной службы Информационных Ресурсов (NIRS): там хостились все государственные сервисы, базы данных и облачные системы.
Всего в очищающем пламени пали 647 государственных сервисов, из них 96 уничтожены полностью. Сгорели:
— Местные госуслуги;
— Система удостоверения личности;
— Государственное облако хранения документов — миллионы записей утеряны безвозвратно;
— Государственная почта;
— Образовательные базы университетов;
— Финансовые и административные сервисы.
858 терабайт данных сгорели вместе с бэкапами — они хранились на сервере в соседней комнате.
Предварительно: причина пожара — возгорание литий-ионной батареи во время её замены.
Чиновник, которого заставили всё чинить, оценил масштаб работ и... покончил жизнь самоубийством.
😨3❤1🔥1