Size: a a a

Software Design/Architecture/Zen

2020 November 16

NI

Nikita Ilin in Software Design/Architecture/Zen
Yury Golikov
Если не останется параграфов? То фейл.  Но можно по разному сделать
Я в вашем варианте, не понял, как искать для пользователя непроверенный документ
источник

YG

Yury Golikov in Software Design/Architecture/Zen
Nikita Ilin
Я в вашем варианте, не понял, как искать для пользователя непроверенный документ
Я не учёл, что нужно выбирать именно документ с наибольшим кол-ом проверок, тогда фэйлы будут часто.
Но суть в том что у каждого пользователя список с непроверенными им док-ми.
источник

NI

Nikita Ilin in Software Design/Architecture/Zen
Yury Golikov
Я не учёл, что нужно выбирать именно документ с наибольшим кол-ом проверок, тогда фэйлы будут часто.
Но суть в том что у каждого пользователя список с непроверенными им док-ми.
У каждого пользователя будет вначале тогда 1 млн документов
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Nikita Ilin
Я имею в виду хранить номер потенциально следующего документа (если он ещё не закончен)
ну это как по мне не оч предсказуемая штука
источник

SP

Sergey Protko in Software Design/Architecture/Zen
опять же - книги тут не столь важны - у тебя параграфы по порядку будут всегда идти
источник

SP

Sergey Protko in Software Design/Architecture/Zen
тут как бы два момента: если мне поставили бы такую задачу и если бы у меня реально было 10К юзеров мне стоило бы задаться вопросом "а как часто и какие риски если какие-то из этих правил будут нарушены".

Тут скорее всего сложность в том что правила апрува скорее всего у тебя посложнее нежели 3 чела ткнули упрув. Иначе не надо было бы возиться с агрегатами.
источник

SP

Sergey Protko in Software Design/Architecture/Zen
была бы табличка, параграфы... у них был бы json мэпа с ключами айдишками юзеров и значениями таймстэмпами когда был зарезервирован". Чел шлет запрос "хочу следующий" и мы тупо делаем update с включением нашего айдишника в мэпу (это можно делать атомарно в каком postgres). забронировали - заапрувили. Отдельный процесс ходит и высвобождает по таймауту забронированные параграфы... Да  стэйт центраизован да если база упадет все плохо.  Зато быстро.

Ну или опять же вариант @nekt_ru с курсорами в памяти/рэдисах каких.
источник

SP

Sergey Protko in Software Design/Architecture/Zen
может быть распределение работы и саму работу стоит отдельно рассматривать...
источник

SP

Sergey Protko in Software Design/Architecture/Zen
мол распределение сделать эффективным и быстрым а уже когда распределены айдишники параграфов там другие агрегаты и есть варианты выбрать уже партиции поменьше
источник

˸A

˸̧̨ ͅBlack Akula˸̧̨ ... in Software Design/Architecture/Zen
Sergey Protko
есть какая-то логика мол "если забрал и не заапрувил - можно выдать другому?"
Умеешь правильные вопросы задавать))
источник

NI

Nikita Ilin in Software Design/Architecture/Zen
Sergey Protko
была бы табличка, параграфы... у них был бы json мэпа с ключами айдишками юзеров и значениями таймстэмпами когда был зарезервирован". Чел шлет запрос "хочу следующий" и мы тупо делаем update с включением нашего айдишника в мэпу (это можно делать атомарно в каком postgres). забронировали - заапрувили. Отдельный процесс ходит и высвобождает по таймауту забронированные параграфы... Да  стэйт центраизован да если база упадет все плохо.  Зато быстро.

Ну или опять же вариант @nekt_ru с курсорами в памяти/рэдисах каких.
Бронировать точно как-то нужно. Иначе прилетит 100 запросов и всем вернётся один и тот же параграф, что бессмысленно
источник

NI

Nikita Ilin in Software Design/Architecture/Zen
Хотя, если этот процесс в одном потоке
источник

SP

Sergey Protko in Software Design/Architecture/Zen
ну вот я бы бронь одним потоком держал бы, что бы можно было текущее состояние дел держать в памяти и не надо было бы тратить время на походы по сети
источник

SP

Sergey Protko in Software Design/Architecture/Zen
а вот после брони уже есть варианты думается мне
источник

NI

Nikita Ilin in Software Design/Architecture/Zen
В памяти опасно
источник

NI

Nikita Ilin in Software Design/Architecture/Zen
Ну т е помимо в памяти нужно тут же в базу сохранять, а память только как кэш использовать
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
у каждого параграфа ууид. юзеру выдается ууид параграфа, и больше он ничего взять не сможет. хранится в памяти список троек - ууид параграфа, ууид юзера, время взятия. просроченные записи удаляются например каждую минуту по крону.
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
как только юзер зааппрувит параграф, он добавляется в историю (чтобы нельзя было взять 2 раза одно) и удаляется из этого пула.
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
Nikita Ilin
Всем привет!
Решаю кейс и пытаюсь спроектировать агрегаты, нужна помощь, может, кто сталкивался с такой задачей)

Имеются книги, каждая из которых содержит в среднем 5000 параграфов.
Всего около 1 млн книг.
Каждая из книг может быть просмотрена пользователем максимум один раз.

Пользователи проверяют параграфы на достоверность.

Процесс выглядит следующим образом:
Пользователь жмёт кнопку GetNextItem, получает новый параграф, проверяет его на достоверность и жмёт либо valid, либо invalid. Далее цикл повторяется. В следующий раз пользователь получит параграф из другого документа (пользователь может посмотреть максимум один параграф из одного документа).

Когда у параграфа два подтверждения -> параграф считается правильным. Когда два раза invalid - считается invalid соответсвенно.

Когда все параграфы документа пройдены, документ считается выполненным.

При этом каждый раз пользователю должен выдаваться параграф из документа, который имеет минимальное количество параграфов для проверки (максимальное прогресс).

Всё это похоже на очередь, но нужно проверять на уникальность участников.
У кого есть какие-то мысли как правильно спроектировать агрегаты, так чтобы не было много проблем с конкурентным доступом, т.к. ожидается большое количество конкурентных пользователей (10 000)?
Если это то же самое что и в appen. Только для книг, то нужно ещё собирать комментарии-обоснования, а не просто valid invalid.
источник

NF

Nikita Fedorov in Software Design/Architecture/Zen
Nikita Ilin
Всем привет!
Решаю кейс и пытаюсь спроектировать агрегаты, нужна помощь, может, кто сталкивался с такой задачей)

Имеются книги, каждая из которых содержит в среднем 5000 параграфов.
Всего около 1 млн книг.
Каждая из книг может быть просмотрена пользователем максимум один раз.

Пользователи проверяют параграфы на достоверность.

Процесс выглядит следующим образом:
Пользователь жмёт кнопку GetNextItem, получает новый параграф, проверяет его на достоверность и жмёт либо valid, либо invalid. Далее цикл повторяется. В следующий раз пользователь получит параграф из другого документа (пользователь может посмотреть максимум один параграф из одного документа).

Когда у параграфа два подтверждения -> параграф считается правильным. Когда два раза invalid - считается invalid соответсвенно.

Когда все параграфы документа пройдены, документ считается выполненным.

При этом каждый раз пользователю должен выдаваться параграф из документа, который имеет минимальное количество параграфов для проверки (максимальное прогресс).

Всё это похоже на очередь, но нужно проверять на уникальность участников.
У кого есть какие-то мысли как правильно спроектировать агрегаты, так чтобы не было много проблем с конкурентным доступом, т.к. ожидается большое количество конкурентных пользователей (10 000)?
Если коротко это че-то типа фокус-групп, только на кучу юзеров:
- тебе показывают рекламу ты должен проверить что она не гавно  
- тебе показывают выдачу в гугле, ты должен проверить что она совпадает с тем что ты искал

Твой кейс выглядит в точности эквивалентным.
источник