данных типа Map[K,V]
она апдейтится достаточно часто и для производительности системы в целом весьма критична - но по каждому конкретному ключу апдейтов в единицу времени скорее всего не очень много
есть много лет назад написанный и работающий в проде вариант на акка стримах, который линеаризует апдейты по каждому ключу в отдельности и таким образом гарантирует целостность структуры
но обычный TrieMap - без локов и должен перформить как конь
при этом для обеспечения целостности там уже есть putIfAbsent, и варианты методов replace, remove с проверкой предыдущего значения
собственно идея, сделать поверх TrieMap
class HandleRef(k: K) extends Ref[F, Option[V]]
это реф на ключ k в мапе
который будет реализовывать под собой оптимистичные апдейты TrieMap с проверкой предыдущего значения, и ретраить при коллизиях
сомнение в том что если коллизий будет много, то работать будет хуже, как впрочем в любом оптимистичном локинге
если, например, там будет "горячий" ключ на который 100 тыщ в секунду апдейтов, он только и занят будет тем что ретраить
(можно на ретрай коллизий воткнуть метрику и смотреть сколько там _реально_ коллизий, то есть насколько оптимизм оправдан)
или может для такого уже есть стандартные решения (я гуглил изо всех сил, но не нашёл)?
спасибо за внимание!
В зиве stm что-то такое делали
TrieMap норм
Типа такого?
А чтения тоже через актор сделаны были? Если да, то TrieMap тут даст большой буст
Интересно, почему именно джавовая мапина используется, а не TrieMap
Это к автору кода
Я вот тут не понял, почему интерфейс такой странный: K => Ref[F, Option[V]] Почему не сделать K => F[Option[V]]?
чтение без апдейтов - прямо из underlying мапа
Да. Зачем Ref в результате...
Это видимо про кейс, где по каждому отдельному ключу свой реф типа
Обсуждают сегодня