Российский поисковик - говно.
Советский менталитет все еще говорит нам хейтить самих себя просто за то что мы есть. А на самом деле то что? А вы знаете еще хоть один пример успешной национальной поисковой системы, которая вышла на уровень транснациональной? Десятки национальных поисковиков в каждой стране мира, но в топе (кроме гугла из Америки) только Россия и Китай.
Советский менталитет все еще говорит нам хейтить самих себя просто за то что мы есть. А на самом деле то что? А вы знаете еще хоть один пример успешной национальной поисковой системы, которая вышла на уровень транснациональной? Десятки национальных поисковиков в каждой стране мира, но в топе (кроме гугла из Америки) только Россия и Китай.
MinimalAPI vs Controllers
Тут мужик сравнил быстродействие эндпоинтов с использованием вышеупомянутых подходов по декларированию и обработке API. Почитал, ничего сверхъестественного не получилось в итоге. MinimalAPI примерно на 8% быстрее отрабатывает, и в 1.5 раза меньше выделяет памяти в процессе запроса.
Но у MinimalAPI есть свои минусы перед обычными контроллерами:
1) В первую очередь самый большой минус исходит из самого большого плюса: ПРОСТОТА. Простая декларация имеет сложности в поддержке, при росте и усложнении проекта, соответственно простой API лучше использовать для простых приложений.
2) Из-за своей небольшой распространенности, имеет меньше примеров и не все разработчики смогут с наскока с ним работать.
Тут мужик сравнил быстродействие эндпоинтов с использованием вышеупомянутых подходов по декларированию и обработке API. Почитал, ничего сверхъестественного не получилось в итоге. MinimalAPI примерно на 8% быстрее отрабатывает, и в 1.5 раза меньше выделяет памяти в процессе запроса.
Но у MinimalAPI есть свои минусы перед обычными контроллерами:
1) В первую очередь самый большой минус исходит из самого большого плюса: ПРОСТОТА. Простая декларация имеет сложности в поддержке, при росте и усложнении проекта, соответственно простой API лучше использовать для простых приложений.
2) Из-за своей небольшой распространенности, имеет меньше примеров и не все разработчики смогут с наскока с ним работать.
Steven-Giesel
Comparing the performance between the Minimal API and classic Controllers
Today, we are going to benchmark the performance of the Minimal API in ASP.NET 9 (and for reference against ASP.NET 8 as well) against the classic Controllers. We will test a few scenarios and check how the performance of the Minimal API compares to the classic…
Rate Limiter
А еще, вместо того, чтобы бороться с причинами долгой работы API — можно бороться с его последствиями! Для этого просто ограничим пользователей, чтобы они не могли делать много запросов и тогда мы разгрузим мощности для наших неоптимизированных операций!
Нужно всего лишь добавить NuGet:
И добавить ограничения:
Так мы запрещаем обращаться к нашему апи, если за секунду к нам пришло больше 100 запросов.
Если без шуток, то это правда имеет реальные бенефиты:
* Большое количество запросов может замедлить работу приложения или даже привести к сбоям.
* Помогает остановить атаки методом перебора, ограничивая количество попыток входа в систему или вызовов API.
* Гарантирует справедливое распределение ресурсов API между всеми клиентами.
* Для облачных сервисов с тарификацией за каждый запрос, сокращение количества запросов может помочь снизить расходы.
В этой-же библиотеке есть и более гибкие способы, с линейным распределением и пр., по ограничению запросов (название соответствует политике, подобно Fixed Window Limiting —
1) Token Bucket Limiting — разрешает пакетный трафик путем накопления токенов. Запросы потребляют токены, и когда их не остается — запросы ограничиваются.
2) Sliding Window Limiting — сглаживает распределение запросов, проверяя частоту по скользящему окну вместо фиксированного временного окна.
3) Concurrency Limiting — ограничивает количество одновременных запросов.
Ну и Best Practice:
1) Детализация ограничений: Ограничения в зависимости от клиента, пользователя или IP-адреса. Например, вам могут потребоваться более строгие ограничения для пользователей, не прошедших проверку подлинности, и более мягкие ограничения для доверенных клиентов.
2) Код ответа: При превышении лимитов скорости возвращаются значимые сообщения с кодом состояния
3) Заголовки: Используйте заголовки ограничения скорости
А еще, вместо того, чтобы бороться с причинами долгой работы API — можно бороться с его последствиями! Для этого просто ограничим пользователей, чтобы они не могли делать много запросов и тогда мы разгрузим мощности для наших неоптимизированных операций!
Нужно всего лишь добавить NuGet:
$ dotnet add package Microsoft.AspNetCore.RateLimiting
И добавить ограничения:
builder.Services.AddRateLimiter(options =>
{
options.AddFixedWindowLimiter("HundredPerSecondPolicy", opt =>
{
opt.PermitLimit = 100;
opt.Window = TimeSpan.FromSeconds(1);
opt.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
opt.QueueLimit = 2;
});
});
app.UseRateLimiter();
Так мы запрещаем обращаться к нашему апи, если за секунду к нам пришло больше 100 запросов.
Если без шуток, то это правда имеет реальные бенефиты:
* Большое количество запросов может замедлить работу приложения или даже привести к сбоям.
* Помогает остановить атаки методом перебора, ограничивая количество попыток входа в систему или вызовов API.
* Гарантирует справедливое распределение ресурсов API между всеми клиентами.
* Для облачных сервисов с тарификацией за каждый запрос, сокращение количества запросов может помочь снизить расходы.
В этой-же библиотеке есть и более гибкие способы, с линейным распределением и пр., по ограничению запросов (название соответствует политике, подобно Fixed Window Limiting —
options.AddFixedWindowLimiter):1) Token Bucket Limiting — разрешает пакетный трафик путем накопления токенов. Запросы потребляют токены, и когда их не остается — запросы ограничиваются.
2) Sliding Window Limiting — сглаживает распределение запросов, проверяя частоту по скользящему окну вместо фиксированного временного окна.
3) Concurrency Limiting — ограничивает количество одновременных запросов.
Ну и Best Practice:
1) Детализация ограничений: Ограничения в зависимости от клиента, пользователя или IP-адреса. Например, вам могут потребоваться более строгие ограничения для пользователей, не прошедших проверку подлинности, и более мягкие ограничения для доверенных клиентов.
2) Код ответа: При превышении лимитов скорости возвращаются значимые сообщения с кодом состояния
429 Too Many Requests. С добавлением информации о том, когда клиент сможет повторить попытку снова.3) Заголовки: Используйте заголовки ограничения скорости
X-RateLimit-Limit, X-RateLimit-Remaining и X-RateLimit-Reset, чтобы предоставлять клиентам обратную связь об их текущем состоянии ограничений.🔥1
image_2024-11-07_15-38-19.png
2.5 MB
DDD
Сколько разных версий схем DDD существует, это просто мое увожение... Каждый рисует кто во что горазд, и везде разные объяснения одних и тех же вещей)))
Сколько разных версий схем DDD существует, это просто мое увожение... Каждый рисует кто во что горазд, и везде разные объяснения одних и тех же вещей)))
Лайфхак от головной боли по выравниванию и обновлению версий NuGet пакетов:
1) Установить утилиту глобально:
2) Обновить всё до последней минорной версии:
3) Обновить вообще всё до самых последних версий:
Да, придется подождать, в зависимости от количества пакетов и их переплетений по зависимостям (5-30 мин), но это сильно быстрее, чем самому распутывать клубки тянущихся друг за другом зависимостей и обновлять пакеты вручную, один за другим.
1) Установить утилиту глобально:
dotnet tool install --global dotnet-outdated-tool
2) Обновить всё до последней минорной версии:
dotnet outdated --version-lock major --upgrade
3) Обновить вообще всё до самых последних версий:
dotnet outdated --upgrade
Да, придется подождать, в зависимости от количества пакетов и их переплетений по зависимостям (5-30 мин), но это сильно быстрее, чем самому распутывать клубки тянущихся друг за другом зависимостей и обновлять пакеты вручную, один за другим.
Сталкивался с проблемами при выборе образа докера, с непонятными приписками в конце, Alpine понятно, а что именно означают остальные, кроме того, о чем можно косвенно догадаться по названию — было непонятно, поэтому решил суммаризировать и оставить тут для себя:
🔵 Alpine: легкий дистрибутив Linux, ориентированный на безопасность, подходит для микросервисов и легких приложений.
🔵 Slim: уменьшенная версия Debian, совместима с более широким спектром приложений.
🔵 Bullseye: стабильный дистрибутив Debian с обширной поддержкой библиотек.
🔵 Bookworm: кодовое название Debian 12, подходит для использования новейших библиотек и функций.
🔵 Jammy: кодовое название Ubuntu 22.04 LTS, оптимизирован для приложений LTS.
🔵 Noble: пользовательский или академический образ, совместим с Debian, используется в определенных средах.
PS: если коротко то просто всегда выбирать Alpine, или Slim, в зависимости от того нужен Ubuntu или Debian, 99% раз это будет правильный выбор. В 1% по узкоспециализированной потребности.
PS: если коротко то просто всегда выбирать Alpine, или Slim, в зависимости от того нужен Ubuntu или Debian, 99% раз это будет правильный выбор. В 1% по узкоспециализированной потребности.
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Борис опять
Это не оверинжениринг если:
1. Тебе было весело
2. PM не заметил
1. Тебе было весело
2. PM не заметил
Forwarded from Стой под стрелой (Nikita Prokopov)
Провел выходные за оптимизацией Java кода. Периодически слышу, как люди говорят «JVM может быть быстрой», и я в целом им верю, но какой ценой?
Например, смотрел доклад, и там чел говорит: ну вот, JVM любит когда ты код попроще пишешь, и не любит по-сложнее. Когда массивы-индексы-примитивные типы так вообще хорошо.
Проблема в том, что это не точные инструкции. Например, сходить в другой класс прочитать поле или даже вызвать несложный метод может быть бесплатно. А может и нет. Как узнать? Никак, пробовать. Вчера мой код начал работать в 10 раз медленее просто потому, что я какую-то переменную перенес из локальной в поле класса. В 10 раз! И только одну конкретную переменную. Пять других перенеслись прекрасно. ПОЧЕМУ?
И в итоге ты не работой занимаешься, а шаманством каким-то, перестановкой инструкций наугад. Я уважаю научный метод, гипотеза-эксперимент, вот это все, но это не он, это уже граничит с магией. Если честно, неудобно даже как-то называть себя инженером после такого.
Закончилось все тем, что я написал версию, которая работает за 50 микросекунд на ASCII файле, но если запустить ее на файле с не-ASCII символом, а потом снова на ASCII, то она начинает работать за 100 микросекунд. То есть еще раз, тот же вход, та же функция, просто начинает работать в два раза медленее если кто-то где-то однажды позвал ее на другом файле.
А потом выйдет новая версия и все опять начнет работать по-другому. Или не начнет. Потому что гарантий никаких нет, а внутри магия.
Например, смотрел доклад, и там чел говорит: ну вот, JVM любит когда ты код попроще пишешь, и не любит по-сложнее. Когда массивы-индексы-примитивные типы так вообще хорошо.
Проблема в том, что это не точные инструкции. Например, сходить в другой класс прочитать поле или даже вызвать несложный метод может быть бесплатно. А может и нет. Как узнать? Никак, пробовать. Вчера мой код начал работать в 10 раз медленее просто потому, что я какую-то переменную перенес из локальной в поле класса. В 10 раз! И только одну конкретную переменную. Пять других перенеслись прекрасно. ПОЧЕМУ?
И в итоге ты не работой занимаешься, а шаманством каким-то, перестановкой инструкций наугад. Я уважаю научный метод, гипотеза-эксперимент, вот это все, но это не он, это уже граничит с магией. Если честно, неудобно даже как-то называть себя инженером после такого.
Закончилось все тем, что я написал версию, которая работает за 50 микросекунд на ASCII файле, но если запустить ее на файле с не-ASCII символом, а потом снова на ASCII, то она начинает работать за 100 микросекунд. То есть еще раз, тот же вход, та же функция, просто начинает работать в два раза медленее если кто-то где-то однажды позвал ее на другом файле.
А потом выйдет новая версия и все опять начнет работать по-другому. Или не начнет. Потому что гарантий никаких нет, а внутри магия.
Как чувствует себя мой ноут на i5, без видеокарты, с 15Гб свободной RAM, когда я запускаю на нем 7b модель с 1000+ FAISS
😂
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from DevHumor
Слышал про одну притчу, про хирурга и автомеханика:
В наших (айтишных) руках, конечно не человеческая жизнь, но аналогия схожа. Только автомобиль при этом не только заведен, а еще и едет по дороге на скорости. И на ходу нужно в него добавлять всякие кнопочки, которые позволяют более гибко зажигать лампочки в автомобиле. Кому-то нужно встроить принтер в бардачок, чтобы он печатал давление всех колес, кроме одного, которое пользователю нужно вывести на экранчик в руле, потому что ему так виднее. Или добавить пятое колесо в движении.
И всё это на ходу, без остановок. Из вспомогательных факторов: можно остановиться несколько раз за неделю, на 10-15 минут; параллельно едет такая-же машина, с которой можно делать что угодно и останавливать на сколько угодно, чтобы проверить и подготовить все новые штуки к внедрению в основной автомобиль.
Приезжает хирург в автосервис. Мастер объявляет ему стоимость ремонта двигателя. Хирург соглашается.
Мастер ему говорит: -"Почему такая несправедливость? Ты ведь тоже "механик", только людей ремонтируешь. А стоимость работы у нас с тобой не сопоставима."
Хирург с удивлением говорит: -"Да? Ну хорошо!"
Заводит двигатель автомобиля, и говорит мастеру: -"Вот теперь ремонтируй!"
В наших (айтишных) руках, конечно не человеческая жизнь, но аналогия схожа. Только автомобиль при этом не только заведен, а еще и едет по дороге на скорости. И на ходу нужно в него добавлять всякие кнопочки, которые позволяют более гибко зажигать лампочки в автомобиле. Кому-то нужно встроить принтер в бардачок, чтобы он печатал давление всех колес, кроме одного, которое пользователю нужно вывести на экранчик в руле, потому что ему так виднее. Или добавить пятое колесо в движении.
И всё это на ходу, без остановок. Из вспомогательных факторов: можно остановиться несколько раз за неделю, на 10-15 минут; параллельно едет такая-же машина, с которой можно делать что угодно и останавливать на сколько угодно, чтобы проверить и подготовить все новые штуки к внедрению в основной автомобиль.
Внимание, анекдот:
...
8 октября 2024. Александр:
"Привет) Удалось найти вариант как получить эти данные?"
8 октября 2024. Григорий:
"Здравствуйте. пока не смотрел, и пока сложно сказать, когда доберусь."
14 января 2025. Александр:
"Добрый день, Григорий, удалось добраться?"
16 января 2025. Григорий:
"Коллеги, добрый день. Честно говоря, немного подзабыл про это. Поставил себе пометку, постараюсь посмотреть на следующей неделе."
Все события и персонажи выдуманы, все совпадения случайны.😨
...
8 октября 2024. Александр:
"Привет) Удалось найти вариант как получить эти данные?"
8 октября 2024. Григорий:
"Здравствуйте. пока не смотрел, и пока сложно сказать, когда доберусь."
14 января 2025. Александр:
"Добрый день, Григорий, удалось добраться?"
16 января 2025. Григорий:
"Коллеги, добрый день. Честно говоря, немного подзабыл про это. Поставил себе пометку, постараюсь посмотреть на следующей неделе."
Все события и персонажи выдуманы, все совпадения случайны.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
⚡️Американская компания по кибербезопасности Wiz сообщила, что ее сотрудникам удалось обнаружить в общем доступе базу данных ClickHouse, связанную с китайским ИИ-стартапом DeepSeek. Используя обнаруженные файлы, программисты Wiz получили полный контроль над базой.
В сообщении Wiz говорится, что база ClickHouse была размещена на oauth2callback.deepseek.com:9000 и dev.deepseek.com:9000. Она была полностью открытой и раскрывала конфиденциальные данные.
Какой я молодец, что форшу всех использовать случайные публичные порты
Please open Telegram to view this post
VIEW IN TELEGRAM