keys)? Юз кейс следующий: необходимо сделать rate-limiter: простой веб сервис который ограничивает доступ к ресурсу (5 запросов/5 секунд). Если лимит превышен, то возвращаем 503, если нет то 200. Каждые 5 секунд ограничение снимается (count=0). Естественно нужно чтобы было thread safe. Задумка атомарно инкрементить значение в мапе по ключу (для каждого clientId). Но теперь нужно сбрасывать каждые 5 секунд счётчик на ноль.
Что касается expire'а, то можно поиграться с Гуавовским Cache'ом
а готовые либы не смотрели? Например https://github.com/vladimir-bukhtoyarov/bucket4j/blob/master/doc-pages/basic-usage.md#example-3---limiting-the-rate-of-access-to-rest-api
camel, guava. если это тестовое - ну погуглите "leaky bucket java"
Можно попробовать решить только на коллекциях JDK, но немножко поменяв подход к алгоритму, и используя sliding window На эту тему есть неплохая статья от фигмы(https://www.figma.com/blog/an-alternative-approach-to-rate-limiting/)
Может проще на проксе сделать, тот же nginx поставить и на нем разрулить и по запросам и по тайм-ауту
а требование именно на concurenthashmap?
Можно просто когда приходит первый запрос от этого пользователя (в хеш мапе лежит значение 5) то просто сабмитим таску в scheduled executor через секунду на восстановление этого счётчика
Обсуждают сегодня