🍏 Модель зрелости. 🍎
Недавно у нас во внутреннем канале в яблочке задали вопрос: "Я делаю свою пет-проекты. Как понять, что мой сервис нормальный? Что я все сделал хорошо и могу быть в нем уверен?"
На самом деле этот класс вопросов возникает в разных местах. К примеру, когда вы становитесь техлидом: "Нормальный ли я техлид? Хорошо слежу за командами или что-то очевидное упускаю?" Ну или просто вы работяга-разраб: "Я все делаю норм? Или говно какое-то коммичу?"
Так вот, во многих подобных ситуациях вам поможет такой инструмент как ”модель зрелости". Это такая штука, которая по сути напоминает дерево прокачки персонажа в играх, ну и работает почти таже, только без скилл-поинтов, а по наитию.
Одну из таких моделей вы точно знаете и используете каждый день – это стандартная градация уровня скилла разработчика Junior Middle Senior. Она довольно размытая, и у каждого своя, но по сути это тоже модель зрелости.
Модель зрелости может помочь не только неуверенным в себе пирожкам типа меня, но и сверхуверенным в себе редискам избежать ситуации, когда ты думаешь, что все у тебя заебись, а на самом деле ты на нулевом уровне какой-то модели зрелости и даже половину инструментов в своей области не освоил.
🅰️ Итого: Если хотите понять, все ли у вас круто в определенной области, ищите в ней модель зрелости и проводите самопроверку по ней. Ну и помните, что модели – это не отражение реального мира, а описание некоторой его части, так что не натягивайте сову на глобус.
Ну и напоследок поделюсь своими любимыми моделями зрелости:
1️⃣ Spotify Squad Health Check model – классная моделька, заслуживающая отдельного поста.
2️⃣ Test Maturity Model – может не самая лучшая. В тестировании их много, но вот эта у меня в голове крутится уже давно.
3️⃣ REST – Модель зрелости дизайна API. об этой узнал недавно, и в общем, она дала хорошую пищу для размышлений. Понял, что многие штуки в коде я бы мог делать лучше.
Если у вас тоже есть какие-то любимые модели зрелости. Или может вы придумали свои, то заделитесь)
Недавно у нас во внутреннем канале в яблочке задали вопрос: "Я делаю свою пет-проекты. Как понять, что мой сервис нормальный? Что я все сделал хорошо и могу быть в нем уверен?"
На самом деле этот класс вопросов возникает в разных местах. К примеру, когда вы становитесь техлидом: "Нормальный ли я техлид? Хорошо слежу за командами или что-то очевидное упускаю?" Ну или просто вы работяга-разраб: "Я все делаю норм? Или говно какое-то коммичу?"
Так вот, во многих подобных ситуациях вам поможет такой инструмент как ”модель зрелости". Это такая штука, которая по сути напоминает дерево прокачки персонажа в играх, ну и работает почти таже, только без скилл-поинтов, а по наитию.
Одну из таких моделей вы точно знаете и используете каждый день – это стандартная градация уровня скилла разработчика Junior Middle Senior. Она довольно размытая, и у каждого своя, но по сути это тоже модель зрелости.
Модель зрелости может помочь не только неуверенным в себе пирожкам типа меня, но и сверхуверенным в себе редискам избежать ситуации, когда ты думаешь, что все у тебя заебись, а на самом деле ты на нулевом уровне какой-то модели зрелости и даже половину инструментов в своей области не освоил.
🅰️ Итого: Если хотите понять, все ли у вас круто в определенной области, ищите в ней модель зрелости и проводите самопроверку по ней. Ну и помните, что модели – это не отражение реального мира, а описание некоторой его части, так что не натягивайте сову на глобус.
Ну и напоследок поделюсь своими любимыми моделями зрелости:
1️⃣ Spotify Squad Health Check model – классная моделька, заслуживающая отдельного поста.
2️⃣ Test Maturity Model – может не самая лучшая. В тестировании их много, но вот эта у меня в голове крутится уже давно.
3️⃣ REST – Модель зрелости дизайна API. об этой узнал недавно, и в общем, она дала хорошую пищу для размышлений. Понял, что многие штуки в коде я бы мог делать лучше.
Если у вас тоже есть какие-то любимые модели зрелости. Или может вы придумали свои, то заделитесь)
Spotify Engineering
Squad Health Check model – visualizing what to improve
Squad Health Check model - visualizing what to improve - Spotify Engineering
👍4😎4❤2🔥1🍾1👻1
Всегда полезно иметь какую-то штуку, которая обладает высокой доступностью и может чекнуть ваш сайт на жизнеспособность. Сегодня открыл для себя StatusCake.
Короче, полезна в кейсах, когда вам надо супер-верхнеуровнево чекнуть, что ваш сайт работает. Типа через все ВПНы, НАТы и прочие сетевые прикольчики.
Это не заменяет мониторинг, конечно, но хорошо его дополняет. Потому что мониторинг – это про внутренние детали по большей степени, а вот эта тулза больше про то как все смотрится с внешней стороны.
Ну то есть мониторинг может гореть, как сентябрь, а статус-кейк будет такой "It's fine". И наоборот – в мониторинге штиль, а статус-кейк будет орать, что все плохо, потому что какому-то надзору захотелось вас похарасить.
🅰️ Итого: Если вам нужно регулярно проверять достпуность вашего проекта из разных стран, то посмотрите на StatusCake. Он первым выстрелит, если у вас все работает, но по какой-то причине никто не может зайти только из какой-то одной страны.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3😁3❤1
Короче, кажется, что пришла моя пора старчески гундеть. Я сопротивляюсь, но гундю. Вышли minimal API и я бесился с того, что ничего нового не добавили, просто сделали по-другому.
Тут должно было выйти пять постов про то какое же это никому не нужное говно.
Но я сдержался. И кажется, что не зря.
Вот тут мне кажется мужик классно рассказывает, что к чему. Но и я тоже свои пять копеек вставлю.
В общем. Сколько лет назад они вышли? Три года почти. Тогда Ник Чапсас рекламировал эту фичу тем, что теперь проект с нуля можно написать в три строчки.
Ну как бы круто, но тогда мне казалось, но резон сомнительный.
В общем, майки переосмыслили эту ситуацию и сфокусировались при создании Minimal API на создании хорошо документируемых и быстро разрабатываемых API.
🅰️ Что это значит на практике.
Мне такое объяснение показалось наиболее осмысленным. Но я тут готов если что к дополнительным пояснениям.
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Choosing between MVC Controllers, Minimal API, or FastEndpoints for C# APIs.
Not sure whether your .NET API should use MVC, minimal API, or something else? Let's talk about the pro's and con's of each and compare them with Fast Endpoints as another alternative.
Don't forget to comment, like and subscribe 🚀
💬 JOIN US ON DISCORD …
Don't forget to comment, like and subscribe 🚀
💬 JOIN US ON DISCORD …
👍4🙏3🤔1👾1
Вот уже почти четыре года так или иначе участвую в организации внутренней мини-конфы в Додо под названием Девфорум.
Это такая встреча, где любой человек из компании может заделиться своими знаниями с разработкой. Критериев отбора мало, цензуры нет. Главное – это практическая польза для разработки или для процессов разработки. Как итог, ребята приносят просто охреневительнейшие доклады, информация шарится, процессы и качество улучшается.
Ведем все это мы со Степой Гранкиным и Севой Паршиным в свободное от кода время.
Давней моей мечтой было попробовать сделать девфорум открытым, но для этого то времени не хвататло, то просто было не понятно, как это организовать. В этом году нам со Степой и Севой подоспела поддержка с воздуха в лице Макса Политова и его команды публичных коммуникаций и вот пилотный публичный DevForum уже через 20 минут!
🅰️ Итого: Подключайтесь к трансляции, посмотрите на нашу внутреннюю кухню) Без купюр, возможны маты и неприлично содержательный контент.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥4😱3🔥1
Короче, пока свыкаюсь с новой ролью Engineering Manager'a и временно поставил постинг матерных постов сюда на паузу.
Прилег под нагрузкой, так сказать. Хотя блин, много заметок, которыми хочется поделиться. Но пока что!
Не могу не прорекламировать канал yet another dev, в котором постится топовый контент по шарпу, и при этом там всего 27 подписчков.
Мое знакомство с этим каналом началось с поста на хабре Правило 16 байт: развенчиваем миф о производительности структур в C#
В общем автор делает там несколько бенчмарков, и приходит к выводу, что сейчас рекомендуемым размером для структур является 64 байта, ну и почему именно такой размер.
В общем, автор канала, как и я не парится с пиаром и не часто постит, но старается постить какой-то свой контент, который, как мне кажется, ну достоин внимания. К примеру сегодня вот вышел пост про новые params в C# 13.
Ну и еще несколько пиздатых канальчиков вам, вдруг вы не знали:
C# Heppard – канал про перфоманс и работу с памятью в дотнете от Кирилла Бажайкина
И канал Евгения Пешкова, ну это оч крутой специалист, который не нуждается в представлении. Завсегдатай дотнекстов, и вообще одна из центральных фигур этой конфы.
Все пишут достаточно живо и от чистого сердца, с эмоциями и вот этим всем. Короч, непрошенная реклама случилась.
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
yet another dev
Самый скучный канал про разработку
🔥5❤3🫡2👍1
Media is too big
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6🔥5💯3👍1😭1
Периодически приглашаем на DevForum в Додо ребят из других компаний. У спикеров есть возможность рассказать что-то нам, а у нас есть возможность спросить что-то у них. Сложно посчитать пользу от такого действия, как в принципе пользу от конференций, обучения и прочего нетворкинга.
На мой субъективный взгляд это порой помогает просто посмотреть на то как у других и получить вдохновение для решения своих задач.
Соответственно, чем чаще проводите девфорумы, тем больше вероятность такого озарения в коллективе. Чем больше озарений, тем больше крутых идей, которые развивают бизнес.
Сегодня у нас как раз девфорум с приглашенным гостем Валерием Никтиным, которого вы могли видеть тут в комментариях.
🅰️ Итого: Приходите глянуть в 16:00 МСК, у Валеры есть стремительно растущий канал с анонсом предстоящего девфорума и всяким про разработку и жизнь марафонца-футболлиста)))
UPD: полумарафонца-футболлиста!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4🙏3😎3🤝2👍1
Forwarded from Я тут подумал…
Доклады.
Когда искал одно, а нашел другое (или как-то так звучала глава в «Хоббит, туда и обратно»)
После моего поста про то, что меня не взяли на дотнекст, мне написал Степа Гранкин, с предложением выступить на DevForum в DoDo.
Это внутренне-внешнее мероприятие, раньше оно проходил исключительно внутри DoDo.
В моем Дексисе, тоже есть аналогичная тема и мы тоже шарим(если доклад не под nda) Прокачку наружу.
Тогда вы спросите - в чем мой интерес участия в DevForum?
Их несколько:
- чем чаще выступаешь, тем это получается лучше и лучше - лишняя практика точно не будет лишней.
- тут можно было толкнуть тему про личный бренд, но я не транслирую эту тему, поэтому перейдем дальше.
- новая аудитория и новый опыт, но этот пункт вытекает из первого.
А для тех, кто хочет меня поддержать - welcome вот сюда https://www.youtube.com/live/ofhdEWgFy7g в 16:00 по МСК
Когда искал одно, а нашел другое (или как-то так звучала глава в «Хоббит, туда и обратно»)
После моего поста про то, что меня не взяли на дотнекст, мне написал Степа Гранкин, с предложением выступить на DevForum в DoDo.
Это внутренне-внешнее мероприятие, раньше оно проходил исключительно внутри DoDo.
В моем Дексисе, тоже есть аналогичная тема и мы тоже шарим
Тогда вы спросите - в чем мой интерес участия в DevForum?
Их несколько:
- чем чаще выступаешь, тем это получается лучше и лучше - лишняя практика точно не будет лишней.
- тут можно было толкнуть тему про личный бренд, но я не транслирую эту тему, поэтому перейдем дальше.
- новая аудитория и новый опыт, но этот пункт вытекает из первого.
А для тех, кто хочет меня поддержать - welcome вот сюда https://www.youtube.com/live/ofhdEWgFy7g в 16:00 по МСК
YouTube
DevForum 20.06.2024. Валерий Никитин. «Как похудеть, съедая TCP-пакеты»
Вместе с Валерием Никитиным, приглашенным спикером из компании DexSys, поговорим:
– о предметной области, в которой работает продукт DexBee
– кратко пройдемся по базовым вещам, на которых основана техническая часть
– рассмотрим техническую реализацию TCP…
– о предметной области, в которой работает продукт DexBee
– кратко пройдемся по базовым вещам, на которых основана техническая часть
– рассмотрим техническую реализацию TCP…
👍4🔥4👏2❤1🍾1
Тут у нас в внутреннем канале написали про то как офигенно коллаба c Геншином повлияла на продажи в Турции. Там с Додо Пиццей мало кто знаком, а вот с аниме-дрочильнями знакомы почти все! Но теперь, все со всеми знакомы и повышают продажи додстеров
А, поскольку ваш покорный слуга имел некоторое отношение к этому делу, то почему бы не рассказать, как оно было.
Что мы там вообще сделали
Короче, мы с ребятами из команды замутили поиск пасхалок в приложении
Я такие игры видел на куче сайтов и мне всегда было интересно, как такие штуки реализуют? Как справляются с нагрузкой? Как на бэке там все реализовано?
Был большой соблазн объединить 1 и 3 пункты, ну типа кликнул по пасхалке первый раз – вот и стартовал. Но в итоге оставили их раздельными и это довольно неплохо упростило тестирование. В старте игры были свои корнер кейсы, а в открытии пасхалок свои.
Тут бывалый взгляд наверняка отметит, что "Ну чуваки SRP – понятно, что так нужно было делать сразу!"
И да, это реально понятно, но в моменте, когда вы обсуждаете удобный контракт для мобилок, которые являются основными потребителями всего этого добра, все это становится не так просто. Потому что для мобилок – чем меньше эндпоинтов дергать и чем меньше разных контрактов поддерживать – тем лучше.
Это вообще было для меня некоторым открытием после веб-разработки. В вебе тебе добавлять-удалять новые эндпоинты – как два пальца
🅰️ Итого Хочется какой-то итог первой части подвести, но для меня он тут в том, что разработка бэка под мобилки может сильно отличаься от разработки бэка под веб. Ибо веб – гибкий, а мобилки супер-неповоротливые. Из-за этого привычные нам принципы разработки могут не подходить под ситуацию и приходится искать компромиссы.
Please open Telegram to view this post
VIEW IN TELEGRAM
Genshin Impact Вики
Куйлейн-Анбар | Genshin Impact Вики | Fandom
Куйлейн-Анбар — помощник в «Священном призыве семерых». Куйлейн-Анбар не появляется ни в одном из уровней.
❤🔥11🔥4🦄4🙏1
Еще одна вещь, которая стала для меня важной в этой задаче и может вам будет полезной.
Я этого не сделал, и нашему тестировщику Дане пришлось пострадать с тем, чтобы постоянно лазить в базу, чтобы подправить время во всех таблицах, чтобы имитировать первый день акции и последний. Ну а мне было чуть сложнее писать автотесты, потому что приходилось писать чуть более сложные моки.
🅰️ Кстати, рекомендую во всей времязависимой логике юзать эту штуку!
Юзается просто
public class MyService
{
private readonly TimeProvider _timeProvider;
public MyService(TimeProvider timeProvider)
{
_timeProvider = timeProvider ?? throw new ArgumentNullException(nameof(timeProvider));
}
public DateTimeOffset GetCurrentTime()
{
return _timeProvider.GetUtcNow();
}
}
А мокается потом изично, потому что класс абстрактный. Я вот заиспользовал, и был доволен, потому, что раньше для тестов нужно было городить свои городульки, а тут на тебе – все готово! 🪢
Please open Telegram to view this post
VIEW IN TELEGRAM
Nimblepros
.NET 8 Finally Gives Us A Time Abstraction - TimeProvider
🔥11👍4🙏2🫡1
Еще одна вещица, про которую хочу рассказать. Это про то что я наконец пощупал на этом проекте монгу.
Надеюсь получится донести эту мысль, но мне она кажется крутой в плане того, как это можно встроить в свой вижен по архитектуре систем.
Представьте себе такой домен, в котором:
1️⃣ Логика и хранимые данные часто меняются – добавляются новые таблицы, в самих структурах могут добавляться новые поля.
2️⃣ К примеру это какие-то временные акции, конкурсы итп.
3️⃣ Хранить такие данные нужно ограниченное время (год-два максимум, но может и больше).
А еще данные по каждому пользователю слабосвязанные и вам не нужны селекты через несколько таблиц
В общем, если это делать на реляционных базах данных то это будет чуть неудобно (ну может даже пиздец как неудобно), ибо миграции, и вот это все. А вот на монге это оказывается можно довольно удобно замутить!
У нас это реализовано вот как:
public class OperationalData<T>
{
string ShardKey {get; set;}
T Payload {get; set;}
int LifeTime {get; set;}
}
public class PromotionStatus
{
string UserName {get; set;}
Promotion CurrentPromotionType {get; set;}
DateTime NextPromotion {get; set;}
}
public class Discount
{
Guid Id {get; set;}
DateTime AvailableFrom {get; set;}
DateTime AvailableTo {get; set;}
}
И вот в такой приятной хранилке ты можешь делать вот такие штуки:
var userPromotionStatus = db.Collection.Find(x => x.ShardKey == $"PromotionStatus_{UserId}").ToPromotionStatus();
var userDiscount = db.Collection.Find(x => x.ShardKey == $"Discount_{UserId}").ToDiscount();
Я это очень удобно заюзал. Правда мне вот это как раз стрельнуло в ногу чутка.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3❤🔥2👍1
Посмотрел на эту картинку, и такой: “Да ну!” А потом присмотрелся и осознал, что все-таки, “Ну да”.
Там прям реально все все кейсы прописаны и задачи комьюнити и встречи с другой команды.
Я пол часа пыхтел, пытаясь выдумать кейс, который бы не попадал в эту табличку и потерпел глубочайший крахЪ
Завтра точно буду юзать🙏
Там прям реально все все кейсы прописаны и задачи комьюнити и встречи с другой команды.
Я пол часа пыхтел, пытаясь выдумать кейс, который бы не попадал в эту табличку и потерпел глубочайший крахЪ
Завтра точно буду юзать
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
Не так давно прочитал книгу ✅ Высокопроизводительный код на .Net. И теперь осознал, что память не бесконечная и тратится очень быстро с каждым вызовом new. В мученических своих поисках о том как этого всего избегать, наткнулся на прикольный класс ObjectPool.
Идея простая:
1️⃣ Создаете сколько-то пустых объектов в памяти заранее
2️⃣ Потом достаете их, заполняетете нужными данными, юзаете это дельце как не в себя
3️⃣ А в конце просто сбрасываете состояние этого объекта к нулю и потом переиспользуете, если нужно.
Долго думал, как же эту крутотень использовать. И что-то никак не мог найти практического применения. А потом чет поскреб по сусекам и осознал, что в кэшах же!
Для примера. Есть самый простой в реализации кэш со словарем в качестве хранилища:
public class ExpensiveObject
{
public int Data { get; set; }
public ExpensiveObject()
{
Data = new Random().Next();
}
}
public class SimpleCache
{
private readonly Dictionary<string, ExpensiveObject> _cache = new Dictionary<string, ExpensiveObject>();
public ExpensiveObject Get(string key)
{
if (!_cache.TryGetValue(key, out var obj))
{
// Если объекта по ключу нет, создаём новый
obj = new ExpensiveObject();
_cache[key] = obj;
}
return obj;
}
}
В чем минус этого кэша. Каждый раз, когда вы добавляете в него новое значение, вы кладете объект в кучу. В этой реализации нет очистки кэша, и это, конечно, может плохо кончиться. Но, даже если добавить очистку, вы все равно будете через какое-то время триггерить сборку мусора, что тоже не очень хорошо.
Поэтому на первый план выходит идея – а что если заранее создать кучу пустых объектов и по очереди их заполнять нужными данными на время использования. Делаем то же самое на ObjectPool.
Сначала добавим немного сервисных штук:
using Microsoft.Extensions.ObjectPool;
public class ExpensiveObject
{
public int Data { get; set; }
public ExpensiveObject()
{
Data = new Random().Next();
}
// Добавляем метод сброса состояния для нашего класса
public void Reset()
{
Data = 0;
}
}
// Создаем политику работы с БАССЕЙНОМ для нашего объекта
public class ExpensiveObjectPooledPolicy : PooledObjectPolicy<ExpensiveObject>
{
// то бишь говорим, как создать
public override ExpensiveObject Create() => new ExpensiveObject();
// и как очистить состояние, после того как поюзали
public override bool Return(ExpensiveObject obj)
{
obj.Reset();
return true;
}
}
В этой части главное – не забыть модифицировать метод Return(ExpensiveObject obj), если добавили новое поле.
Если все сделали, то потом используем в пулле
using Microsoft.Extensions.ObjectPool;
public class OptimizedCache
{
private readonly ObjectPool<ExpensiveObject> _objectPool;
private readonly Dictionary<string, ExpensiveObject> _cache = new Dictionary<string, ExpensiveObject>();
public OptimizedCache(int maximumRetained = 20)
{
var policy = new ExpensiveObjectPooledPolicy();
_objectPool = new DefaultObjectPool<ExpensiveObject>(policy, maximumRetained);
}
public ExpensiveObject Get(string key)
{
if (!_cache.TryGetValue(key, out var obj))
{
obj = _objectPool.Get();
_cache[key] = obj;
}
return obj;
}
// Когда поюзали объект, можем его удалить.
public void Remove(string key)
{
if (_cache.TryGetValue(key, out var obj))
{
_cache.Remove(key);
_objectPool.Return(obj);
}
}
}
Если что, это непотокобезопасная реализация, разумеется, и тут разумеется не поможет конкаррент дикшенари и вот это все. То есть нужно будет чутка заморочиться с синхронизацией. Если кто-то юзает объект прямо сейчас, то нужно это отслеживать и дать чуваку доделать делишки и дождаться пока объект вернется в пул в первозданном виде.
Придется чутка подзаморочитсья. Но идею думаю вы уловили.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥1🔥1
🅰️ Итого: Короче, классный ObjectPool юзайте, экономьте память, кайфуйте. И он вроде не особо сложный для понимания, что очень круто – это не указатели, не какие-то там интринсики и прочее байтоёбство. Простая и понятная штука!
🔥3🤝1
🎱 ObjectPool бенчмарки 1
В комментах Валера Никитин @nvikv попросил бенчмарки, я сегодня посидел, помозговал и сделал вот такую штуку:
1️⃣ Делаем запрос
2️⃣ Кладем в кэш значение
3️⃣ “Пользуемся” этим значением
4️⃣ Удаляем из кэша
Сделал два эндпоинта. Один с простым кэшем, один с пулловым, побомбил💣 это все через k6 примерно 4500 запросов за 20 минуты и вот ожидаемый результат.
В простом кэше managed memory доходила до 84 Мб, потом приходил GC и все собирал. Получилось три сборки мусора за 4500 тысячи запросов
В комментах Валера Никитин @nvikv попросил бенчмарки, я сегодня посидел, помозговал и сделал вот такую штуку:
1️⃣ Делаем запрос
2️⃣ Кладем в кэш значение
3️⃣ “Пользуемся” этим значением
4️⃣ Удаляем из кэша
Сделал два эндпоинта. Один с простым кэшем, один с пулловым, побомбил
В простом кэше managed memory доходила до 84 Мб, потом приходил GC и все собирал. Получилось три сборки мусора за 4500 тысячи запросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1🤝1
ObjectPool бенчмарки 2
Во втором случае, ну набежало 11 Мб и это по сути ASP.NET оверхед, который накопился бы даже если бы мы дергали пустой эндпоинт. В общем, память не раздувалась и это ожидаемый результат.
То есть 0️⃣ сборок мусора за 4500 запросов против 3️⃣!
Пока писал бенчмарк, понял, что так еще круто кэшировать большие объекты, которые тупо затратно создавать каждый раз. Создал заранее много, а потом достаешь уже готовые по необходимости. То есть еще и на создании чуток экономишь.
Вот тут код. Можете посмотреть, как все устроено. Я там для большей показаетльности сделал ExpensiveObject более экспансивным, что он стал весить 80 Кб, и заюзал ConcurrentDictionary чтобы можно было кучу запросов параллельно делать. Но суть примерно та же что и в примере выше.
P.S.: Спасибо большое Валере за идею! Валера получает от меня сотку лайкосов💯 👍
Во втором случае, ну набежало 11 Мб и это по сути ASP.NET оверхед, который накопился бы даже если бы мы дергали пустой эндпоинт. В общем, память не раздувалась и это ожидаемый результат.
То есть 0️⃣ сборок мусора за 4500 запросов против 3️⃣!
Пока писал бенчмарк, понял, что так еще круто кэшировать большие объекты, которые тупо затратно создавать каждый раз. Создал заранее много, а потом достаешь уже готовые по необходимости. То есть еще и на создании чуток экономишь.
Вот тут код. Можете посмотреть, как все устроено. Я там для большей показаетльности сделал ExpensiveObject более экспансивным, что он стал весить 80 Кб, и заюзал ConcurrentDictionary чтобы можно было кучу запросов параллельно делать. Но суть примерно та же что и в примере выше.
P.S.: Спасибо большое Валере за идею! Валера получает от меня сотку лайкосов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤🔥2❤2💯1
Сегодня 14 февраля. И это традиционный день с повышенной нагрузкой в Додо. Для бизнеса это значит много потраченных клиентами деняк
Короче, это славный денек, чтобы добить историю про Геншин, ибо она тоже связана с нагрузкой.
Могу вам однозначно сказать, что разрабатывать коллабу для анимешников очень страшно. Я уже писал, что боюсь школьников. Так вот анимешников я боюсь еще больше, чем школьников. А школьников-анимешников боюсь до усрачки.
И не потому, что ощущаю в них социальную неустроенность. А скорее потому, что они дохуя умные и пронырливые. А еще они сплоченые, когда надо.
Вместе с пиццей шел предмет, который представлял для фанатов особую ценность – кусок прозрачного плексиглаза с впаенной в него картинкой персонажа (на пояснительном дикпике выше
Систему в целом готовили к нагрузкам. Мы вообще много времени на это тратим. Очень много… Но как оказалось недостаточно чтобы сдержать то что шло дальше.
Днем закономерно нам положили систему попытками заказать коллабную пиццу.
Было такое ощущение, как будто ты на экзамен идешь, и перед тобой не сдал самый умный чел на потоке, а ты следующий.
И вот подходит наше время и… За четыре недели ничего такого не случилось и все прошло довольно гладко. Это были нервные 4 недели в которые ничего не произошло.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6❤🔥2🦄2❤1