DevNotes Live
6 subscribers
84.2K photos
12K videos
195 files
35.4K links
Автоматический агрегатор IT ресурсов в Telegram (@devnotes_robot)
Информация: https://t.me/devnotes_live/121
Download Telegram
Постеры Максима Доски, графического дизайнера из Венеции
Design Language System: новая парадигма дизайна с ИИ-агентами

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

Читать на дизайнерс | #статья
Forwarded from Daily Coding 🔥
🛠 pgsh - Инструменты PostgreSQL для локальной разработки

🌍 Сайт

Daily Coding #инструменты #SQL & Max
Forwarded from Dezzigners
🧰 Monochrome Square Halftone — набор монохромным текстур

Cкачать

Dezzigners
Forwarded from Dezzigners
Forwarded from Dezzigners
Forwarded from Dezzigners
Implicit ABA в async-генераторах: тихая гонка в очередях сообщений

Работа с очередями в Node.js — дело привычное. Kafka, RabbitMQ, Redis Streams. Берёшь async-генератор, читаешь сообщения, обрабатываешь. Но implicit ABA problem в async-генераторах выстреливает в production неожиданно: yield — точка прерывания, и пока генератор приостановлен, другой воркер может изменить состояние очереди.

Где прячется проблема

Вот production-ориентированный пример:

async function* readMessages(queue) {
let lastOffset = await queue.getLatestOffset();
while (true) {
const messages = await queue.poll(lastOffset);
if (messages.length === 0) continue;
yield messages;
for (const msg of messages) {
if (msg.offset >= lastOffset) {
lastOffset = msg.offset + 1;
}
}
}
}


Проблема: пока ты висел на yield, другой процесс мог удалить сообщение, сместить offset. Ты возвращаешься — работаешь с устаревшим состоянием. Это классическая implicit ABA, где "последний offset" меняется под капотом.

Как диагностировать

Логируй время до и после yield. Если пауза больше пары секунд при высокой конкурентности — это красный флаг. Используй детерминированные идентификаторы сообщений, не полагайся на offset как на истину. Смотри на время обработки: между итерациями риск ABA растёт.

Что делать

Самый прямой путь — транзакционная обработка с блокировкой:

async function* safeReader(queue) {
while (true) {
const result = await queue.pollWithLock();
yield result;
await queue.commit();
}
}


Совет: используй снэпшоты и проверяй их свежесть на каждой итерации. Или явно проверяй поколение очереди — если оно изменилось, рвать цикл.

Ошибка

Не пытайся кэшировать offset между yield в глобальных переменных. Это усугубляет ABA, особенно в системах с несколькими воркерами и долгими HTTP-запросами. Если есть такой код в проде — скорее всего, ты уже видел странные баги, которые не воспроизводятся локально.

Вывод: Async-генераторы элегантны, но их "заморозка" между yield требует явного управления состоянием очереди, иначе гонка становится неявной и трудноуловимой.
Не могу разобраться с собой и карьерой в 2026 году. Что делать?

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

Читать на дизайнерс | #Карьера
Деконструкция красоты: почему "неправильно” новое "круто"?

Узнайте у дизайнеров, почему концепция "идеального дизайна" мертва в 2026 году. Второй выпуск Rebuilding Creativity ждет вас

Читать на дизайнерс | #статья