Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

1.8 Trillion Events Per Day with Kafka: How Agoda Handles it

Статья из серии «как в компании X решают проблему Y». Сегодня это Agoda и работа с кафкой под нагрузкой (~1.8 триллионов сообщений в день). В компании используют кафку с 2015 года для: аналитики, заполнения даталейка, мониторинга/алертинга, асинхронных коммуникаций, репликаций данных и ML pipeline. Статья как раз описывает решения, которые пришлось сделать в компании, чтобы это стало возможным.

Первое что сделали – двухфазный продьюсинг. Сначала сообщения пишутся на диск (в файл), после уже forwarder отправляет данные в кафку. Сделано это было, чтобы отвязать разработчиков от кафки и что бы команда поддержки кафки могла делать что угодно с кластерами. Следующим шагом стало разделение кафки на кластера, где каждый отвечает за конкретную часть логики: телеметрия отдельно, высокоприоритетные сообщения находятся в другом кластере и так далее. Это решение помогло избежать single point of failure и точечно конфигурировать нужные места. Дальше рассказывается о том, как в компании работают над мониторингом и аудитом кафки и об аутентификации и ACL.

Во второй часте статьи уделяется внимание работе над передачей данных. Описывается как настраивали лоад балансер, через partitioner и assignor strategy. А в третьей части статьи рассказывается о том, как в компании избежали проблемы с чрезмерным выделением ресурсов и решали проблемы лагов.

#how_it_works #kafka

—————————————

Some of My Favorite Things – Postgres Queries

Короткая статья в которой автор делится любимыми SQL запросами для postgreSQL. Сразу напишу, описанные в статье запросы связаны с observability базы и больше о понимании, что с базой происходит.

Вот список того, что найдете в тексте. Первые три запроса связаны с pg_stat_statements и помогает найти топ запросы по количеству, среднему времени выполнения или общему времени выполнения (дальше будет запрос с запросами отфильтрованными по cpu time).

Далее идут запросы на фактический размер таблицы (включая все записи), запрос, который покажет когда ожидается работа vacuum/analyze. Также найдете запрос показывающий не используемые (или редко используемые индексы) и как искать таблицы, в которых отсутствуют индексы для fk. В конце автор дает ссылку на то, как анализировать lock trees.

#data_managment #psql

—————————————

DDD causes Complexity !

Бонус, который появляется при использовании стратегического ддд – определение границ элементов системы, что влияет на сложность за счет переноса связей в элемент. Автор статьи как раз пытается доказать это утверждение.

В начале описываются два вида границ: физические и логические, причем границы идейно отличаются и редко когда 1 к 1 мапятся между собой. Далее автор связывает модульность и сложность между собой. Для чего используется две концепции: integration strength и distance between components. В конце описывается, как используя две метрики (strength и distance) определять «сложность» системы.

#ddd #complexity
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

Top 3 features in Postgres 17

Я не специалист в постгресе, базовые вещи сделать могу, но вот запустить дум в бд уже знаний не хватит. Поэтому каждый раз интересно посмотреть на вещи, о которых не знал и сегодняшняя статья как раз об этом.

Текст рассказывает о трех вещах из 17 версии постгреса, на которые советуют посмотреть. В список попали:
- MERGE command with RETURNING support. Данное улучшение позволяет избежать лишнего запроса на получение данных, после использования MERGE;
- Расширенные функции JSONB. Из примечательного – JSON_TABLE, который приводит json объект в таблицу, с которой можно работать как с любой другой таблицей;
- Работа над перформансом. Тут автор упоминает, что оптимизировали вакуум, b-tree, parallel query processing и так далее. В случае вакуума приводится пример, что из-за новой структуры данных сокращение памяти доходит до 20 раз;

В конце дополнительный список улучшений над которыми работали в компании. Сюда попали: EXPLAIN (SERIALIZE), direct SSL/TLS connections, улучшения в psql и другие изменения.

#psql

—————————————

Checklist for Kubernetes in Production: Best Practices for SREs

Как можно понять из названия, автор текста собрал набор практик, которые помогают в обслуживании k8s. В список мест, о которых подумать надо, попали:
- управление ресурсами
- workload placement
- вопросы вокруг availability
- пробы
- персистанс стораджи
- обсервабилити
- GitOps
- оптимизация расходов
- избегание частых ошибок

Не ждите лонгрида с подробным описанием тонкостей k8s. Для каждого пункта дается краткая справка что это и почему о пункте стоит помнить. Плюс найдете советы, что стоит сделать в каждом случае. Так, в случае обсервабилити автор описывает алерты, которые стоит добавить, что делать с log retention. А для GitOps перечисляет инструменты, которые помогут с reconciliation и как описывать конфиги кластера.

Сразу скажу, я не спец в кубере, поэтому не могу сказать на сколько чеклист адекватен. Но ценность подобного текста вижу в том, что данный чек лист может служить отправной точкой для создания подобного списка в компании.

#k8s #sre #infrastructure

—————————————

Realtime Editing of Ordered Sequences

Статья о том, как в фигме решали проблемы, связанные с одновременным редактированием порядков объектов несколькими людьми. Причем главная проблема связана с eventual consistency: если один клиент меняет в фигме порядок объектов, то изменения долетят с лагом до другого клиента, что приводит к рассинхрону и потенциальным гонкам вокруг порядка изменений.

В качестве решения, в компании решили попробовать использовать алгоритм для синхронизации текста от гугла который называется Operational Transformation. Дальше авторы кратко описывают реализацию алгоритма и дают ссылку на оригинальный пейпер (но если хотите разобраться с ОТ – советую отдельно поискать статьи). После описывают плюсы и минусы алгоритма: хороший перфоманс, параллельные вставки работают корректно, а из минусов сложность реализации и понимания, плюс вместо move используется две операции.

В итоге, ОТ оказался оверхедом, поэтому в фигме решили воспользоваться старым добрым трюком связанным со вставкой между значениями для сортировки (когда между 0.2 и 0.3 вставляется 0.25). Дальше подробно описывается как подход работает и перечисляются плюсы и минусы.

#how_it_works #eventual_consistency
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

How CRDTs make multiplayer text editing part of Zed's DNA

На прошлой неделе упоминался пост от фигмы, где в компании решалась проблема ордеринга элементов при совместном редактировании. В тексте упоминали использование Operational Transformation – подхода, который помогает одновременно редактировать текст нескольким акторам. Сегодня текст от инженеров zed (редактор такой), в котором рассказывается, как в редакторе решали проблему одновременного редактирования, но вместо OT выбрали CRDT.

В начале статьи, кроме исторической справки, автор подводит к тому, что асинхронное редактирование сложная проблема, особенно если редактировать текст по индексам строк. Поэтому на помощь, вместо OT, пришел CRDT. Далее описывается в чем смысл CRDT – сделать структуру данных, операции к которой будут inherently commutative, что бы их применение к реплике данных происходило без трансформаций. Дальше рассказывается о логических фрагментах текстов, основанных на «якорях» – идентификаторах вставки + смещении. После рассказывается как происходит удаление текста, одновременные вставки в одном и том же месте и отмена операций.

Если никтогда не встречались с CRDT – статья поможет главную идею подхода понять.

#text_editing #crdt

—————————————

Управление рисками. Практический подход

Из того, что видел в проектах – либо о рисках не думают совсем, либо работа с рисками превращается в бюрократию. Иногда встречаются попытки использования risk storming (о котором упоминалось в канале). Статья выше о «стандартизированном» подходе работы с рисками. Причем, автор сразу указывает, что текст является пересказом BABOK (10.38 - Risk Analysis and Management).

В статье указывается восемь шагов по работе с рисками (причем каждый шаг рассматривается с придуманным примером):
1. Собрать вводные удобным способом, например брейнштормингом;
2. Создать первичный лог рисков. В лог стоит добавить условие возникновения риска и последствия, если риск выстрелит;
3. Оценка вероятности возникновения риска и влияния риска на систему;
4. «Калибровка» шкалы риска. Т.е. сделать так, чтобы оценка из прошлого шага стала однозначной для каждого стейкхолдера;
5. Оценка рисков по выбранным критериям;
6. Определение одной из пяти стратегии работы с риском: уклониться, делегировать, снизить, принять и увеличить;
7. Определение плана действий для каждого риска;
8. Обновление лога рисков.

#risk_managment


—————————————

Standardizing Chaos: How a Dynamic Status Mapping System Solves Logistics Inefficiencies

Статья, в которой логистическая компания рассказывает как решала проблему связанную со статусами доставок. В начале текста описывается, как вообще shipment работает: create создает заказ на перевозку, а query позволяет понять что происходит с посылкой во время перевозки.

Дальше описывается, что мол компании развиваться надо было быстро и рынок захватывать. А что бы это сделать, пришлось решить проблему со статусами в разных интеграциях: статусы, у каждой партнерской компании, разные. Проблему решили адаптерами под компанию с явным маппингом статусов. Дальше возникла проблема, когда несколько партнеров доставляли груз и одним адаптером под компанию не обойтись. Все это привело к тому, что пришлось делать Dynamic Status Mapping – подход со стандартизацией всех статусов и перевод их в консистентный вид для компании и каждой интеграции. В тексте найдете как подход работает и как решали сопутствующие проблемы: выбор фреймворка, определение статуса при перекрывающихся условиях и вопросы вокруг audit-а.

#how_it_works #logistics
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

Use of Time in Distributed Databases (part 1)

Первая из пяти статей, в которой автор рассказывает о том, как можно синхронизировать время между узлами распределенной системы. Время тут нужно для координации, а из-за независимости работы нод, приходится придумывать абстракции. Так, в тексте, сначала рассказывается о логических, а потом и о векторных часах. После, автор, переходит к асимметрии информации и проблеме генералов. Дальше описываются слабо синхронизированные и строго синхронизированные часы. В конце найдете объяснение алгоритма на основе Timestamp Ordering (TSO) для управлением паралелизмом в распределенных бд, который используют для создания DynamoDB. В остальных частях найдете информацию об использовании логических часов и синхронизации физических часов для создания баз данных.

#distributed_system

—————————————

How Tinder Recommends To 75 Million Users with Geosharding

Статья из серии «компания X, решает проблему Y». Сегодня это тиндер и реализация гео шардирования пользователей, для ускорения поиска людей для рекомендаций. В начале статьи рассказывается как изначально работал поиск. Взяли эластик с одним индексом для данных. Когда компания выросла появились проблемы: слишком большой индекс эластика, latency увеличилась за счет размера базы, а инфраструктурная стоимость начала бить по карману. В результате инженеры решили переехать на гео шардирование, где каждый шард – отдельный регион в мире.

Дальше рассказывается о том, как в компании делили мир на регионы. С этим помогла библиотека от гугла S2 и «container-based load balancing method». S2 как раз помогает с «делением» мира на регионы на quadtree – ячейки, каждая из которых делится еще на 4. Плюс, в библиотеке реализована кривая Гильберта, которая гарантирует что близкие точки на карте будут в ближайших ячейках. По поводу балансировки, в статье рассказывается о том, как распределить нагрузку между регионами из S2: достаточно маркировать регион по нагрузке, после чего объединить, пока лимит не закончится.

В конце статьи найдете описание архитектуры и рассуждения между выбором Multi-Index и Multi-Cluster. Из интересного, рассказывается о том, как решали проблему консистентности (люди путешествуют), для чего взяли кафку.

#how_it_works #geosharding



—————————————

GraphRAG Explained: Enhancing RAG with Knowledge Graphs

Если хотите сделать доменно-специфичный GenAI на основе LLM, то придется воспользоваться RAG. В базовом виде RAG объединяет векторную базу данных с контекстной информацией и llm, в который скармливается контекст. Но для сложных вопросов (требующих рассуждений или ответы на вопросы с соединением разрозненной информацией) вариант с векторной бд не сработает. В статье выше, автор рассказывает о GraphRAG – инструменте майкрософта, который кроме векторного поиска использует граф знаний.

В начале статьи автор рассказывает что такое граф знаний (структура, которая хранит и связывает данные на основе их отношений). После рассказывает из чего состоит GraphRAG: индексации и обработки запроса. В рамках индексации описываются четыре основных этапа (из интересного, для создания графа знаний используется llm). После описывается обработка запроса. Тут описывается как глобальный, так и локальный поиск. Дальше описывается сравнение обычного RAG и GraphRAG. В конце найдете большой блок с объяснением, как GraphRAG подключить в векторную базу Milvus.

Русский перевод

#rag #genAI #graph
This media is not supported in your browser
VIEW IN TELEGRAM
Организационный пост

Решил рассказать о публичных активностях и о том, что ждать в ближайшие 3 месяца от канала.

1. Выступление. В субботу буду на конференции для аналитиков рассказывать о «предсказании» будущего. Расскажу об подходе, который использую для принятия тех решений. Попутно буду душить о системах и системной инженерии.
2. Новая версия АА курса. Все еще пишу. Получилось больше чем планировал. Как пример, записал видос с драфтовой версией третьего урока. По поводу продаж/старта — с шансами в 90%, в конце апреля откроются продажи. Как определится дата — сразу напишу отдельный пост.
3. Ответы на вопросы. Продолжу отвечать на вопросы как разберусь с курсом. Планирую до отпуска (в июле) успеть ответить на 1-2 вопроса.
4. Пятничные ссылки. Как были, так и остаются. В июле канал на месяц уйдет в отпуск, после ссылки продолжаться без изменений.
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

Herding elephants: lessons learned from sharding Postgres at Notion

Статья от инженеров ноушена, в которой рассказывается как шардировали постгрес. В самом начале описываются проблемы из-за которых возник вопрос шардирования: пики загрузки CPU базы данных, миграции перестают быть безопасными, проблемы с VACUUM. Дальше описывается, что в компании решили придумать partitioning scheme основанную на application-level sharding. Для этого пришлось искать оветы на вопросы о том, какие данные, как будут разбиваться данные и сколько шардов будет нужно (в тексте найдете как инженеры отвечали на три этих вопроса).

После описывается «базовый» подход к миграции данных: сначала данные пишутся в два источника, после начала записи переносятся старые данные в новую бд, после команда проверяет целостность данных и если все ок — происходит переключение на уровне кода. В конце статьи найдете три мысли, которые появились у инженеров после миграции. Связаны мысли со временем когда надо было мигрировать, отношение к zero-downtime миграциям и использование глобальных идентификаторов для данных.

#how_it_works #psql

—————————————

How Not To Sort By Average Rating

Представте, что делаете магазин или медиа проект. Прилетает задача отсортировать элементы (товары/посты) по рейтингу, который задается пользователям. Вопрос: как определить «score» по которому будет происходить сортировка.

С этой проблемой поможет статья от 2009 года, в которой рассматриваются три варианта выбора подходящего «score»:
1. Первый вариант: Score = (Positive ratings) − (Negative ratings);
2. Второй вариант: Score = Average rating = (Positive ratings) / (Total ratings);
3. Третий вариант: Score = Lower bound of Wilson score confidence interval for a Bernoulli parameter.

В случае с первым вариантом возникает проблема связанная с количеством оценок. Так товар с двумя положительными оценками будет в выдаче выше, чем товар с 1000 оценками, где сумма результатов будет меньше двух (мнение разделится 50/50). Во втором варианте опять не учитывается количество оценок. Так нонейм с двумя «пятерками» от родственников продовца будет выше в рейтинге, чем товар с тысячами оценок и средним рейтингом в 4.9.Третий вариант предлагает мат модель из 1927 года, которая балансирует score по количеству оценок. В статье приводится рубишный код, а если нужна реализация на js или go — добавлю ссылку на другую статью.

#algorithms #sorting

—————————————

Impureim sandwich
Recawr Sandwich

Две статьи рассказывающие о паттерне из функционального программирования. Идея строиться вокруг утверждения, что чистые функции не могут вызывать нечистые действия (например получение данных, либо изменение стейта). Чтобы избежать этой проблемы impureim sandwich. Идея в последовательности действий: сначала нечистая функция, потом чистая, в конце опять нечистая. Причем sandwich тут — сугубо метафора автора (как я понял). Далее автор дает примеры на хаскеле, f# и c#. А в конце дается объяснение слова impureim — IMpure/PURE/ IMpure.

Следующий паттерн, recawr sandwich, является подчастью impureim sandwich. А recawr расшифровывается как REad CAlculate WRite. И если impureim говорит о подходе вокруг чистых/нечистых функций, то recawr о конкретном действии: получить данные, вызывать чистую функцию, записать данные (поменять стейт). Во второй части статьи найдете примеры на разных языках и дополнительные статьи раскрывающие подход.

#patterns #functional_programming
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

Legacy Modernization meets GenAI

Хоть скептически отношусь к GenAI, но мимо статьи пройти не смог. Главная идея текста — показать как вместо написания кода с помощью GenAI, начать разбираться в легаси системах (проект на cobol как пример прилагается). Для этого создали проект CodeConcise, который должен помочь с «ускорением» модернизации систем.

В начале описывается видение авторов вокруг GenAI и LLM. А также текущие проблемы, которые усложняют модернизацию. В список попали вопросы связанные с пониманием системы, целях системы, минимизацией рисков, поиск поддоменов из кодовой базы, а не из бизнеса и так далее. Дальше описывается структура CodeConcise: переводим код в AST, прогоняем дерево через LLM для получения графа знаний. А после, с графом знаний, работает пользователь через LLM. Граф знаний по коду хранят в neo4j. Поле описывается, как из полученного графа собираются требования, которые описывают поведение системы. Тут же показывается как понимание поведения системы на cobol ускорилось. Кроме требований, подход помог с высокоуровневым объяснением системы, включая поиск неиспользуемого кода. Ну а в конце ожидания от системы и куда дальше планируют двигаться инженеры.

Конкретики в статье не встретите, но было бы интересно получить доступ к CodeConcise, чтобы посмотреть как проект работает в реальности.

#genAI #llm

—————————————

Australia/Lord_Howe is the weirdest timezone

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

В начале текста автор рассказывает о григорианском календаре и о том, какое влияние календарь оказал на таймзоны. После описывается влияние замедления вращения земли на синхронизацию времени между компьютером и реальностью. Для чего придумали високосную секунду, которая нивелирует эту разницу. Ну а после автор описывает часовые пояса. В список попали:
- Asia/Kathmandu — со смещением 5:45;
- Africa/Casablanca и Asia/Gaza — которые основаны на лунном календаре;
- America/Nuuk — в котором летнее время происходит «вчера»;
- Australia/Lord_Howe — в котором летнее время от зимнего отличается на два часа, а не на час;

Попутно найдете информацию о разнице между летним и зимним временем.

#timezone

—————————————

How Airbnb Built a Key-Value Store for Petabytes of Data

Очередная статья о том, как в компании решали проблемы. Сегодня это airbnb, в котором возникли проблемы с доступом к derived данным (это данные, которые нужны для включения перс функций для конкретного юзера).

Сначала описывается что требуется от derived data service: high reliability, availability и low latency. А что бы добиться этих характеристик придумали Mussel — kv storage. Так как существующие решения не подходили, в компании сначала сделали HFileService (в тексте найдете плюсы и минусы решения). После сделали Nebula — систему для устранения проблем между batch-processed data и увеличенной нагрузкой для real-time доступа к данным (в тексте также найдете плюсы и минусы решения). И вот после этого появился Mussel, который заменил прошлые решения. В тексте найдете как происходит управление партишенами через Apache Helix, происходит репликация через kafka, происходит унификация хранения данных и реализован Bulk Load. В конце приводятся цифры перфоманс метрик и выводы с доп материалами.

#how_it_works #db
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

Секреты стройности монолита: подходы по снятию нагрузки с БД

Статья из блога яндекса о том, как в компании уменьшали нагрузку на MySQL в яндекс еде. Сначала рассказывается о том, из чего система состоит: старый монолит на php, кластерный mysql (400+ таблиц), ProxySQL для роутинга запросов на мастер/реплику и сервисы на питоне, го и крестах. Из проблем: повышенный cpu и расход памяти, слишком много таблиц для работы, при нагрузке на запись, кластер останавливает запись, для достижения консистентности между нодами.

После рассказывается о том, как проблемы решались. Первым делом раскидали таблицы по командам разработки и начали трекать «плохие» запросы по времени выполнения. Попутно, сделали скрипт, который проверял количество задействованных таблиц на каждый запрос. И что бы не выносить загруженные таблицы в отдельные сервисы, вынесли таблицы в отдельные базы, для чего написали собственный инструмент + визуализировали связи между таблицами для группировки. Дальше рассказывается, как выносили группы таблиц. В тексте найдете интересные идеи по анализу бд, которые можно использовать вне еды. По поводу выноса таблиц в отдельные бд — вопросы.

#db #scalability

—————————————

What's OAuth2 Anyway?

Название статьи соответствует тому, что получите — по ссылке лонгрид (не шучу) с подробным объяснением того, как работает OAuth2. Кроме объяснения работы, автор описывает причины, из-за которых были приняты те или иные решения в протоколе.

Текст начинается с исторической справки и объяснения того, почему oauth появился, а именно из-за проблемы обмена данными пользователя между приложениями. После этого описывается что такое oauth — фреймворк, который дает пользователям возможность решать, какие приложения имеют доступ к персональным данным. Далее описываются четыре основные роли и как они между собой взаимодействуют: Resource Server, Resource Owner, Authorization Server и Client Application. Потом описывается работа клиентов, серверов авторизации, токенов, скоупов авторизации. Дальше описывается флоу аутентификации и авторизации через oauth, причем описывается как явный, так и не явный флоу. Причем, автор дает decision tree по выбору оптимального флоу и 13 референсов.

Если хотите разобраться в работе протокола — однозначный мастрид.

Русский перевод

#authz #oauth

—————————————

Bluesky: The Decentralized Social Media App with 30 Million Users

Статья описывает внутрянку соцсети Bluesky, которая построена поверх Authenticated Transfer Protocol. Протокол федеративный, из-за чего соцсеть является децентрализованной, что помогает пользователям взаимодействовать между собой без контроля со стороны платформы. В начале автор описывает, почему Bluesky решили идти в сторону децентрализации: упрощение миграции пользователей, поиск контента через relays, получение гибкой фильтрации контента. Далее описывается три основных компонента из которого соц сеть состоит:
- сервера перс данных, где хранятся посты, лайки и прочее;
- relays, которые агрегируют контент для пользователей (relays можно будет сделать под себя);
- App Views — прокси между relays и тем, что видит пользователь;

При этом, в тексте найдете описание того, как компоненты работают между собой. Далее описывается аутентификация и перенос аккаунтов между серверами. В конце описывается как контент индексируется и модерируется. Если хотите сделать децентрализованное приложение — статью стоит изучить.

#how_it_works
Новый поток «Асинхронной архитектуры» «Коммуникации систем», старт 28 мая

Год назад понял, что «Асинхронная архитектура (АА)» уже состарилась. Материал не раскрывал темы так глубоко как хотелось, а видео формат исправлять и дополнять оказалось слишком сложно. В результате чего было решено полностью переписать курс, добавив новые темы, глубже раскрыв старые и подвязав «Анализ систем (АС)». Получилось четыре лонгрида, по размеру не меньше, а то и больше, чем в АС.

Так появились «Коммуникации систем (КС)». В отличии от АС, где рассказывается о поиске элементов системы, свойств этих элементов и выбора архитектурного стиля, в КС упор делается на коммуникации между элементами. Будем искать формальные и функциональные связи (привет EventStorming и концептуальная модель данных), разбираться в характеристиках каждого из видов коммуникации, определять размеры событий и в каких случаях подойдет синхронный вызов, а в каких — асинхронный. Отдельный лонгрид посвящен миграции с одного вида коммуникации на другой и исправлению ошибок. И в этот раз поговорим о том, как «продавать» решения бизнесу и коллегам, а также в каких доменах подойдут event-driven коммуникации.

Будет полезно тем, кто работает с монолитами, так и тем, кто работает с распределёнными системами и планирует свои монолиты разобрать.

• Если проходили АС — кроме разбора коммуникаций узнаете продолжение истории Ибрагима и раскрытие ряда тем из курса.
• Если проходили АА — глубже разберетесь с коммуникациями и узнаете о том, как описывать поведение и форму системы.
• Если проходили АА и АС — узнаете как связаны темы из двух курсов.

Домашка тоже изменилась, вместо написания системы с нуля, будем «чинить» уже существующую систему. К сожалению, в первом потоке домашка без написания кода, так как банально не успели написать 10 одинаковых систем на разных языках.

Учиться начинаем 28 мая, закончим в середине июля. Промокод на 10% скидку — PEPECOMMUNICATIONS. Действует до конца выходных.
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

RFC vs. ADR: Why Developers Should Care About Both

Когда говорят о документации архитектуры сразу думают о ADR или о RFC. На деле, оба документа помогают в описании «почему» решение было принято. Но документы не спасают от споров, что лучше использовать: ADR или RFC. Автор статьи объясняет разницу между подходами и дает «фреймворк» по выбору между подходами.

В начале статья начинается с описания RFC (Request for Comment). Описывается зачем нужен документ (получить фидбек до принятия решения), описывается зачем использовать подход (поиск подводных камней, сохранение обсуждений и предотвращение недокументированных решений). После автор приводит пример документа в котором встает выбор между SwiftData и Core Data, попутно объясняя структуру.

После, автор переходит к объяснению ADR (Architecture Decision Records). Аналогично rfc, описывается зачем документ нужен (запись принятых решений), зачем использовать (борьба с амнезией, помощь новым разработчикам, создание accountability в архитектуре). Пример также приводится с описанием базовой структуры.

А в конце найдете decision tree по которому можно выбрать какой из двух подходов использовать.

#adr #rfc

—————————————

Redis as a Primary Database for Complex Applications

Название статьи говорит само за себя — в тексте найдете объяснение, почему стоит посмотреть на redis как на primary db в проекте. Делать подобный выбор оставлю на совести читателя, но статью, в качестве разнообразия, оставлю.

Начинается текст с краткой справки о том, что это за in-memory db, которую используют для кеша. Дальше рассматривается пример, в виде social-media приложения, где используется пять разных баз для разных типов данных. Из-за этого возникают проблемы: сложность в деплойменте, обслуживании, скейлинге, высокая цена в облаке и проблемы с latency. Дальше автор объясняет, как все эти проблемы решаются заменив пять баз на один редис. Для этого объясняет как работают модули для поиска и графов, кеширование и производительность. После, автор рассказывает о двух вариантах персистенса базы: снапшотах и AOF. И после персистенса поднимаются темы масштабирования и шардирования с геошардами и репликацией. В конце найдете объяснение работы редиса в k8s и решение конфликтов через CRDT.

#redis

—————————————

5 Common Antipatterns in Payment Systems Design

Может показаться, что в платежных системах стоит фокусироваться на перфомансе или качестве кода. На деле, главное сделать так, что бы система не глючила и расширялась без проблем. А на это влияет заложенная структура. Автор поста собрал пять антипаттернов, которые встречаются в платежных системах и способах избежать этих проблем.

Сам список анти паттернов включает:
- Верить, что PSP (Payment service providers) будет присылать синхронизацию в ответе. Тут о том, что хоть PSP и высокодоступные, но из-за этого возникают проблемы с nondeterminism. Что приводит к двум подтверждениям одной и той же операции, которые не говорят о двойном списании.
- Вера, что платеж — движение средств. Тут о том, что платеж — «обещание» перевести деньги, а непосредственно переводом будет — transfer.
- Дизан на основе работ карт. Тут о том, что важно разделять order, intent (что оплачивается) и method (как оплачивается).
- Stretching State Machines. Тут о том, что стейт машина не всегда подходящий выбор для обработки жизненного цикла платежа.
- Проблемы вокруг базы. Тут о том, что если хотите роста, возможно стоит заранее выбрать подходящую бд, вместо срочных переездов.

#payment
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

Testing graph databases

Давайте сразу, текст очень большой. Если печатать статью, то получится 130+ страниц А4. Текст уже упоминался в ответе на вопрос о графовых бд, но хочется напомнить о лонгриде еще раз.

Идея текста такая: автор работает над проектом, где используется графовая база данных. Изначально выбрали neo4j, но в результате проект переехал на ArangoDB. Ну и в контексте этой ситуации, автор решил провести ресерч и сравнить 6 графовых бд между собой. Кроме neo4j и arangoDB, выбор пал на: cayley, terminusDB, JanusGraph и NebulaGraph. Кроме перформанса автор еще проверял наличие библиотек для go, python и haskell.

Дальше автор описывает сценарий, который проверялся в каждой из баз. Сначала говорится о датасете, который будет лежать в базах, для чего использовалась онтология из рабочего проекта, которая проверяет библиотеки по разным свойствам. Дальше рассказывается, как генерировались данные. И потом, как происходила выборка (код на питоне присутствует). Для чистоты эксперимента, автор еще сделал проверку для кода, без использования базы данных. Ну а дальше начинается сравнение каждой из базы данных, куда попали примеры кода, графики и результаты. В конце найдете выводы и «победителей». Если выбираете графовую бд в проект — статья мастхев.

#graph_db

—————————————

How GitHub uses CodeQL to secure GitHub

CodeQL — инструмент статического анализа, который разработали в гитхабе и который проверяет код на наличие секьюрити уязвимостей. Главная идея в том, что код можно представить как базу данных, к которой делаются запросы для анализа. У инструмента три способа использования: стандартный «запустил и поехал», расширенная настройка с кастомными запросами и Multi-repository variant analysis.

В тексте найдете опыт секьюрити команды гитхаба, в котором описано, как в компании используется CodeQL. Начинается текст с объяснения что это за инструмент, после показано как делать кастомный query pack и вставлять запросы в любой репозиторий. Дальше описываются примеры запросов, которые можно использовать в проектах: определение вызова рисковых API, использование не безопасных методов библиотек, проверка доступов в HTTP эндпоинтах, проверка токенов и так далее. В конце найдете упоминание Variant Analysis — процессе поиска вариантов уязвимостей.

Русский перевод

#fitness_functions #security

—————————————

Reference Architecture Models

Reference Architecture Models — темплейт проекта, который можно использовать для разработки как референс. Такие модели нужны для определения концепций и принципов, которые необходимо реализовать в коде, объяснения реализации паттернов на примере и показа «эталонного» примера реализации системы.

Статья выше как раз рассказывает о том, что за модель и кому нужна референсная модель. После рассказывается о шести видах моделей: инфраструктурная, application, privacy, security, data и capability (бизне слогика). Для каждой из моделей описывается что должно входить в модель, какие плюсы и примеры реализации. Дальше автор рассказывает хайлевел идеи по созданию моделей (делайте проактивно или итеративно) ну и кто такой моделью заниматься должен. В тексте не хватило ссылок на гитхаб с примерами моделей, но для общего понимания и самостоятельного изучения текст подойдет.

#architecture
Forwarded from FEDOR BORSHEV
В четверг, в 16:00 MSK будем с Антоном Давыдовым отвечать на вопросы о «Коммуникации Систем». Расскажем чего ждать на курсе, как будет проходить обучение и что поменяли со времён «Асинхронной Архитектуры» (спойлер: всё).

Встречаемся прямо здесь 15 мая в 16:00 MSK, будет видео-стрим. Записи не будет.
———
А ещё сегодня вроде как значимо поднимаются цены, но на сайте до сих пор не поменяли, так что го покупать, если хотите сэкономить
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

Cedar: A New Language for Authorization

В 2024 году, в aws подготовили пейпер о новом DSL для описания прав — cedar. Упор в DSL сделан на выразительности, перфомансе, безопасности и анализируемости. Поддерживает RBAC, ABAC и ReBAC.

Статья выше — пересказ пейпера и начинается с описания структуры policy, который состоит из effect (разрешено или нет), scope (юзер, действие и ресурс) и conditions (доп ограничения связанные с атрибутами). Далее описывается как происходит анализ полиси, через symbolic compilation, который сводит все к SMT формулам (формализация на Lean присутствует). Подобные действия помогают выявлять несоответствия и проверять инварианты, что поможет в рефакторинге. В последней части описывается реализация, которая сделана на расте и бенчмарк с другими языками авторизации

#authZ

—————————————

Every Backend Engineer needs to know how to deal with payments.


Основная проблема платежных систем не в реализации кода, а в обработке корнер кейсов и ошибок возникающих во время работы написанного кода. Поэтому сегодня статья от автора, который делится способами решения проблем в системах, занимающихся обработкой платежей.

Статья начинается с обсуждения семи возможных статусов платежа: инициирован, обрабатывается, успешен, зафейлен, ожидает повтор, refunded и отменен. Понравилось, что есть flowchart с переходом между статусами. Дальше дается совет по хранению статусов через append-only таблицу, что поможет с аудитом, целостностью и concurrency обработкой. Следующая проблема, которую рассматривает автор — повтор платежей. Дается список условий когда стоит и не стоит делать ретрай и опять же flow chart для визуализации «движения» оплат. Последняя проблема связана с двойным списанием и достижением exactly-once. Для решения автор предлагает использовать идемпотентность и Distributed Transaction Handling, но как не пишет.

Русский перевод

#payment_system

—————————————

The Golden Age of Modularity

Статья рассуждения от автора learning DDD, в которой объясняется, почему модульность стала ключевой в контексте AI и LLM. Сначала объясняется что такое модульность, через два критерия: понимание что затрагивает изменения системы и понимание что произойдет при изменениях. При этом, модульность раньше связывали с долгосрочным развитием, но пришли LLM. И теперь модульность нужна, чтобы генерация кода приносила меньше проблем. А для этого необходимо ограничивать контекст нейронки, с чем модульность и помогает. В конце найдете ссылки на две книги автора (learning DDD и Balanced Coupling), которые как раз помогут в определении границ элементов и модульности.

#modularity #llm
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

Amdahl's Law - The Theoretical Relationship Between Speedup and Concurrency

Хоть статья — вторая часть из серии постов о масштабировании рельсы, не ведитесь. Главное в тексте, объяснение закона ограничивающего рост производительности с увеличением процессов. Сам закон назван в честь ученого Джина Амдала, который и придумал закон.

В начале текста объясняется в чем суть закона (с математической формулой). При этом, автор оставил ссылку на видео, где объясняется как и за счет чего взялась формула. Дальше рассказывается, как используя закон Амдала, определить оптимальное количество тредов. При этом, понравилось, что автор делает различие между теоретическими выкладками и реальным количеством тредов, которые стоит выбрать. Связано это с тем, что добавляются дополнительные ограничения в виде излишнего потребления памяти и дополнительной конуренции, что уменьшает производительность.

Если до этого не встречались с законом и считали количество процессов/тредов «пальцем в небо», то статью стоит посмотреть.

#concurrency #performance

—————————————

Why is Redis So Fast Despite Being Single-Threaded?

Когда говорят о redis, любят вспоминать скорость работы базы. Так, если верить автору поста, редис может обрабатывать 100к запросов в секунду. И это при том, что редис использует single-threaded model для обработки запросов. Автор статьи задался вопросом, почему так происходит, в результате чего появился текст выше.

Статья состоит из четырех частей:
- Почему так быстро работает редис;
- Плюсы подхода;
- Примеры дополнительных оптимизаций;
- Минусы подхода.

В первой части, где описывается, почему так быстро база работает, описывается четыре вещи: работа в памяти, использование оптимизированных типов данных (хеш таблицы), неблокирующий ввод/вывод и low-CPU задачи, которые выполняются в базе. В качестве плюсов найдете отсутствие блокировок, легкость отладки и разработки и отсутствие context switching. В части оптимизаций, автор описывает два подхода, которые добавляют асинхронности (вокруг освобождения памяти и анализа запросов). А в конце дается три проблемных места, о которых стоит помнить, если используйте редис.

Русский перевод

#redis #how_it_works

—————————————

Why Your Workflows Should Be Postgres Rows

Хоть сам плохо отношусь к workflow engines (что не помешало написать собственный энджин), это не мешает читать статьи по теме. Сегодня как раз такой случай, авторы workflow engine инструмента написали статью, в которой делятся опытом по работе с процессами. Основной совет — хранение состояния воркфлоу в двух таблицах постгреса (status, operation_output) поможет упростить работу со сложными процессами.

Для иллюстрации совета, в начале текста, авторы придумали биллинг процесс из 4 шагов (расчет используемых ресурсов, генерация инвойса, выставление счета и отправка квитанции). Дальше показывается, как хранить состояние всего процесса и результат каждого шага в постгресе (либо другой базе по выбору). Что помогает в отладке и проверки процесса на детерминированность. После описывается, как хранить ошибки и как перезапускать воркфлоу, которые упали.

#workflow_engine
Forwarded from FEDOR BORSHEV
Sold out на «Коммуникации систем»

Обычно мы закрываем запись в день начала обучения. Сейчас закрываем раньше — на выходных мы набрали столько, сколько хотели. Возьмём больше — придётся жертвовать качеством.

Обычно продажи закрывают без предупреждения, но мы так никогда раньше не делали. Поэтому закрывать одним днём будет нечестно. Если хотели запрыгнуть в последний вагон — до вечера ещё можно купить. Если вас будет слишком много — закроем раньше. Следующий поток будет в конце года, до этого можно будет купить самостоятельный тариф.

У меня нет цели обострить этим постом FOMO или ещё как-то нарастить продажи — нам хватит. В будущем о солдаутах будем предупреждать раньше и со счётчиком.

Спасибо вам за доверие! Надеюсь, оправдаем
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

SQL query optimization: a comprehensive developer's guide

Название статьи говорит само за себя. По ссылке найдете 18 советов по оптимизации как SELECT, так и INSERT и DELETE запросов в реляционных базах. Часть советов подойдет под postgreSQL и mySQL.

Советы делятся на три группы. Так советы вокруг вставки включают следующий список: напоминание о EXPLAIN, работа с индексами, куча советов по джоинам (как типизации, функциям и избеганию лишних джоинов). Кроме этого авторы описывают как использовать subquery, пагинацию, GROUP и window functions. И что делать, что бы возвращать меньше данных, либо использовать меньше данных для селекта.

В случае INSERT найдете три главных совета: посмотреть в сторону специализированных функций (например COPY), отказ от не нужных индексов и оптимизация возвращаемого результата. А для DELETE найдете советы связанные с TRUNCATE, партициями, разбивкой транзакций на чанки и использование фильтрации, вместо удаления данных.

Каждый совет делится на три части: как применить совет, какие риски или потенциальные проблемы в решении и «золотое правило» использования совета. Если плаваете в базах — освежить знания стоит.

#sql

—————————————

How to build MongoDB Event Store

Когда говорят о каноническом event sourcing (который о стейте, а не о event streaming), в качестве event store (место, где хранятся события) используют либо реляционные базы, либо специализированные решения. Хотя на деле, можно взять любую базу (хоть редис), что доказывает автор поста выше.

Начинается текст с объяснения что такое event sourcing и event store (радует, что есть ссылка, которая объясняет в чем разница между event sourcing и event streaming). Дальше описываются базовые требования к event store связанные с хранением и получением данных. Дальше описывается, как хранить события в документах, причем не одно событие в одном документе, а стрим (набор событий) в одном документе. После показывается пример реализации подобного храниения стримов в монге и как добиться optimistic concurrency. В конце найдете список трейдофов, в которые попали как размеры документов в монге (до 16 мегабайт), так и проблемы с созданием read model.

#event_sourcing #event_store

—————————————

How Amazon S3 Stores 350 Trillion Objects with 11 Nines of Durability

Очередная статья о том, как в компании решали проблемы. Сегодня это aws, где оптимизировали работу S3 для поддержки 99,999999999% SLA (11 девяток). При этом, не ждите конкретных советов, статья скорее описание того, как работает сервис в общем и как дизайн решения привели к нужным свойствам.

Статья начинается с объяснения того, что такое s3 (object storage service) и какие свойства у сервиса сейчас: куча девяток в durability, разные виды стораджей, автоматический скейл и так далее. Далее описываются вехи «эволюции» сервиса: от рождения в 2006 году, добавление регионов в 2010, улучшение перформанса в 2015, оптимизация для AI и аналитики в 2018 и так далее. При этом, каждый этап эволюции занесен в одну из двух фаз, в которой требовались уникальные свойства от сервиса. После описывается архитектура сервиса, где найдете информацию о том, как обрабатываются запросы, индексируются и хранятся данные и происходят оптимизации. После начинается блок с объяснением того, как данные из запроса попадают в s3 и как работает индекс.

#how_it_works #durability
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————
Optimistic Concurrency Control: Alice and Bob Couldn't Sit Together

Проблема распределенных вычислений — гонки связанные с изменением данных. Для чего используют локи. Если говорим о гонках на уровне базы, то кажется, что можно не запариваться, так как в 80% случаев код скорее всего будет работать. Но в цельности, знать о локах и уметь использовать подход придется. А с пониманием работы поможет статья, где автор рассказывает об оптимистичной блокировке в контексте постгреса.

Статья крутиться вокруг одного примера: Алиса и Боб хотят купить билеты в кино. При этом, сделать это так, что бы сидеть рядом. Дальше Боб делает транзакцию, в которой проверяет наличие двух мест рядом и ждет, пока Алиса забронирует место, чтобы самому забронировать место рядом (транзакция все еще висит). Но в этот момент появляется Mallory, которая также хочет забронировать место (но не может из-за транзакции Боба). Дальше Боб с Алисой делают UPDATE для бронирования места и коммитят транзакцию. И по итогу, Mallory окажется без билета, а Боб с Алисой пойдут в кино. А во второй части показано как будет работать optimistic lock для aws Aurora DSQL.

#sql #optimistic_lock

—————————————

Simple tips for managing any project.

Статья от Simon Wardley (это тот, кто придумал карты вордли), в которой рассказывает о базовых принципах в управлении проектами, который использует 15 лет. Для этого он рассказывает о проекте, в котором изначально выбрали не корректно элементы системы из-за чего начались проблемы. Дальше описываются шесть вопросов, которые помогут решить проблемы с проектами. Шаги похожи на то, что предлагает стратегический DDD и если шаги сгруппировать получите следующие направления:
- понимание пользователей и их нужд;
- определение capabilities, которые закрывают нужды пользователей;
- понимание развития компонентов, которые связаны с capabilities;
- менеджмент компонентов.

Дальше автор описывает проблемы, из-за которых происходят провалы. Тут найдете: проблемы с коммуникациями, mismatched expectations стейкхолдеров, проблемы с ясностью целей, проблемы с remote teams, культурными особенностями и проблемы с границами элементов.

В конце дописаны ответы на некоторые вопросы. Важно отметить, что примеры в тексте показаны только через карты, но заменив карты на поддомены и контексты из DDD, смысл не поменяется.

#management #product

—————————————

How Stripe Processed $1 Trillion in Payments with Zero Downtime

Очередная статья из серии «как в компании X решили проблему Y». На этот раз это страйп, который обработал триллион долларов платежей за год без простоев. Изначально страйп использовал mongoDB, сначала казалось что база проще реляционной в работе. Но из-за нагрузки и количества данных оказалось, что вариант так себе. При этом шардирование монги не помогло (в тексте найдете кусок о том, как шардирование работает). В результате появилась DocDB, основанная на монге, где за хранение и извлечение отвечает монга, а за шардирование и миграции отвечает DocDB.

Дальше описывается, как работает Data Movement Platform — штука, которая помогает перемещать данные между шардами, особенно когда размер шарда выходит за допустимые пределы и нужно добавлять новый. Проблема тут не только в том, чтобы переместить информацию, но и сделать так, что бы связанные данные также переместились в нужный шард. Дальше описан полный алгоритм работы шардирования. А в конце найдете ссылку на оригинальную статью

#how_it_works #sharding
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

Second-System Syndrome in Software

Second-system эффект впервые описал Fred Brooks в книге «mythical man-month». Определение звучит как тенденция, при которой небольшую, элегантную и успешную систему, заменяют на раздутую систему с овер инженерингом, которая дороже первой и хуже работает. Автор статьи решил собрать 11 примеров, которые подтверждают second-system эффект. В тексте найдете описание следующих «провалов»:
- Netscape 6
- Windows Vista
- Apple Copland
- Multics (1960s)
- Perl 6 (Raku)
- PHP 6
- Python 3
- Angular 2
- Evernote 10
- Skype “New Skype” 2017
- Snapchat Redesign 2018

Каждый пример состоит из того, как система изначально выглядела и почему была успешной, что изменилось во второй версии, разбор провала и последствия изменений.

В конце текста найдете главные выводы, которые сделал автор. Сюда попали следующие советы:
- помнить, что сделало первую версию успешной;
- избегайте амбиций;
- помните о совместимости;
- дизайн должен идти от пользователей, а не хотелок разработчиков;
- изменяйте систему по частям, а не сразу всю.

#sustem_design #modernization

—————————————

Event versioning strategies for event-driven architectures

Главная проблема асинхронных коммуникаций — сложности в исправлении ошибок и эволюции схемы событий. Если с ошибками еще можно справиться, то с эволюцией поможет только версионирование событий. Автор текста решил разобраться, какой способ управления версиями лучше и для этого рассматривает шесть вариантов:
- добавление версии в название событий;
- добавление версии в payload/metadata события;
- использование отдельных очередей/топиков для каждой версии;
- использование schema registry и schema id в событии;
- отказаться от breaking changes;
- автоматически переводить версию события со старой на новую.

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

#events #evolution

—————————————

How DynamoDB Scales: Architecture and Design Lessons

Статья из серии «как в компании X решали проблему Y». На этот раз это DynamoDB и проблема скейлинга базы данных в aws. Чтобы понимать проблему, в 2021 году, в пике, dynamoDB выдерживала 82.9 миллионов rps в пике. При этом, сохраняя однозначную задержку за чтение и запись.

Текст начинается с объяснения того, как работает key-value база: как работают таблицы, которые хранят items, где каждый item — набор из ключей и значений. Логическое партицирование тоже присутствует. При этом pk может быть двух видов — partition key и опциональный sort key. Дальше автор показывает структуру базы и объясняет как запросы от пользователя, через request routing, попадают в ноды бд. Элементы структуры тоже описываются (зачем нужны и что делают). Дальше описываются плюсы базы и за счет чего эти плюсы достигаются (можно менять traffic patterns, контролировать rate-limiting и изоляции и так далее). В конце найдете информацию о том, как работает глобальный контроль допуска для получения и записи данных.

Если до этого не работали с dynamoDB — статья расскажет что ждать от базы и объяснит как технология работает.

#how_it_works #scaling
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

How Lyft Uses ML to Make 100 Million Predictions A Day

Очередная статья из серии «как в компании X решали проблему Y?». На этот раз это Lyft, который занимается такси и прокатом транспорта, в котором необходимо делать кучу прогнозов. Под прогнозами подразумевается — расчет цены, антифрод, время ожидания, определение водителя на поездку. Из-за требований по перфомансу, в компании столкнулись с двумя проблемами: Data Plane pressure (нетворк, cpu и так далее) и Control Plane complexity (деплой, ролбеки, версионирование, совместимость и так далее). При этом, расчеты проводились в одном монолите, из-за чего решением стала распределенная система.

В начале статьи рассказывается о структуре системы, которая получилась и что каждый компонент делает. Кроме этого затрагивается работа синхронных запросов и работы кастомного ml кода. После описываются подходы к ownership и изоляции сервисов. Дальше рассказывается о генераторе конфигов, который собирает необходимую информацию под сервис и как происходит самотестирование. В конце найдете описание жизненного цикла запроса связанного с прогнозами.

#how_it_works #ml

—————————————

GraphQL Federation Isn’t Just an API Problem — It’s an Organisational One

GraphQL federation — подход, при котором несколько GraphQL схем ститчатся в одну схему и клиенты работают с одним гейтвеем, вместо вызова разных эндпоинтов. На бумаге выглядит красиво, на деле — детали убивают идею в ноль. Статья выше от автора, который разочаровался в GraphQL federation, хотя сначала думал, что подход поможет скрыть от клиентов сложность, перенеся ее на сторону бекенда. Но в реальности, началась путаница с сущностями и отношениями между ними, что увеличило когнитивную нагрузку. Дальше автор приходит к мысли, что объединяя схемы, за которые отвечают разные команды, в одну общую — понимание что происходит теряется окончательно. В конце найдете три совета: воспринимать GraphQL как язык запросов, а не как к API, принимать сложность модели данных, а не скрывать ее и стоит помнить, что GraphQL federation объединяет не только технические сервисы, но и людей между собой.


#graphQL

—————————————

Kafka без дисков: плюсы и минусы KIP‑1150 \(Diskless Topics\)

Изначально статья описывает новую фичу кафки — KIP‑1150, в которой брокер может писать сообщения сразу в облачные хранилища (например в s3), а не на диск брокера. Благодаря чему экономятся деньги и помогает с масштабированием в облаке. Из минусов — увеличивается latency и добавляет точку отказа.

Дальше автор описывает в деталях, как должна новая фича работать и какие плюсы будут (кроме цены и скейлинга упоминается гео-репликация и гибкость решения). Минусы тоже описываются подробнее — решение не поможет с global ordering для всех партиций.

Отдельно рекомендую посмотреть комментарии, где появляется разработчик кафки и отвечает на вопросы: фичу стоит ждать в течении трех лет, когда подойдет решение, а когда нет (если задержка в секунду ок — стоит подумать), порядок задержек и что с горизонтальным масштабированием. И попутно, посмотрите обсуждение о том, возможно ли отказаться от партишенов и лидеров и полностью переехать на s3.

#kafka
Пятничное чтиво

Буду рад предложениям, вопросам и идеям связанным с каналом или архитектурными/техническими вопросами. Можно написать в личку, а можно анонимно. А ответы на вопросы можно прочитать на сайте.

—————————————

Shopify Tech Stack

Очередная статья о том, как решались технические проблемы в крупных компаниях. На этот раз это shopify (saas платформа для создания магазинов) и то, как устроен технический стек в компании.

Изначально бекенд написали на рельсе, который в компании продолжают развивать (нанимая кор разработчиков и создавая инструментарий). При этом, бекенд — модульный монолит, а в тексте найдете как модули работают и взаимодействуют между собой. После описывается стек для фронтенда (react + graphQL) и мобилки (react native). Также присутствует секция с dev tools, которые были созданы и используются в компании. Во второй части статьи описывается как в компании работают с базами данных: как primary используется MySQL. Так же найдете упоминание redis, memcached и kafka. Кроме этого, описывается ML стек: как работает и из чего состоит. Последняя часть текста связана с DevOps, обсервабилити и SRE в компании.

Каких-то хардкорных деталей или объяснений работы вы в тексте не найдете. Но для насмотренности текст сойдет.

#how_it_works

—————————————

Enough With The Rainbow Tables

Выбирая между перфомансом кода и остальным — логично выбирать перфоманс. На деле, выбор, зависит от контекста. Особенно, когда дело касается криптографии и безопасности. Чтобы разобраться в проблеме, откопал статью от 2007 года, которая осталась только в веб архиве.

Может показаться, что статья только о «rainbow tables». Но советую читать с момента объяснения, почему md5 так себе вариант для хеширования паролей. И проблема тут в перфомансе алгоритма хеширования. Дальше объясняется как работает incremental crackers: берем слитый список хешей из бд, берем список потенциальных паролей. Хешируем потенциальные пароли, ищем в слитом списке хешей и тем самым определяем, что за пароль прячется за хешом.

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

#security

—————————————

PostgreSQL JSONB

Уверен, что за 10+ лет, хранением данных в jsonb воспользовались все, кто можно. Но если нет — статья выше поможет разобраться в концепции и объяснит базовые принципы работы с документо-ориентированными данными в постгресе. Если умеете работать с jsonb — статья ничего нового не расскажет.

В самом начале автор описывает отличие между json и jsonb (jsonb — использует binary representation для улучшения индексации и поиска). Далее рассказывается как jsonb работает «под капотом». Тут найдете отссылки на иерархические деревья и токенизацию. Благодаря чему не надо парсить документ целиком для получения данных, а токенизация помогает хранить не только значение, но тип данных. В следующей части показывается как с jsonb работать разработчику. Для этого создается структура customer с вложенными полями и показано как сохранять данные с разным наполнением данных и их извлекать.

Во второй части описываются индексы, которые применяются к jsonb полю. Найдете описание работы b-tree и GIN (как создать, как работает и с чем поможет). Попутно описывается работа partial indexes (это когда индексируются записи по какому-то условию). В конце описывается работа unique constraints, json path queries, агрегацию разрозненных данных и как «смешивать» реляционную и документо-ориентированную модель.

#psql
2025/06/29 18:50:18
Back to Top
HTML Embed Code: