TGViewer
C# Short Posts 🔞 C# Short Posts 🔞 @dimasshortposts · 306 subscribers
Post #403 536
🛡 Rate Limiting, часть 3: распределённый лимит через MySQL

Итак, проблема простая: встроенный rate limiter считает in-memory. Каждый под живёт своей жизнью и ведёт свой счётчик. Юзер с лимитом в 10 запросов спокойно делает 20 — по 10 на каждый под (дикпик 1).

Итак, как сделать рейт-лимиты распределенными? И да, тут я изучал как это сделать через MySQL потому что у нас сейчас в работе MySQL, запросов пока что не очень много, и раздувать зависимости не хочется. Короче, обстановка позволяет такой эксперимент, а если что, не проблема первое время пожить с InMemory, а потом переехать на что-то более быстрое.

Так вот, я не нашел каких-то решений, которые бы имплементировали бы распределенную блокировку FixedWindow на MySQL из коробки. Но, как оказывается эта задача решается довольно понятно. Непросто, но хотя бы понятно.

🩳 Если говорить коротко, то вам нужно реализовать наследника для базового класса RateLimiter. Там есть пара методов, которые нужно заоверрайдить, но наверное самый главный – это AcquireAsyncCore. Который и будет выполнять чтение из базки.

🏓 Таблица в базке простая: ключ партиции (юзер/IP), ID окна, счётчик запросов и время истечения (дикпик 2).

Вся магия в INSERT ON DUPLICATE KEY UPDATE. Один SQL-запрос атомарно либо создаёт запись со счётчиком 1, либо инкрементит существующий. Если окно истекло — сбрасывает счётчик. Никаких транзакций, никаких локов — InnoDB сам разруливает на уровне строки (дикпик 3).

Реализованный класс со всеми запросами можно глянуть вот тут.

Дальше подключаем через extension method — по сути также как и встроенные лимитеры (дикпик 4). Для приложения ничего не меняется, просто теперь счётчик общий на все поды.

Опять же, MySQL тут мегаспорное решение. И тут конечно надо бы посоветовать Redis или что-то такое. Но думаю, что полезно просто узнать об этом подходе. Что вообще есть этот RateLimiter и что в целом его можно довольно быстро заимплементить на любом доступном хранилище.

🅰️ Итого: если вам нужен рейт-лимитер, то мы можете заюзать стандартную библиотечку. Если нужно сделать лимитер распределенным, то это тоже можно, нужно всего лишь корректно реализовать класец RateLimiter

#csharp #ratelimiting
  • ❤ 1
  • ❤‍🔥 1
  • 🔥 1
More from @dimasshortposts
  1. Sep 26, 2026🧵 Тредик для вопросов по докладу про MAF на дотнексте В докладе многие подробности опусти…
  2. Sep 23, 2026Даже самым хардкорным ребятам надо отдыхать, так что отдыхаем, мои чюваки 🕺 🧑‍💻dp🥁 #he…
  3. Sep 16, 2026🎯 Instrumented Tier0: профилирование кода В прошлый раз мы разобрали два уровня компиляци…
  4. Sep 15, 2026🔜 Готовлюсь к DOTNEXT 2026 В прошлом году за две недели до выступления я зачитывал свой д…
  5. Sep 9, 2026C# Short Posts 🔞 pinned «🐸 О чём этот канал? Кажется, я уже достаточно давно веду этот к…
  6. Sep 9, 2026🐸 О чём этот канал? Кажется, я уже достаточно давно веду этот канальчик, и пора бы описат…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →