Size: a a a

Scala User Group

2020 November 28

Oℕ

Oleg ℕizhnik in Scala User Group
Mikhail Tolstoy
Добрый день
У меня вопрос но гугл мне не помогает с поиском примера или книги/статьи
Я понимаю как в памяти функционально используя кэтсэффекты или кэтс стм обновлять структуру(ы) данных
но не понимаю как подвязать к этом перзистенс.
Пусть у меня есть пользователь с какой-то инфой и состоянием, и сервер который принимает хттп запросы которые пользователя обновляют
я не могу всех пользователей хранить в памяти
и вот мне приходит запрос - я могу под него вычитать пользователя и обернуть его в реф или твар
но когда мне приходит второй запрос - как мне сделать так чтобы он использовал тот же референс, чтобы не получить параллельные апдейты перетирающие друг друга?

наивно приходит в голову заводить реф на кэш используемых пользователей в памяти где хранить рефы но кажется можно как-то лучше - аля реестр перзистентных сущностей как в акторах

но может есть какие-то еще способы? Выглядит же достаточно частым кейсом
код пожалуйста в scastie или gist
источник

AS

Artem Sokolov in Scala User Group
Mikhail Tolstoy
Добрый день
У меня вопрос но гугл мне не помогает с поиском примера или книги/статьи
Я понимаю как в памяти функционально используя кэтсэффекты или кэтс стм обновлять структуру(ы) данных
но не понимаю как подвязать к этом перзистенс.
Пусть у меня есть пользователь с какой-то инфой и состоянием, и сервер который принимает хттп запросы которые пользователя обновляют
я не могу всех пользователей хранить в памяти
и вот мне приходит запрос - я могу под него вычитать пользователя и обернуть его в реф или твар
но когда мне приходит второй запрос - как мне сделать так чтобы он использовал тот же референс, чтобы не получить параллельные апдейты перетирающие друг друга?

наивно приходит в голову заводить реф на кэш используемых пользователей в памяти где хранить рефы но кажется можно как-то лучше - аля реестр перзистентных сущностей как в акторах

но может есть какие-то еще способы? Выглядит же достаточно частым кейсом
чем реестр отличается от кэша?
источник

AS

Artem Sokolov in Scala User Group
и чем кэша не хватает
источник

AS

Artem Sokolov in Scala User Group
звучит как будто вы пришли из мира акка персистанс (или из мира хибернейта), привыкли к инструменту который там есть
потом взяли кэтс, которые вообще другие задачи решают и ожидаете такой же инструмент как там
источник

AS

Artem Sokolov in Scala User Group
"параллельные апдейты перетирающие друг друга?"
кажется это в принципе решается пессимистичной/оптимистичной блокировкой
причем на уровне базы (у вас инстансов то потенциально может быть несколько, так что единй кэш одного инстанса ничего не гарантирует)
источник

AS

Artem Sokolov in Scala User Group
вопрос наверное в том как тот или иной вид блокировки написать в памяти на котах?
типа пессимистичная - семафор1/мвар на каждого юзера (вычитали, положили в ячейку с единичным доступом, 1 запрос забирает на запись, отдает, все остальные "блокируются" пока он не отдаст, персистить можно в любой момент тк у нас единственный вариант данной записи монопольно используемый)
оптимистичный - также как и везде CAS алгоритм с полем версионирования

но кажется это должно все решаться через бд (если это реляционка), либо через другие алгоритмы если "бд" не позволяет добится подобных механизмов из коробки
источник

MT

Mikhail Tolstoy in Scala User Group
Artem Sokolov
звучит как будто вы пришли из мира акка персистанс (или из мира хибернейта), привыкли к инструменту который там есть
потом взяли кэтс, которые вообще другие задачи решают и ожидаете такой же инструмент как там
Так я и пишу что не знаю как иначе и хотел бы наводку что почитать.
Спасибо за то что так развёрнуто ответили.
источник

MT

Mikhail Tolstoy in Scala User Group
Вернусь попозже с примером в скасти пожалуй.)
источник

SA

Sergey Alaev in Scala User Group
На чем сейчас модно property-based testing делать?
источник

GP

Grigory Pomadchin in Scala User Group
Sergey Alaev
На чем сейчас модно property-based testing делать?
scalacheck 🤷‍♀️
источник

SA

Sergey Alaev in Scala User Group
Grigory Pomadchin
scalacheck 🤷‍♀️
Допустим я пишу тест сохранения  в базу case class-а с 5 строковыми полями, и я хочу проверить все граничные случаи для каждого поля (пустая строка, строка макс. длины, строка со спецсимволами). Как это сделать?
источник

GP

Grigory Pomadchin in Scala User Group
Sergey Alaev
Допустим я пишу тест сохранения  в базу case class-а с 5 строковыми полями, и я хочу проверить все граничные случаи для каждого поля (пустая строка, строка макс. длины, строка со спецсимволами). Как это сделать?
Генератор напиши для кейскласса
источник

Oℕ

Oleg ℕizhnik in Scala User Group
google magnolia scalacheck
источник

GP

Grigory Pomadchin in Scala User Group
Grigory Pomadchin
Генератор напиши для кейскласса
Скалачек генератор
источник

GP

Grigory Pomadchin in Scala User Group
Ты посмотри как там для всех типов делаются генераторы
источник

SA

Sergey Alaev in Scala User Group
Grigory Pomadchin
Скалачек генератор
Там рандом же? А я хочу в интеграционном тесте обойтись 3 инсертами, а не 15 или 100 (с вероятностью пропустить какой-то кейс)
источник

GP

Grigory Pomadchin in Scala User Group
Sergey Alaev
Там рандом же? А я хочу в интеграционном тесте обойтись 3 инсертами, а не 15 или 100 (с вероятностью пропустить какой-то кейс)
там как хочешь; генераторы фильтры понимают, мапы
источник

Oℕ

Oleg ℕizhnik in Scala User Group
генераторы можно и табличные сделать
источник

GP

Grigory Pomadchin in Scala User Group
можешь свой вообще сделать для строки
источник

Oℕ

Oleg ℕizhnik in Scala User Group
и количество ограничить
источник