Size: a a a

var chat = new Chat();

2021 September 06

Ɖ

Ɖrēw in var chat = new Chat();
Тут есть все что нужно
источник

VD

Vitaly Deev in var chat = new Chat();
Конкретное решение либо запросы с блокировкой, либо через снэпшоты, я их не пробовал, но подходит в этом случае, либо еще решение позволять букинг и решать проблему на месте
источник

Ɖ

Ɖrēw in var chat = new Chat();
2 самых популярных пути решения
источник

AS

Andrii Shcherbyna in var chat = new Chat();
В транзакции делаешь два запроса
Первый: проверяешь, что комната не забукана
Второй: букаешь комнату

Можно это вообще в процедуру запихнуть

Если первый запрос фейлит операцию, то юзеру показываешь тостер, что упс, но не судьба

Но тут сразу вопрос, какие планы по горизонтальному расширению, репликации и т.д.?
источник

E

Etki in var chat = new Chat();
Почитайте про уровни изоляции пж. Если вкратце, то для транзакций установлен инвариант "они должны вести себя так, как если бы выполнялись одна за другой, а не параллельно", с поправкой на разрешенные уровнем изоляции феномены.
источник

E

Etki in var chat = new Chat();
Кстати тот самый недавно упоминаемый ивент сорсинг решит проблему вообще без каких-либо усилий. В нем оптимистичная блокировка встроена бай дизайн
источник

YM

Yury Morozov in var chat = new Chat();
И тормоза тоже
источник

E

Etki in var chat = new Chat();
Лолшто
источник

E

Etki in var chat = new Chat();
Какие тормоза?
источник

Ɖ

Ɖrēw in var chat = new Chat();
Тормоза пишут код используя одну пулю, полагая что она серебрянная, например SQL
источник

YM

Yury Morozov in var chat = new Chat();
SQL не серебряный, он универсальный и достаточно быстрый во многих случаях. Его нужно брать по умолчанию , а вот если где-то специфика есть,то городить огород
источник

Ɖ

Ɖrēw in var chat = new Chat();
> не серебряный, он универсальный
источник

E

Etki in var chat = new Chat();
Популярные реляционки с транзакциями у нас есть двух видов: на основе локов и снапшотов.
В случае локов транзакция будет брать 1..N локов
В случае снапшота у нас считайте что тот же ивент сорсинг, только регистр это не один айдишник, а вся база в целом, и опять каждая транзакция проверяет 1..N ключей в лучшем случае (а могут быть и вынужденные локи).
Ивент сорсинг проверяет наличие ОДНОЙ записи.
Вопрос: кто здесь тормозит, ивент сорсинг или архитектор? Где будет больше контеншн?
источник

Ɖ

Ɖrēw in var chat = new Chat();
источник

AS

Andrii Shcherbyna in var chat = new Chat();
SQL уже давно не решает проблемы, когда у каждого микросервиса своя база
источник

YM

Yury Morozov in var chat = new Chat();
А зачем она своя?
источник

AS

Andrii Shcherbyna in var chat = new Chat();
by design)
источник

E

Etki in var chat = new Chat();
Ну это вообще большая боль с любым хранилищем. Микросервисная архитектура подразумевает что любой может завалиться сам, но другие должны стоять. А это значит что у каждого должен быть свой кластер, иначе тот кто перегрузил базу утащит за собой и соседа.
В результате конечно беда, либо у тебя опсы зашиваются с миллиардом инсталляций, либо у тебя приложение сразу группами сервисов мрет.
источник

AS

Andrii Shcherbyna in var chat = new Chat();
На самом деле сложности есть даже при обычном шардировании
источник

AS

Andrii Shcherbyna in var chat = new Chat();
Это же постоянная игра с CAP теоремой
источник