LINUX.ORG.RU

История изменений

Исправление den73, (текущая версия) :

Мы можем рассмотреть конкретную ситуацию? Есть две базы, база «секреты» и база «контент». Первая хранит попытки регистрации (отправляется E-mail с подтверждением), а также хеши, соль паролей, эл.почту, никнейм. Вторая хранит только никнейм, ну и весь остальной контент, который не является персональными данными.

Задача элементарная - в момент, когда пользователь нажал на ссылку подтвержения регистрации, нужно перенести в базе «секреты» из таблицы «секреты.попытки_регистрации» в таблицу «секреты.пользователь», а также скопировать эту же инфу в таблицу «контент.пользователь» в базе «контент».

Всё, что происходит внутри базы «секреты» - вещь относительно простая, делается с помощью транзакции.

А дальше нужно уже на голанге написать репликацию. И тут возникает проблема: а что, если в базе «секреты» всё записалось, а при записи в базу «контент» отвалилась сеть? Тогда получится рассогласование данных. Получается, нужно менять логику: отделить репликацию в отдельное нечто (службу, микросервис, не знаю, как назвать), которая будет упорно долбиться и обе базы и пытаться реплицировать постоянно.

Но что сказать в этом случае пользователю? «Регистрация прошла успешно»? Но ведь без записи в базе «контент» выдача контента, связанного с этим пользователем, работать не будет. Получается, пока репликация не сработала, мы не можем честно сказать пользователю, что он добавлен в систему.

Т.е. малейшая распределённость сразу приводит к снижению надежности, которое прекрасно ощущается конечными пользователями. Я не знаю, что тут можно сделать, чтобы пользователь остался полностью доволен.

Код здесь, но вообще он вряд ли нужен для разбора этой ситуации. репликацию я не осилил и выкинул вообще разделение на две базы, т.к. нужно что-то законченное как можно скорее сделать.

https://github.com/budden/semdict/blob/b1c6a4003bd3170c56653dd46e92c9a416a7b6...

Исходная версия den73, :

Мы можем рассмотреть конкретную ситуацию? Есть две базы, база «секреты» и база «контент». Первая хранит попытки регистрации (отправляется E-mail с подтверждением), а также хеши, соль паролей, эл.почту, никнейм. Вторая хранит только никнейм, ну и весь остальной контент, который не является персональными данными.

Задача элементарная - в момент, когда пользователь нажал на ссылку подтвержения регистрации, нужно перенести в базе «секреты» из таблицы «секреты.попытки_регистрации» в таблицу «секреты.пользователь», а также скопировать эту же инфу в таблицу «контент.пользователь» в базе «контент».

Всё, что происходит внутри базы «секреты» - вещь относительно простая, делается с помощью транзакции.

А дальше нужно уже на голанге написать репликацию. И тут возникает проблема: а что, если в базе «секреты» всё записалось, а при записи в базу «контент» отвалилась сеть? Тогда получится рассогласование данных. Получается, нужно менять логику: отделить репликацию в отдельное нечто (службу, микросервис, не знаю, как назвать), которая будет упорно долбиться и обе базы и пытаться реплицировать постоянно.

Но что сказать в этом случае пользователю? «Регистрация прошла успешно»? Но ведь без записи в базе «контент» выдача контента, связанного с этим пользователем, работать не будет. Получается, пока репликация не сработала, мы не можем честно сказать пользователю, что он добавлен в систему.

Т.е. малейшая распределённость сразу приводит к снижению надежности, которое прекрасно ощущается конечными пользователями. Я не знаю, что тут можно сделать, чтобы пользователь остался полностью доволен.