uz
Feedback
QA-Логия

QA-Логия

Kanalga Telegram’da o‘tish

Все о QA. Канал для тестировщиков Личный блог автора - @just_genych По вопросам рекламы или разработки: @g_abashkin

Ko'proq ko'rsatish
8 087
Obunachilar
-624 soatlar
-367 kunlar
+5030 kunlar
Obunachilarni jalb qilish
Iyun '26
Iyun '26
+110
0 kanalda
May '26
+349
0 kanalda
Get PRO
Aprel '26
+130
0 kanalda
Get PRO
Mart '26
+61
0 kanalda
Get PRO
Fevral '26
+6
0 kanalda
Get PRO
Yanvar '26
+3
0 kanalda
Get PRO
Dekabr '25
+47
7 kanalda
Get PRO
Noyabr '25
+93
52 kanalda
Get PRO
Oktabr '25
+40
28 kanalda
Get PRO
Sentabr '25
+142
85 kanalda
Get PRO
Avgust '250
0 kanalda
Get PRO
Iyul '25
+16
0 kanalda
Get PRO
Iyun '25
+24
0 kanalda
Get PRO
May '25
+112
0 kanalda
Get PRO
Aprel '25
+69
0 kanalda
Get PRO
Mart '25
+289
20 kanalda
Get PRO
Fevral '25
+14
0 kanalda
Get PRO
Yanvar '25
+4
0 kanalda
Get PRO
Dekabr '24
+16
0 kanalda
Get PRO
Noyabr '24
+18
2 kanalda
Get PRO
Oktabr '24
+18
1 kanalda
Get PRO
Sentabr '24
+23
2 kanalda
Get PRO
Avgust '24
+33
1 kanalda
Get PRO
Iyul '24
+36
0 kanalda
Get PRO
Iyun '24
+26
0 kanalda
Get PRO
May '24
+37
5 kanalda
Get PRO
Aprel '24
+31
0 kanalda
Get PRO
Mart '24
+17
0 kanalda
Get PRO
Fevral '24
+24
0 kanalda
Get PRO
Yanvar '24
+24
0 kanalda
Get PRO
Dekabr '23
+38
0 kanalda
Get PRO
Noyabr '23
+19
0 kanalda
Get PRO
Oktabr '23
+30
0 kanalda
Get PRO
Sentabr '23
+36
0 kanalda
Get PRO
Avgust '23
+151
0 kanalda
Get PRO
Iyul '23
+99
0 kanalda
Get PRO
Iyun '23
+108
0 kanalda
Get PRO
May '23
+98
0 kanalda
Get PRO
Aprel '23
+231
0 kanalda
Get PRO
Mart '23
+118
0 kanalda
Get PRO
Fevral '23
+880
0 kanalda
Get PRO
Yanvar '23
+704
0 kanalda
Get PRO
Dekabr '22
+667
0 kanalda
Get PRO
Noyabr '22
+233
0 kanalda
Get PRO
Oktabr '22
+603
0 kanalda
Get PRO
Sentabr '22
+388
0 kanalda
Get PRO
Avgust '22
+221
0 kanalda
Get PRO
Iyul '22
+476
0 kanalda
Get PRO
Iyun '22
+1 115
0 kanalda
Get PRO
May '22
+815
0 kanalda
Get PRO
Aprel '22
+6 148
0 kanalda
Get PRO
Mart '22
+7 668
0 kanalda
Get PRO
Fevral '22
+2 138
0 kanalda
Get PRO
Yanvar '22
+1 110
0 kanalda
Get PRO
Dekabr '21
+1 509
0 kanalda
Sana
Obunachilarni jalb qilish
Esdaliklar
Kanallar
21 Iyun+1
20 Iyun0
19 Iyun0
18 Iyun0
17 Iyun0
16 Iyun0
15 Iyun+2
14 Iyun+2
13 Iyun+2
12 Iyun+12
11 Iyun+39
10 Iyun+31
09 Iyun+16
08 Iyun0
07 Iyun0
06 Iyun0
05 Iyun0
04 Iyun+1
03 Iyun0
02 Iyun+3
01 Iyun+1
Kanal postlari
Context-aware consistency probes для multi-region write conflicts: как не потерять данные при real-time sync Multi-region синхронизация — одна из самых частых точек отказа в production, где классические решения вроде last-writer-wins или простых CRDT могут привести к потере данных. Типичная ошибка — считать, что единый алгоритм разрешения конфликтов подходит для всех сценариев, но в реальной системе бизнес-правила требуют учета контекста операции. Почему простые probes не работают Обычный probe проверяет только версию объекта. Если EU меняет quantity, а US — price, last-writer-wins просто затрет одно из значений, а CRDT скажет «конфликт» без учета семантики. В production это приводит к неконсистентным заказам, списанию средств или потере инвентаря. Что меняет context-aware probe Идея: перед записью зондируется не версия, а контекст — какие поля меняются, их бизнес-логика и приоритеты. Псевдо-код демонстрирует:
def resolve_conflict(local_changes, remote_version):
    conflicting_fields = set(local_changes.keys()) & set(remote_version.changed_fields)
    if not conflicting_fields:
        return merge()  # безопасно, поля разные
    critical = check_criticality(conflicting_fields)
    if critical_count > 1:
        rollback()  # оба критичны
    else:
        apply_business_rules()  # автоконфликт по приоритетам
В тестах это снижает false-positive конфликты на 70% при времени probe до 5ms. Практический совет: начинай с критических полей (баланс счета, статус заказа) — иначе probe логика раздувается быстрее бизнес-правил. Где это критично в production - коллаборативные редакторы в реальном времени (Google Docs, Notion) — мерж разных полей без потери данных; - мультирегионные БД (Cassandra, CockroachDB) — для consistency при записи в разные регионы; - платежные системы — где потеря согласованности ведет к финансовым ошибкам. Предупреждение: не натягивай context-aware на все поля сразу. Это trade-off: точность растет, но сложность кода и стоимость поддержки увеличиваются с каждым новым правилом. Focus на risk-based подход. Вывод: Context-aware probes — не панацея, но инструмент для баланса между consistency и availability, который сокращает false-positive конфликты и сохраняет бизнес-логику в multi-region синхронизации.

2
⁣Логирование промежуточных состояний долгих транзакций: partial-commit и zombie-записи Многие QA инженеры и разработчики фокусируются только на финальном статусе транзакции, игнорируя её промежуточные состояния. В production, особенно при распределённых saga-транзакциях, это приводит к тому, что partial-commit (запись части данных после сбоя) и zombie-записи (зависшие строки без финала) остаются незамеченными до момента, пока поддержка не найдёт дубль платежа или потерянный заказ. Почему это критично для QA В CI/CD и регрессионном тестировании, где выполняются долгие end-to-end сценарии, логи промежуточных состояний — единственный способ отличить нормальное выполнение от скрытого сбоя. Типичная ошибка: проверять только код ответа и финальную запись в БД, не заглядывая в мидлвар. Так тест проходит, а partial-commit уже произошёл. Как настроить логирование промежуточных шагов Каждая транзакция должна иметь сквозной correlation_id, который передаётся через все сервисы. Логируйте не только «success» или «error», но и конкретное состояние на каждом шаге: получение, обработка, завершение. Пример для оркестрации через Kafka: { "correlation_id": "txn_12345", "step": "inventory_reservation", "status": "partial_commit", "timestamp": "2025-03-27T10:00:00.000Z", "details": "Payment approved, inventory not called due to timeout" } Этот лог сразу даёт понять, где именно оборвалась цепочка. Обнаружение zombie-записей через шедулер Не ждите, пока пользователь создаст тикет. Запускайте фоновый job, который ищет строки с промежуточным статусом (например, PROCESSING), которые висят дольше порога. Пример запроса: SELECT * FROM orders WHERE status = 'PROCESSING' AND updated_at < NOW() - INTERVAL '10 minutes'; Найдя такие записи, логируйте факт, статус и действие (отмена, повтор, алерт). Это превращает скрытую проблему в измеряемую метрику. Инженерные trade-offs Чем подробнее логи — тем выше стоимость хранения и нагрузка на I/O. Компромисс: для критических транзакций (платежи, заказы) пишите детально, для менее важных — только финал. Но не экономьте на correlation_id и временных метках. Если partial-commit встречается чаще, чем 1 на 1000 операций, нормализуйте алерт — это признак проблем с тайм-аутами или согласованием сервисов. Вывод: Логирование промежуточных состояний долгих транзакций — единственный способ гарантировать, что вы узнаете о partial-commit до того, как о нём сообщит поддержка, а не после падения в production.
93
3
⁣Synthetic data validation в продакшене: как детектить Data Leakage и contamination ML-пайплайнов на реальных запросах В продакшене синтетические данные — вещь удобная, пока они не начинают подмешиваться в реальные запросы. Две классических проблемы: data leakage (реальные пользовательские данные утекли в синтетику) и contamination (синтетика маскируется под живые запросы и ломает метрики). Ловить это на реальном трафике можно тремя способами, которые я проверял в бою. Distributional Similarity Check Берем эмбеддинги входящего запроса, считаем косинусную близость к распределению синтетических данных. Если совпадает подозрительно часто — скорее всего, синтетика просочилась. Ключевой trade-off: порог близости влияет на false positive rate. Слишком низкий — пропускаете leakage, слишком высокий — блокируете нормальные запросы. ML-детектор на инференсе LightGBM на фичах вроде длины запроса, perplexity, entropy, доли редких токенов. Обучается на размеченных данных: синтетика против реальных запросов. Тут важный нюанс — детектор должен держать adversarial-атаки. Иначе разработчики синтетики быстро научатся его обходить, добавив шум в токены. Типичная ошибка: не включать adversarial examples в train set. Периодический backtesting Раз в N дней считаем KS-тест или Wasserstein distance между распределением синтетики и реальных запросов. Если метрика резко дернулась — либо contamination, либо drift в данных. Практический совет: не реагируйте на единичный выброс — contamination проявляется как тренд, а не как всплеск. Лучше сделайте rolling window с медианной фильтрацией. Пару чеков в пайплайн добавить не помешает: * проверка на exact match: нет ли в синтетике точных копий реальных запросов * мониторинг entropy: аномально низкое значение — частый признак копии из train set * можно вшить watermarking в синтетику, вроде токена <SYNTH>, но это снижает её естественность и увеличивает latency инференса По опыту, первый симптом data leakage не в тестовых метриках, а в продакшене: accuracy на новых запросах падает, хотя на тестовом сете всё блестит. Потому что модель переобучается на синтетику, а живые данные выглядят для нее как шум. Не ждите падения метрик — внедрите хотя бы Distributional Similarity Check в CI/CD quality gates до деплоя. Вывод: Data leakage в ML-пайплайнах детектируется не по тестовой точности, а по дрейфу распределения на реальных запросах — и это должно быть частью production-мониторинга, а не разовой проверкой перед релизом.
121
4
⁣Деплой зеленый, тесты пройдены, мониторинг молчит — а данные уже сломаны Silent data corruption — баг, который не вызывает exception, не красит дашборды в красный, но тихо искажает числа, статусы или связи между объектами. В production после деплоя это выглядит как 200 OK в логах и жалобы пользователей через пару часов. Стандартные тесты API или UI такую порчу не ловят — нужны observability-метрики, вшитые в pipeline деплоя. Я называю их пробами на порчу. Мини-тесты на консистентность данных Идея простая — проверять не статус-код ответа, а то, что лежит внутри приложения и БД. Например, контрольная сумма для бизнес-объектов. Перед деплоем снимается snapshot — хеш агрегированных данных по ключевым таблицам. После деплоя код пересчитывает тот же хеш и сравнивает. Если не совпало — бросается метрика с тегом таблицы и ID деплоя, а не просто error в лог. Дальше алерт, остановка раскатки или автоматический откат. Какие метрики собирать - Delta-corruption rate. Процент несовпадений с эталоном по всем пробам. Если >0 — порча есть. - Integrity latency. Время от момента деплоя до обнаружения расхождения. Если растет — пробы срабатывают поздно. - False positive ratio. Лучше 5% ложных срабатываний, чем пропущенная порча. Важно честно решать, какие пробы оставить, а не отключать все. - Coverage by data paths. Сколько критических потоков данных покрыто пробой. Меньше 80% — зона риска. Куда втыкать в pipeline - Pre-deploy. Снимок эталонов. Файл с хешами пишется в read-only хранилище. - Во время canary. Пробы на малом проценте трафика. Если на 5% канареечного трафика уже ловится расхождение — стоп. - Post-deploy. Полная проверка после полного разворота. Без чего все развалится - Immutable snapshots. Эталон нельзя перезаписать — ни случайно, ни по сценарию «ой, я пересобрал». - Correlation ID у каждой пробы. Должен быть привязан к деплою #432, а не просто «проверка в 15:00». - Alerting на 99-й перцентиль. Если на 50-м все ок, а на 99-м расхождения — это race condition. Игнорировать такое — прятать голову в песок. Вывод: Silent corruption делает риск невидимым, но observability-метрики делают его измеряемым — а измеряемый риск можно контролировать в pipeline.
133
5
⁣Performance regression detection via real-user latency percentile drift during phased rollouts Performance regressions часто пролетают мимо радаров, когда смотрят только на среднюю задержку. Mean latency может оставаться зеленым, а p99 улететь на 30% вверх из-за race condition. При phased rollout (canary -> 10% -> 50% -> 100%) сравнение перцентилей latency у пользователей новой версии с baseline ловит хвостовые задержки, которые mean сглаживает. Почему percentile drift лучше mean Mean сглаживает outliers. Если у 99% пользователей latency 100 ms, у 1% - 5000 ms, среднее покажет ~150 ms, и продуктмен скажет "ок", хотя пользователи уходят. Percentile drift ловит именно хвосты. Практический совет: сравнивай p95 или p99 новой версии с baseline, а не абсолютные значения - это отсекает шумы дневных пиков нагрузки. Типовая реализация на Python Пример функции для обнаружения дрифта p95 относительно baseline с порогом 10%: import numpy as np def detect_drift(canary_latencies, baseline_latencies, threshold=0.1): p95_canary = np.percentile(canary_latencies, 95) p95_baseline = np.percentile(baseline_latencies, 95) drift = (p95_canary - p95_baseline) / p95_baseline if drift > threshold: return f"Regression detected! p95 drift: {drift:.2%}" return f"OK (drift: {drift:.2%})" Ключевые моменты при rollout По опыту, важные настройки: - Собирай RUM (Real User Monitoring) для обеих когорт - Используй скользящее окно 5 минут для перцентилей - Пороги: p50 > 5% - alert, p99 > 10% - auto-rollback Типичная ошибка Нюанс, который я часто вижу: при rollout 1-5% выборка для p99 слишком мала, он начинает скакать из-за шума. Практическое решение - мониторить p95 или p90 на ранних этапах, а p99 подключать, когда накатили более 10% пользователей. Когда метод ломается и trade-offs Два сценария, где подход не срабатывает: - Если latency растет равномерно у всех (например, база данных легла целиком) - тут нужен контрольный тест с пользователями той же версии - При редких выбросах, когда один пользователь выстреливает 10 секундами - percentile начинает дергаться от артефактов Метод не требует сложной инфраструктуры: RUM + пара метрик + порог на автооткат. Для early detection нормально, но учитывай стоимость ложных срабатываний - слишком низкий порог приведет к избыточным откатам. Вывод: Percentile drift при phased rollout - практичный инструмент early detection, но критически важен правильный выбор порогов и перцентилей под масштаб rollout и характер latency distribution.
132
6
⁣Rate limiting в продакшене: как пробами найти обход квот и ложные 429 на реальном трафике Rate limiting редко ломается в happy path: автотесты проверяют 429, а инциденты приходят из CI/CD, gateway, CDN и реального распределения клиентов. Типичная ошибка QA и dev - тестировать лимит «в лоб», не проверяя, кто именно считается субъектом квоты. Shadow limiter вместо атаки на прод Практичный паттерн - dry-run лимитер рядом с боевым. Prod принимает решение, shadow только считает и пишет в лог: request_id, route, user_id/api_key/ip/tenant_id, normalized_client_id, limit_name, prod_decision, shadow_decision, remaining, reset_at, reason. Ищем расхождения: * prod allow, shadow block - возможный обход квоты * prod block, shadow allow - ложная блокировка * нет limit_name на защищенном route - endpoint выпал из политики Пробы на обход квот Риск не в «сломался лимитер», а в неверной идентичности: IP за прокси, разные X-Forwarded-For, API key против bearer-токена, /v1/search и /v1/search/, прямой трафик в сервис мимо gateway. Проба: агрегировать фактическое потребление по нескольким идентичностям. SELECT tenant_id, route, COUNT(*) AS allowed_requests FROM rate_limit_decisions WHERE ts > now() - interval '1 minute' AND prod_decision = 'allow' GROUP BY tenant_id, route HAVING COUNT(*) > 1000; Если tenant получил больше разрешенных запросов, чем политика допускает, ищите неверный ключ, route, лимитер или рассинхрон счетчиков. Пробы на ложные блокировки 429 сам по себе не дефект. Дефект - когда он не соответствует политике: запросов меньше quota, remaining сильно в минусе, reset_at в прошлом, блокирует только одна нода, всплеск появился после деплоя CDN/gateway/auth. Совет: логируйте reason уровня limit=user.search.minute key=tenant:123 quota=300 current=301 source=gateway. Без этого QA и SRE спорят с графиками, а не с причиной. Инварианты для мониторинга * protected route не проходит без limit_name * доля 429 по premium-клиентам не выше baseline * shadow/prod mismatch ниже порога * один client_id не получает разные решения на разных нодах * Retry-After положительный Вывод: Надежный rate limiting тестируется не только нагрузкой, а наблюдаемыми продовыми пробами, которые балансируют риск, стоимость поддержки и скорость feedback loop.
127
7
Feature flags в продакшене: пробы консистентности, которые ловят stale cache и split-brain до раската Feature flags в release
Feature flags в продакшене: пробы консистентности, которые ловят stale cache и split-brain до раската Feature flags в release validation часто ломаются не логикой фичи, а тем, что разные runtime-точки видят разные версии правил. Типичная ошибка QA и dev - проверить только true/false на одном инстансе и считать rollout безопасным. Что реально ломается * Stale cache: SDK или сервис живет со старым флагом из-за polling/streaming сбоя, TTL или network glitch. * Split-brain: pod’ы, зоны, регионы, BFF, worker или mobile config service одновременно считают актуальными разные версии конфига. Production-пример: checkout-pod-a уже читает config_version=42, checkout-pod-c остался на 41. Регрессия зеленая, а часть пользователей идет по старой payment-ветке. Что должна проверять проба Не “флаг включается”, а “вся прод-система одинаково вычисляет флаг для заданного контекста”. Минимум собирайте: * flag_key, value, variant/treatment; * config version или etag; * cache age и время обновления; * pod, zone, region, service; * reason: default, targeting, rule match, fallback. sigs, ages = set(), [] for target in targets: r = eval_flag(target, FLAG, USER) sigs.add((r["value"], r["variant"], r["version"], r["reason"])) ages.append(r["cache_age_sec"]) if len(sigs) != 1: fail("split-brain") if max(ages) > 30: fail("stale cache") Как встроить в rollout * заведите stable synthetic users: enabled, disabled, country-de, premium; * сравнивайте не только boolean, но и version, variant, reason; * запускайте пробу перед 1%, 5%, 25%, 50%, 100% и rollback; * покрывайте все места чтения флага, а не только один backend pod. Предупреждение Не делайте quality gate из одного /debug HTTP 200. Нужен безопасный read-only fan-out по инстансам с auth, таймаутами и без PII. Trade-off простой: несколько секунд feedback loop против инцидента, где rollback сработал не везде. Вывод: Feature flag безопасен только тогда, когда вы валидируете не значение флага, а консистентность его вычисления во всех production-потребителях.
150
8
Read-after-write consistency в продакшене: пробы для обнаружения stale reads после релиза После релиза пользователь может усп
Read-after-write consistency в продакшене: пробы для обнаружения stale reads после релиза После релиза пользователь может успешно изменить данные, сразу перечитать их и увидеть старое значение. Частая ошибка QA и разработчиков - проверять только 200 OK на запись, не валидируя реальный read path в production. Где ломается контракт Типичный сценарий: * PATCH /profile - имя изменено на Alice-123 * GET /profile - вернулось старое имя * через 1-5 секунд данные стали актуальными Причины не всегда в БД: * чтение из реплики с лагом * stale cache * read/write split в ORM или gateway * async-проекция в read model * CDN/API cache * неверная инвалидация * eventual consistency без явного UX/SLA Production probe Синтетический клиент в проде меняет безопасную тестовую сущность, затем читает ее через тот же публичный путь, что и пользователь. value = "probe-" + uuid() PATCH /profile/probe-1 {displayName: value} deadline = now() + 3s while now() < deadline: data = GET /profile/probe-1 if data.displayName == value: emit("raw_latency_ms") break else: alert("stale_read_detected") Важно проверять не только “когда-нибудь стало видно”, а контракт: * видно сразу или в течение N мс * видно из нужного региона * видно через public/mobile/BFF/API path * видно после обновления read model * значение не прыгает new -> old -> new Последнее - признак немонотонного чтения, которое для пользователя выглядит как потеря изменений. Как проектировать пробы Практические правила: * используйте отдельного synthetic user или tenant * пишите уникальное значение: UUID или timestamp * проверяйте все критичные read path: direct API, BFF, GraphQL, mobile endpoint, search/read model * логируйте version, timestamp, region, shard, trace_id * разделяйте SLO и alert: если допускается 2 секунды eventual consistency, не алертите на 300 мс, но стройте метрику latency Вывод: Read-after-write пробы превращают редкие stale reads после релиза из “иногда что-то не так” в расследуемый сигнал с понятным риском, стоимостью и SLA.
150
9
Schema drift в продакшене: контрактные пробы для внешних API до поломки интеграций Внешние API часто ломают интеграции не out
Schema drift в продакшене: контрактные пробы для внешних API до поломки интеграций Внешние API часто ломают интеграции не outage, а тихим изменением схемы при 200 OK. В CI/CD, release validation и on-call это поздно видно как падение парсера, потому что QA и dev проверяют статус-код вместо контракта. Что дрейфует * amount был number, стал string * nullable поле стало обязательным * enum получил новое значение * массив превратился в объект * deprecated поле исчезло без смены версии Healthcheck это не поймает: latency зеленая, SLA жив, а потребитель уже не умеет обработать ответ. Контрактная проба Это маленький production-oriented вызов внешнего API, который регулярно проверяет минимальный контракт потребителя, а не весь ответ провайдера. schema = { "required": ["id","status","amount"], "properties": { "id": {"type":"string"}, "status": {"enum":["created","paid","cancelled"]}, "amount": {"type":"number"} }, "additionalProperties": True } r = get("/payments/test-id", timeout=3) assert r.status_code == 200 validate(r.json(), schema) Важный trade-off - tolerant reader: новые лишние поля не должны ломать тест, но breaking changes должны давать алерт. Как запускать * каждые 1-5 минут для критичных API * из того же региона, что и прод * с test credentials и стабильными сущностями * с метрикой contract_probe_success * с diff ответа в алерте Практический совет: держите контракт рядом с кодом потребителя и проверяйте инварианты вроде amount >= 0 и paid не без paid_at. Типичная ошибка Не делайте snapshot всего ответа и не смешивайте пробу с длинным E2E: получите шумный feedback loop и дорогую поддержку. Вывод: Контрактные пробы не заменяют регрессию, но ловят schema drift до пользовательского инцидента.
188
10
Controlled fault injection в продакшене: как проверять fallback-логики без расширения blast radius Fallback часто есть в коде
Controlled fault injection в продакшене: как проверять fallback-логики без расширения blast radius Fallback часто есть в коде и unit-тестах, но ломается в реальном prod из-за таймаутов, ретраев, кешей, circuit breaker, feature flags или форматов ошибок. Типичная ошибка QA и dev - проверять только happy path деградации в staging. Что стоит проверять - timeout pricing-api: checkout берет последнюю валидную цену из кеша - 5xx от recommendations: показываем дефолтный блок, а не пустой экран - 200 с invalid schema: не падаем на десериализации - частичная деградация downstream: основной user journey завершается Как не расширить blast radius - allowlist вместо “1% пользователей”: synthetic user, test tenant, internal account, request header - scope на одну зависимость и endpoint, а не “ломаем сеть сервису” - TTL 5-15 минут, чтобы fault выключился сам - kill switch без деплоя - rate limit, чтобы не создать лавину ретраев - dashboards до старта: fallback hit rate, latency, error rate, saturation, бизнес-метрика flow Минимальный guardrail if fault_enabled(req, "pricing-api"): raise TimeoutError("controlled fault") try: price = pricing.get(item_id) except TimeoutError: metrics.inc("fallback.pricing") price = cache.last_valid(item_id) Практический сценарий Гипотеза: если pricing-api не отвечает до 2 секунд, checkout использует cached price и заказ завершается. Запускаем только для synthetic user, одного endpoint, одного fault, TTL 10 минут, с trace id и stop condition: p95 latency выше лимита, error rate растет или ошибки вышли за targeted cohort. Предупреждение: не встраивайте fault injection хаотично в бизнес-код. Лучше слой клиента, middleware, proxy, service mesh или платформенный механизм, иначе стоимость поддержки быстро превысит пользу. Вывод: controlled fault injection ценен не “поломкой прода”, а проверяемым, ограниченным и наблюдаемым доказательством, что fallback реально снижает риск инцидента.
200
11
Совет на ближайшие годы — изучайте ВАЙБ-КОДИНГ ИИ уже пишет код, чинит баги, генерирует тесты, документацию и помогает запуск
Совет на ближайшие годы — изучайте ВАЙБ-КОДИНГ ИИ уже пишет код, чинит баги, генерирует тесты, документацию и помогает запускать продукты быстрее, чем это делали классические команды разработки. И это уже не "будущее когда-нибудь", а реальность, которая меняет рынок уже сегодня И те, кто научится вайбкодить сейчас, будут увереннее конкурировать на рынке и зарабатывать больше тех, кто по-прежнему делает всё вручную. Стартовать с нуля поможет канал Вайб-кодинг. Там ребята круглосуточно мониторят более 320 российских и зарубежных источников и публикуют только главное: релизы, инструменты, гайды, курсы и практические кейсы. Подписывайтесь, нас уже 45 тысяч: @vibecoding_tg
210
12
⁣Shadow testing асинхронных консьюмеров на прод-трафике: как сверять побочные эффекты без риска для данных Shadow testing нужен, когда новый consumer проверяется на реальных сообщениях, но не должен менять prod. Частая ошибка - считать успехом no exception, не сравнивая реальные side effects. Суть паттерна Боевой consumer обрабатывает сообщение как обычно, shadow consumer получает копию и пишет “предполагаемые действия” в изолированный sink: * shadow-таблицы * отдельный topic * audit storage * recorder вместо БД, event bus и внешних клиентов Главное правило: не “мы не будем писать в prod”, а технически не можем - отдельные credentials, network policy, запрет write-доступа. Что сравнивать Comparator должен сверять не только финальный статус, а модель побочных эффектов: * созданные/обновленные записи * downstream events и HTTP/gRPC вызовы * суммы, комиссии, даты, reason codes * idempotency key, retry/dedup/DLQ поведение * отсутствие лишних действий Перед сравнением нормализуйте timestamp, request_id, UUID, порядок JSON-полей, метаданные брокера и версии схем, если они не меняют бизнес-смысл. Иначе получите шум вместо полезных расхождений. Production guardrails Для Kafka shadow обычно запускают в отдельной consumer group; для SQS/RabbitMQ часто нужен fan-out или shadow-очередь, иначе consumers начнут конкурировать. Практический минимум: * feature flag для отключения * sampling и rate limit * TTL для shadow-данных * маркировка shadow=true * запрет реальных платежей, email, SMS, delivery, CRM * dashboard по diff, а не падение prod-flow Trade-off: больше инфраструктуры и поддержки recorder’ов, зато быстрее feedback loop на реальном трафике и ниже риск релиза async-логики. Вывод: Shadow testing полезен только тогда, когда побочные эффекты измеряются инженерно, а риск для prod-данных исключен архитектурно.
220
13
АЙТИШНИКИ БЕСПЛАТНОЕ ОБУЧЕНИЕ сборник курсов, инструментов и книг Проект «TERMINAL» стал крупнейшей библиотекой бесплатного о
АЙТИШНИКИ БЕСПЛАТНОЕ ОБУЧЕНИЕ сборник курсов, инструментов и книг Проект «TERMINAL» стал крупнейшей библиотекой бесплатного образования. В одном канале собраны курсы, книги, полезные инструменты и практические тренажёры для всех разработчиков 🎓 Практические курсы и задания 🪽 Книги и статьи известных авторов 😮‍💨 Полезные инструменты и ресурсы 🌟 IT-новости и инсайды Обучение по всем направлениям: SQL, Python, Frontend, PHP, C++, Golang, GIT, Linux, QA, Java, Vibe-coding, Infosec и др. Ценишь знания, подпишись: Terminal_tg
213
14
Тестирование идемпотентности в продакшене: как ловить дубли событий до инцидента Идемпотентность не заканчивается unique key
Тестирование идемпотентности в продакшене: как ловить дубли событий до инцидента Идемпотентность не заканчивается unique key в базе: при at-least-once delivery одно событие может прийти несколько раз. Частая ошибка QA и разработки - проверять только happy path, не доказывая, что повтор не создает второй бизнес-эффект. Что проверять Инвариант не "событие пришло один раз", а "повтор не изменил состояние второй раз": * один payment_id - максимум одно списание * один order_id + event_type - один переход статуса * один external_webhook_id - одна обработка * один idempotency_key - один результат операции * повтор не меняет баланс, лимиты, остатки Production probes без риска Практичный подход - безопасные контрольные дубли: * отправить событие * повторить его с тем же event_id или idempotency_key * проверить, что нет нового side effect * убедиться, что ответ совпал или вернулся already processed * проверить рост метрики дедупликации Предупреждение: не делайте это на живых деньгах и реальных клиентах. Используйте test tenants, synthetic users, sandbox merchants, zero-amount операции или internal-only флаги. Логи и метрики Если нельзя связать дубль с эффектом, observability бесполезна. Логируйте: * event_id, idempotency_key, trace_id * consumer_group, handler_name * dedup_decision: new | duplicate | conflict * side_effect_created: true | false * business_entity_id, версию схемы Алерт на events_duplicate_with_side_effect_total > 0 почти всегда оправдан: это уже инцидент или состояние перед ним. SQL-инвариант SELECT idempotency_key, COUNT(*) AS effects FROM payment_charges WHERE created_at > now() - interval '10 minutes' GROUP BY idempotency_key HAVING COUNT(*) > 1; Смотрите таблицу эффектов, а не входящих сообщений: событие может повторяться, эффект - нет. В regression и CI/CD quality gates добавляйте replay after TTL, timeout retry с тем же ключом, restart consumer-а до commit offset и payload conflict. Вывод: Идемпотентность нужно тестировать как production-инвариант с логами, метриками и безопасными дублями, иначе дефект проявится уже в деньгах, статусах или данных клиента.
288
15
Нейросети, IT и AI — в одной папке 💬 С коллегами собрали новые каналы про: 💠 промпты для нейросетей и готовые решения 💠 AI
Нейросети, IT и AI — в одной папке 💬 С коллегами собрали новые каналы про: 💠 промпты для нейросетей и готовые решения 💠 AI-фотосессии, генерация изображений и контента 💠 новости искусственного интеллекта без лишнего шума 💠 применение AI в работе, бизнесе и повседневной жизни 💠 Python, JavaScript, Data Science и системный анализ 💠 вакансии и возможности для специалистов в IT Посмотреть и подписаться тут 👉 https://t.me/addlist/c_rbhnzprbAwMmFi 💌 Добавить свой канал в папку
189
16
Страшная тайна российского айти ✖️ xCode Journal
Страшная тайна российского айти ✖️ xCode Journal
416
17
Хватит гадать — DeepSeek за тебя уже всё решил 🐳 * Сейчас все только про Claude, но я перешёл на DeepSeek и не жалею. Беспла
Хватит гадать — DeepSeek за тебя уже всё решил 🐳 * Сейчас все только про Claude, но я перешёл на DeepSeek и не жалею. Бесплатно, контекст 1 млн токенов — закинул целую книгу, помнит всё. Код пишет отлично, а рассуждения (Reasoning) выдают логику, как у архитектора. Решил протестировать агентский режим на задаче, которую вечно откладывал — собрать чистое инфополе с нуля. Чтобы не перебирать паблики вручную, зашёл через функцию похожих каналов в Telegram. Скормил DeepSeek ссылки на качественных авторов по IT и AI, которых читаю сам, и попросил проанализировать сотни рекомендаций. Агент изучил контент на каналах и оставил только тех, кто делится практическим опытом по: AI-воркфлоу, автоматизации, вайб-кодингу, промт-инжинирингу, RAG-syst. нейрогенерации и др. DeepSeek собрал полезную подборку экспертов в одну папку. Делюсь списком — внутри только полезный контент про IT & AI. 🔗Забирай в один клик: 👉 https://t.me/addlist/FYyQj91I8jJiMzg0
303
18
⁣Сегодня нет джуниоров, а в 2031 году не станет и синьоров Найм младших специалистов сократился на 40%. Искусственный интеллект дал советам директоров основания для дальнейших сокращений. Отставание в обучении составляет 5-7 лет. Отсутствие младших специалистов сегодня означает отсутствие старших в 2031 году. https://habr.com/ru/articles/1039062/
518
19
Cтажировки и вакансии для QA. - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram 👉 @jobs_qa �
Cтажировки и вакансии для QA. - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram 👉 @jobs_qa 🤖 ML & DS 👩‍💻 DevOps 👨‍✈️ ИБ & OSINT 👣 Go 👩‍💻 Mobile 👩‍💻 C# 👩‍💻 Node.js 👩‍💻 Python 🔎 QA 👩‍💻 Java 👩‍💻 UX/UI 👩‍💻 Frontend 🖼️ PHP 📋 Analyst 💼 1C 🖥 SQL 👩‍💻 IT HR Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.
310
20
Cтажировки и вакансии для QA. - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram 👉 @jobs_qa �
Cтажировки и вакансии для QA. - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram 👉 @jobs_qa 🤖 ML & DS 👩‍💻 DevOps 👨‍✈️ ИБ & OSINT 👣 Go 👩‍💻 Mobile 👩‍💻 C# 👩‍💻 Node.js 👩‍💻 Python 🔎 QA 👩‍💻 Java 👩‍💻 UX/UI 👩‍💻 Frontend 🖼️ PHP 📋 Analyst 💼 1C 🖥 SQL 👩‍💻 IT HR Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.
146