Всем привет! Решил запустить канал по .NET-разработке. Зачем мне это нужно? В процессе работы появляются удачные решения, которыми хочется поделиться, упаковать их в удобный формат и, возможно, обсудить дополнительно. Часто задают одни и те же вопросы, ответы на которые можно заранее тщательно подготовить, подробно расписать и затем просто давать на них ссылку.
Что здесь будет? Удачные практики, хорошо показавшие себя в коммерческих проектах, а также неудачные кейсы с описанием проблем и их последствий. Интересные теоретические моменты которыми я хотел бы поделиться. Возможно, немного лайф-контента — красивые фотографии из путешествий, чтобы разбавить текстовые посты.
Что здесь будет? Удачные практики, хорошо показавшие себя в коммерческих проектах, а также неудачные кейсы с описанием проблем и их последствий. Интересные теоретические моменты которыми я хотел бы поделиться. Возможно, немного лайф-контента — красивые фотографии из путешествий, чтобы разбавить текстовые посты.
🔥3👍1
Кастомизация Visual Studio с помощью расширений
В своих проектах я стараюсь использовать sealed классы. Во-первых, я стремлюсь не применять наследование классов и sealed классы дополнительно указывают на это. Во-вторых, sealed классы могут немного повысить производительность.
Для новых классов я создал шаблон (class template) для Visual Studio. Возможно, об этом я напишу в одном из следующих постов. Для уже существующего кода мне требовалось решение для подсветки и автоматической замены на sealed. Я не нашёл способа настроить .editorconfig для этой задачи, поэтому решил создать собственный плагин для Visual Studio. К тому же у меня не было подобного опыта.
На создание плагина у меня ушло несколько часов — я ориентировался на статью How to write a Roslyn analyzer, а также использовал GitHub Copilot. Затем около часа потребовалось на регистрацию и публикацию расширения в маркетплейсе. О том, как это сделать, можно прочесть в статье Walkthrough: Publishing a Visual Studio Extension.
В целом, создавать собственные расширения для Visual Studio оказалось не так сложно. Исходный код моего расширения можно найти в репозитории GitHub. У меня есть ещё много идей для будущих расширений. Для более глубокого погружения рекомендую книгу Visual Studio Extensibility Development автора Rishabh Verma.
В своих проектах я стараюсь использовать sealed классы. Во-первых, я стремлюсь не применять наследование классов и sealed классы дополнительно указывают на это. Во-вторых, sealed классы могут немного повысить производительность.
Для новых классов я создал шаблон (class template) для Visual Studio. Возможно, об этом я напишу в одном из следующих постов. Для уже существующего кода мне требовалось решение для подсветки и автоматической замены на sealed. Я не нашёл способа настроить .editorconfig для этой задачи, поэтому решил создать собственный плагин для Visual Studio. К тому же у меня не было подобного опыта.
На создание плагина у меня ушло несколько часов — я ориентировался на статью How to write a Roslyn analyzer, а также использовал GitHub Copilot. Затем около часа потребовалось на регистрацию и публикацию расширения в маркетплейсе. О том, как это сделать, можно прочесть в статье Walkthrough: Publishing a Visual Studio Extension.
В целом, создавать собственные расширения для Visual Studio оказалось не так сложно. Исходный код моего расширения можно найти в репозитории GitHub. У меня есть ещё много идей для будущих расширений. Для более глубокого погружения рекомендую книгу Visual Studio Extensibility Development автора Rishabh Verma.
Моя одна из любимых тем — это создание надёжных и отказоустойчивых приложений, поэтому я не мог не поделиться этим видео Антология технологий Яндекс Такси. Надёжность сервиса.
Основные моменты для разработчиков:
Изоляция точек отказа (1:53) — по этой теме я в ближайшее время напишу отдельный пост. Думаю, я ещё неоднократно буду освещать этот вопрос.
Фолбэк (13:15) и Деградация (14:14) — позволяет отключать дополнительные сервисы, чтобы снизить нагрузку на систему.
Дополнительная нагрузка "виртуальными заказами" прямо на проде (7:25) — казалось бы, мы тестируем систему в реальном окружении и можем её «положить», но, в отличие от реальных заказов, виртуальные заказы можно быстро отключить для восстановления нормальной работы.
Очень крутая практика — симуляция инцидентов (9:44) и тренировка навыков их решения. Она также позволяет понять, насколько хорошо у нас налажены мониторинг и логирование. В идеале логи и графики должны быть такими, чтобы дежурный специалист из отдела мониторинга, который никогда не видел наш код, смог понять логи и при необходимости отключить сломанный сервис, а также предпринять другие меры.
Основные моменты для разработчиков:
Изоляция точек отказа (1:53) — по этой теме я в ближайшее время напишу отдельный пост. Думаю, я ещё неоднократно буду освещать этот вопрос.
Фолбэк (13:15) и Деградация (14:14) — позволяет отключать дополнительные сервисы, чтобы снизить нагрузку на систему.
Дополнительная нагрузка "виртуальными заказами" прямо на проде (7:25) — казалось бы, мы тестируем систему в реальном окружении и можем её «положить», но, в отличие от реальных заказов, виртуальные заказы можно быстро отключить для восстановления нормальной работы.
Очень крутая практика — симуляция инцидентов (9:44) и тренировка навыков их решения. Она также позволяет понять, насколько хорошо у нас налажены мониторинг и логирование. В идеале логи и графики должны быть такими, чтобы дежурный специалист из отдела мониторинга, который никогда не видел наш код, смог понять логи и при необходимости отключить сломанный сервис, а также предпринять другие меры.
YouTube
Антология технологий Яндекс Такси. Надёжность сервиса
В новой серии «Антологии технологий» рассказываем про отказоустойчивость — основное свойство системы такси, которое позволяет приложению работать 24/7.
Как сделать так, чтобы сервис справлялся с любыми нагрузками даже в праздники? Для этого есть множество…
Как сделать так, чтобы сервис справлялся с любыми нагрузками даже в праздники? Для этого есть множество…
👍2
Вот и завершился мой отпуск... Это была моя вторая поездка в Майами (впервые я побывал здесь в 2022 году) и пока для меня это самое комфортное место для отдыха. В этот раз я впервые посетил Ки-Уэст — самую южную точку США. Остался под большим впечатлением и обязательно сюда вернусь.
🔥4👍1
Как и обещал в предыдущем посте, продолжаем обсуждать отказоустойчивость и надежность приложения.
При разработке важно выделить ключевой и второстепенный функционал. Основная идея - дать пользователю возможность продолжать пользоваться нашим приложением, даже если наблюдаются проблемы с второстепенным функционалом.
Сегодня обсудим ситуацию с отказом внешнего сервиса (или наш микросервис к которому мы обращаемся например по REST).
Потенциально, любой внешний сервис - это точка отказа, и мы должны корректно обработать его сбой или недоступность.
Рассмотрим небольшой пример с интернет-магазином. Ключевая функциональность в данном случае - чтобы пользователь смог найти нужный товар и оформить заказ. Существуют также второстепенные фичи, которыми можно пренебречь при деградации сервисов. Главное - чтобы их неисправность не влияла на ключевой функционал. В нашем примере к таким второстепенным функциям можно отнести рекомендации товаров, новости магазина, полезные статьи.
Допустим, в нашем бэкенде есть endpoint возвращающий список рекомендуемых товаров фронтенду по ID пользователя. Это не ключевая функциональность. Для упрощения примера, в бизнес-логике мы просто вызываем внешний REST-сервис, который и становится точкой отказа.
Если не предпринять никаких мер, то при сбое внешнего сервиса или при отправке им некорректных данных могут возникнуть неприятные сценарии для пользователя, например «белый экран» из-за сломанного JS и невозможность оформить заказ.
Чтобы избежать таких ситуаций, делаем следующее:
1. Оборачиваем вызов сервиса в try-catch.
2. Устанавливаем минимальный таймаут. Из-за деградации второстепенного сервиса пользователь не должен долго ждать загрузки ключевого функционала.
3. Делаем возможность отключения вызова сервиса «на горячую» через appsettings.json с помощью IOptionsMonitor.
Например, если мы понимаем, что сервис стал долго отвечать или отправлять некорректные данные, мы можем вручную отключить его вызов, не дожидаясь срабатывания таймаута. Здесь можно применить шаблон «размыкания цепи» (circuit breaker), например, с помощью библиотеки Polly, но возможность ручного отключения должна быть сохранена.
Таким образом, при выбросе исключения, срабатывании таймаута или ручном отключении вызова мы возвращаем пустой список рекомендаций вместо ошибки.
На фронте мы ожидаем такой сценарий и просто скрываем блок «Рекомендации».
При разработке важно выделить ключевой и второстепенный функционал. Основная идея - дать пользователю возможность продолжать пользоваться нашим приложением, даже если наблюдаются проблемы с второстепенным функционалом.
Сегодня обсудим ситуацию с отказом внешнего сервиса (или наш микросервис к которому мы обращаемся например по REST).
Потенциально, любой внешний сервис - это точка отказа, и мы должны корректно обработать его сбой или недоступность.
Рассмотрим небольшой пример с интернет-магазином. Ключевая функциональность в данном случае - чтобы пользователь смог найти нужный товар и оформить заказ. Существуют также второстепенные фичи, которыми можно пренебречь при деградации сервисов. Главное - чтобы их неисправность не влияла на ключевой функционал. В нашем примере к таким второстепенным функциям можно отнести рекомендации товаров, новости магазина, полезные статьи.
Допустим, в нашем бэкенде есть endpoint возвращающий список рекомендуемых товаров фронтенду по ID пользователя. Это не ключевая функциональность. Для упрощения примера, в бизнес-логике мы просто вызываем внешний REST-сервис, который и становится точкой отказа.
Если не предпринять никаких мер, то при сбое внешнего сервиса или при отправке им некорректных данных могут возникнуть неприятные сценарии для пользователя, например «белый экран» из-за сломанного JS и невозможность оформить заказ.
Чтобы избежать таких ситуаций, делаем следующее:
1. Оборачиваем вызов сервиса в try-catch.
2. Устанавливаем минимальный таймаут. Из-за деградации второстепенного сервиса пользователь не должен долго ждать загрузки ключевого функционала.
3. Делаем возможность отключения вызова сервиса «на горячую» через appsettings.json с помощью IOptionsMonitor.
Например, если мы понимаем, что сервис стал долго отвечать или отправлять некорректные данные, мы можем вручную отключить его вызов, не дожидаясь срабатывания таймаута. Здесь можно применить шаблон «размыкания цепи» (circuit breaker), например, с помощью библиотеки Polly, но возможность ручного отключения должна быть сохранена.
Таким образом, при выбросе исключения, срабатывании таймаута или ручном отключении вызова мы возвращаем пустой список рекомендаций вместо ошибки.
На фронте мы ожидаем такой сценарий и просто скрываем блок «Рекомендации».
👍5🔥4
DotNet developer blog C# | .Net
Как и обещал в предыдущем посте, продолжаем обсуждать отказоустойчивость и надежность приложения. При разработке важно выделить ключевой и второстепенный функционал. Основная идея - дать пользователю возможность продолжать пользоваться нашим приложением,…
Опубликовал этот пост на английском в LinkedIn. Также включил возможность комментировать в канале. К сожалению, к предыдущим постам комментарии недоступны, но думаю, что обсудить их можно и в этом посте.
👍6