Канал Андрея про бекенд
👨🏻🎓 Я Андрей Суховицкий - tech lead и лектор Университета ИТМО, @sukhoa 🔥 Темы в канале: kotlin, java, coroutines, многопоточное программирование, system design, реализация высоконагруженных и надежных систем. ⏳ Посты по средам Присоединяйтесь!
Графики
📊 Средний охват постов
📉 ERR % по дням
📋 Публикации по дням
📎 Типы контента
Лучшие публикации
20 из 20Ждать вечно не лучший выбор ☠️ Помните задачку про перевод денег с одного аккаунта на другой? Одно из проблемных мест там - возможность взаимной блокировки (deadlock), когда первый поток выполняет перевод с аккаунта с id = 1 на аккаунт с id = 2, а второй поток переводит наоборот со второго на первый аккаунт. Соответственно, может возникнуть ситуация захвата ресурса “крест-накрест”. Один поток захватил блокировку на аккаунт 1 и ждет аккаунта 2, второй поток захватил второй аккаунт и ждет первого....
Аналог блокирующей очереди для корутин ⛓ В одном из предыдущих постов мы обсуждали удобство использования блокирующий очереди (интерфейс java.util.concurrent.BlockingQueue), для коммуникации между потоками. Одна группа потоков помещают данные в хвост очереди, другая группа получает данные из ее головы. Почему бы нам не использовать такую же очередь для общения корутин друг с другом? 🏈 Дело в том, что операции BlockingQueue могут заблокировать поток исполнения: - Получение элемент...
Ответ 20 на предыдущий опрос может быть не очевидным с первого взгляда. Мы получаем его, воспользовшись законом Амдала 🧶 Итак, в этом посте будем вычислять ответ ответ, опираясь только на теорию. 🎯 Нам нужно увеличить пропускную способность в 10 раз (с 10 операций в секунду до 100). Кажется, что, если один поток может выполнять 10 операций в секунду, то нам нужно увеличить количество потоков пропорционально, до 10. 🔩 Однако, в данной задаче есть нюанс, который делает рост производительности н...
🚰 Разбавлю немного череду постов про метрики. 💪 Может быть, вам будет интересно посмотреть доклад Андрея Паньгина о своем детище: профайлере для JVM-based приложений Async-profiler. 🔥 Это не какой-то пет-проект, это развитый тул с большим количеством пользователей. Он много раз помогал нашей команде находить узкие места в рабочих проектах. Дополнительный плюс в том, что async-profiler потребляет сравнительно немного ресурсов. В общем, крутая штука
Батчинг (пакетная обработка). Часть 2. 🌐 Аналогично батчинг применяют для уменьшения сетевых расходов при HTTP взаимодействии (aka REST API). Проектируя свои сервисы и имея высокие требования по пропускной способности/времени отклика, вы можете предусмотреть использование батчинга. Скажем, у вас есть API для обновления статуса заказа по его id: POST /orders/{orderId}/status Content-Type: application/json { "status": "delivered", "timestamp": "2021-08-01T00:00:00Z" } 🌪 Давайте изменим API таким...
⬆️ В прошлом посте мы с помощью закона Амдала выясняли, сколько нужно потоков, чтобы ускорить наш код в 10 раз. Полученный ответ, 20 потоков, занял второе место в нашем опросе, но все еще может казаться довольно удивительным. 🧑💻 Как и обещал, я провел небольшой эксперимент для проверки теоретических расчетов и постарался найти объяснение полученным на практике результатам. Подробнее об этом, а также о выводах и практических рекомендациях читайте по ссылке
🟢 Metrics basics - часть 3 🔼 В прошлом посте под вторым пунктом плана значилось "Данные с каждого инстанса помещаются в некое хранилище". ❓ Но как именно метрики "помещаются" в хранилище? Есть два основных пути, по которому идут разработчики: 1️⃣ Клиент (ваш сервис, с которого вы хотите собирать метрики) устанавливает соединение с хранилищем и отправляет ему собранные данные. 2️⃣ Сервис выстявляет (expose) наружу API, с помощью которого можно получить собранные на текущий момент данные, а хран...
Последний пост из серии "как ускорить функцию task" 😁 ⬆️ Напоминаю, мы с вами задавались вопросом, сколько потребуется потоков, чтобы в 10 раз ускорить функцию task, где 5% кода выполняется под локом. Вычисленный с помощью закона Амдала ответ в 20 потоков был позже поставлен под сомнение практическими экспериментами. Сегодня ставим точку в этой серии постов. 🧱 Предлагаю немного переработать архитектуру данного нам кода: 1. Выделить один отдельный поток, который будет заниматься исключительно п...
Батчинг (пакетная обработка). Часть 1. 🏛 Ситуация: в моменты повышенной нагрузки время выполнения запросов к БД начинает расти и сказываться на производительности. Профайлер показывает вам, что значительную часть длительности операции занимает ожидание получения JDBC соединения. У вашего приложения уже 20 подключений к базе и больше подключений вам выделять не хотят. Что делать? 🏕 Осознаем природу проблемы: 🎼 Паттерн работы с JDBC подключением следующий 1. Запрашиваем свободное подключение из...