пользователей есть id.
к сервису идут запросы примерно такого вида:
suspend fun process(id: UserId): Result {
... что-то делаем полезное
}
Хочется сделать так, чтобы запросы от разных пользователей обрабатывались параллельно, но при этом запросы к одному и тому же пользователю - последовательно.
То есть если первый запрос еще обрабатывается, а второй к этому же пользователю уже пришел, то он должен остановиться на suspend point и подождать.
Как это правильнее сделать?
Пока не могу придумать ничего лучше, чем завести ConcurrentHashMap<UserId,Mutex>, но это решение кажется каким то не совсем в духе котлина.
Сделать канал на каждого пользователя
Какое-то ограничение параллельности есть? Или просто при получении запроса всё в async?
Как мысль: Можно без всяких синхронизаций: шардить по userid по разным сингл тред контекстам
Ого, у меня был практически идентичный вопрос (да и сейчас есть)
каналы
один актор, который будет балансить у себя внутри и возвращать асинхронный результат внутри канал на каждого юзера, и чистка лишних каналов
А что, если пользователь каким-то образом придет на разные инстансы сервиса одновременно?
Обсуждали аналогичную задачку https://t.me/kotlin_lang/114701
Обсуждают сегодня