Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / soa eventual consistency / 14 сообщений из 14, страница 1 из 1
11.03.2017, 20:24
    #39417413
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
Предположим есть сервисы a, b, c.

Сервисы b и c имеют два метода пополнить/списать со счёта, у каждого своя БД соответственно. То есть сервис a дергает сначала b списать 100 рублей со счёта xxx, а затем сервис c зачислить 100 рублей на счёт xxx.

Как избежать не консистентности в данном случае, когда средства списались в базе b но ещё не зачислены в c? Никакие two phase commit/atomic transactions здесь не помогают, тк коммитятся все равно последовательно базы.

Допустим у нас есть сервис d который лезет в базы b и c и строит отчёты, тогда например вполне вероятен вариант, что на счёте xxx будет в данном примере 0 рублей.
...
Рейтинг: 0 / 0
11.03.2017, 20:49
    #39417417
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
no56892Как избежать не консистентности
Никак. У тебя распределенная система.

Ищи другое решение. Например все сервисы сливают сервису X свое состояние, ты делаешь запрос к X где все всегда консистентно.
...
Рейтинг: 0 / 0
11.03.2017, 20:56
    #39417418
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
Dima T,
Тогда логичней было бы вообще объединить сервисы b и c в один, но это все противоречит духу soa, где у каждого сервиса своя база. Прикол в том, что ценной инфы по этому поводу очень мало, обычно пишут типо вам нужны distributed transactions, дак они это тоже не решают. Как вообще на практике такое решается? Надо строить отчёт по данным 20 сервисов например, естественно пока мы читаем оттуда данные туда могут понапихать еще, в результате отчёт будет кривой. Вот как такая штука решается, кроме использования общей базы?
...
Рейтинг: 0 / 0
11.03.2017, 21:02
    #39417421
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
ИМХО у тебя в архитектуре проблемы. Назначь главным b или c, но один. И опрашивай только его, а не объединяй ответы обоих, их нельзя объединять.
...
Рейтинг: 0 / 0
11.03.2017, 21:02
    #39417422
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
Dima Tno56892Как избежать не консистентности
Никак. У тебя распределенная система.

Ищи другое решение. Например все сервисы сливают сервису X свое состояние, ты делаешь запрос к X где все всегда консистентно.
Просто сливать инфу не получится кстати, так как его тоже будут последовательно дергать, ну можно конечно ввести уникальный айдишник транзакции и сколько сервисов должно отчитаться, тогда в чревисе х мы для каждого айдишника тупо накапливает все изменения , все сервисы по этой транзакции от читались - ок сливаем в базу сервиса х, вот там консистентности будет. Но это ж какая нагрузка , явный боттлнек, ушли от монолита пришли к такому...хотя как вариант интересный
...
Рейтинг: 0 / 0
11.03.2017, 21:45
    #39417431
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
Вот как бы можно было сделать теоретически:
Пусть есть n сервисов и менеджер транзакций t.
Шаги коммита:
1.транзанкш менеджер мультикастом шлёт precommit n сервисам, они отвечают ок
2. Транзакшн менеджер шлёт мультикастом commit-lock всем сервисам, что означает поставить все чтения/записи данных, которые затронули изменения в данной транзакции в очередь и применить эти изменения, получить подтверждение
3. Транзакшн менеджер шлёт мультикастом всем unlock
Вот здесь норм должно быть, только это уже совсем не rdms..
...
Рейтинг: 0 / 0
11.03.2017, 22:08
    #39417434
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
no56892,
Не, это тоже неконсистентно, тк если сервис1 в состоянии lock-commit, а до второго ещё оно не дошло, то если какойлибо третий обратится в этот момент, то в сервисе1 он встанет в очередь и потом получит новое значение, а в сервисе2 успеет достать старое ещё до lock-commit
...
Рейтинг: 0 / 0
11.03.2017, 22:40
    #39417439
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
no56892, можно в сервисе "a" завести ленту бизнес операций типа проводки.
а сервисы "b", "c" синхронизировать с ней. Можно даже постфактумом.

Главное чтобы ошибка или непринятие пополнения или списания фиксировалась
в журнале "a" тоже как откат или коррекция.
...
Рейтинг: 0 / 0
11.03.2017, 22:50
    #39417443
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
mayton,
Это как раз таки решает two phase commit.
Проблема то не в этом, а в data consistency.
...
Рейтинг: 0 / 0
11.03.2017, 22:54
    #39417444
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
Тогда забей. Консистентность такого уровня о котором ты говоришь может обеспечить
разве что Oracle RAC.

Или у тебя своё (другое) определение консистентности в рамках имеющейся инфраструктуры
и его (это понимание) необходимо как-то определить и формально описать.
...
Рейтинг: 0 / 0
11.03.2017, 23:02
    #39417446
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
mayton,
Oracle RAC это жеж вроде как обычный master-slave, совсем не по soa'совски.
...
Рейтинг: 0 / 0
11.03.2017, 23:14
    #39417451
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
В RAC нету master-slave.
...
Рейтинг: 0 / 0
11.03.2017, 23:39
    #39417460
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
mayton,
Ну все равно это не подходит, тк подразумевает объединение двух сервисов в один с общей базой и так в итоге приходим к монолиту...
...
Рейтинг: 0 / 0
11.03.2017, 23:59
    #39417473
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soa eventual consistency
Здесь в рассуждениях где-то есть неточность.

Цитирую
Допустим у нас есть сервис d который лезет в базы b и c и строит отчёты, тогда например вполне вероятен вариант, что на счёте xxx будет в данном примере 0 рублей.

Вот с этого места - неверно. Никакой сервис d не может ходить в базы b и с и строить отчеты. Нет единой точки
где есть сведения счетчиков транзакций.

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

Поэтому и проводки и отчеты можно делать только со стороны сервиса A.

Если на сервисы b,c смотреть отдельно со стороны то в классификации CAP мы будем иметь полную AP
модель. Тоесть доступность есть (A). И есть разделение (P) (b,c разделены и полностью независимы) а consistency - остуствтует.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / soa eventual consistency / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]