Имя: Пароль:
1C
 
Кто нибудь реализовывал распределенные транзакции на 1с?
0 Fragster
 
гуру
10.05.11
18:36
Кто нибудь реализовывал распределенные (выполняющиеся одновременно в нескольких базах) транзакции на 1с?

и с той и с другой стороны будет 1ска и веб сервисы.

Условно
Мастер: начало транзакции
<вызов веб сервиса>
Слейв: начало транзакции
Слейв: Фиксация транзакции
</вызов веб сервиса>
Мастер: отмена транзакции (дедлок или еще чего не так)

задача - сделать так, чтобы слейв в случае отмены транзакции мастера тоже свою транзакцию грохнул. пока есть мысль с последующей синхронизацией со стороны мастера в виде периодической передачи на слейв инфы, что же на самом деле зафиксировалось на мастере (отдельным вызовом веб сервиса) и прибиванием на слейве того, что ему не пришло в подтверждении. в таком подходе минусы очевидны - в случае коллизий теряется "онлайновость" всей этой фигни, а это одно из главных требований.
1 fisher
 
10.05.11
18:52
А иначе полноценный координатор распределенных транзакций нужен. Журнал транзакций, хранение инфы необходимой для отката...
2 fisher
 
10.05.11
18:54
И всё равно будут возможны ситуации с рассинхронизацией в конкретный момент времени.
3 Fragster
 
гуру
10.05.11
19:01
чувствую, будет велосипед тот еще
4 fisher
 
10.05.11
19:23
Если есть "мастер" (т.е. слэйв ОБЯЗАН фиксировать зафиксированные на мастере транзакции), то проще всего вести на мастере очередь зафиксированных транзакций, еще не зафиксированных на слэйве. Тогда с некоторой частотой слэйв стучится к мастеру и отрабатывает очередь (пытается зафиксировать соответствующие транзакции у себя). Для ускорения процесса мастер может через веб-сервис дать команду слэйву на внеочередную отработку очереди. ИМХО, это наиболее простая и надежная схема.
При сбое отработки очереди она будет отработана при следующем обращении. В очереди можно хранить таймстампы, чтобы при задержках обработки очереди, превышающих допустимые - сигнализировать об возникновении исключительной ситуации (длительной рассинхронизации).
5 МихаилМ
 
10.05.11
19:30
(0)
му-му
6 supremum
 
10.05.11
19:34
Было дело, но без сервисов, а через файлы, правда сути не меняет.
forum.forum-mista.org/topic.php?id=501458&page=2
7 Fragster
 
гуру
10.05.11
19:41
(4)(6) действия мастера зависят от ответа слейва, вот в чем дело
(5) :Р
8 fisher
 
10.05.11
19:44
(7) Речь же о частном случае, скорее всего? Что будет являться результатом распределенной транзакции? Проведенные документы или что-то еще?
9 supremum
 
10.05.11
19:49
(7) Долбим от сервера транзакцию, если надо отмену, если ответа нет, то ошибку вываливать. Или что-то еще есть?
10 supremum
 
10.05.11
19:51
(8) Немного сложнее реализовывал, но пусть документы.
11 Fragster
 
гуру
10.05.11
20:11
(8) данные мастера и от других мастеров на слейве (мастер он от того, что инициирует всю эту фигню), слейв же консолидирует данные от всех и говорит мастеру, можно ли так делать, или нет. данные меняются ВНЕЗАПНО :(
12 Bober
 
10.05.11
20:49
мастер - вызов метода,
слейв - действия, запись предыдущего состояния объекта в таблицу транзакций
мастер - подтвержение
слейв - удаление
либо:
мастер - отказ
слейв - откат на предыдущую версию
13 Bober
 
10.05.11
20:50
либо вариант с сериализацией новой версии объекта
14 fisher
 
11.05.11
11:09
(11)
1. КАКИЕ ИМЕННО данные? Любые?
2. Если слэйв только консолидирует и выдает разрешения, то опять-таки всё сводится к (4). К нему идут за разрешениями, он посылает или разрешает. Если посылает - вопрос исчерпан. Если разрешает - то дальше по схеме в (4), т.к. если уж он разрешил, то обязан консолидировать результат.
15 Fragster
 
гуру
11.05.11
11:24
(14) он выдает решение и хранит данные о том, что мастер сделал это действие. т.е. на слейв приходит набор записей, он его анализирует и сохраняет у себя - т.к. на его основе будут приниматься решения и для других мастеров. если набор записей "невалидный" - то не записывает и говорит об этом мастеру - тот токатывает транзакцию, если валидный, то записывает и сообщяает об этом мастеру, мастер у себя фиксирует транзакцию. проблема в том, что если мастер у себя по внешним причинам не сможет зафиксировать транзакцию (или не получит ответ от слейва), то на слейве данные будут записаны, а на мастере - нет. ну и при отваливании транзакции в 1с рвется цепочка событий, и в случае неудачи оперативно сообщить об этом слейву мы не сможем
16 Fragster
 
гуру
11.05.11
11:28
грубо говоря - как пример - при РИБ и неактуальных остатках в узле - контролировать остатки в узле, в котором остатки актуальные.
17 Fragster
 
гуру
11.05.11
11:28
отгрузка в Питере со склада в МСК, например
18 Fragster
 
гуру
11.05.11
11:29
терминал не предлагать, да.
19 rs_trade
 
11.05.11
16:06
сделать таблички с некими данными, которые реплицируются средствами SQL сервера. Ну а 1С как то должна взаимодействовать с ними, и выполнять какие либо действия. Это так, в общем.
20 rs_trade
 
11.05.11
16:11
то есть у 1С транзакция локальная, пишешь что то в табличку, ждешь, скуль передает, на том конце обратный процесс. как то так
21 fisher
 
11.05.11
16:16
(15) Слэйв у тебя - по сути координатор распределенных транзакций. Пускай их журнал ведет.
Фиксируй транзакцию на слэйве после подтверждения фиксации на мастерах. В этом случае зафиксированная транзакция на слэйве - успешно зафиксированная распределенная транзакция в целом.
А незафиксированная должна инициировать откаты на мастерах. Откат, ессно, должен подтверждаться. Вся эта инфа должна учитываться в журнале распределенных транзакций координатора (слэйва), чтобы даже после существенных сбоев координатор смог раздать нужные команды. Например, периодически анализировал журнал на предмет неподтвержденных мастерами откатов и рассылал соответствующие команды через веб-сервисы, пиная слэйвы пока не получит подтверждения откатов. Можно также предусмотреть анализ журнала координатора со стороны мастеров.
В любом случае координатор (слэйв) в каждый момент времени будет иметь исчерпывающую инфу о существующей рассинхронизации (её длительности и локализации) и будет способен принимать нужные шаги для восстановления целостности распределенной базы.
22 fisher
 
11.05.11
16:18
"пиная слэйвы пока не полчит подтверждения откатов" читать как "пиная мастера, пока не получит подтверждения откатов".
23 Fragster
 
гуру
11.05.11
16:28
(21) ну, мысль примерно такая и была - раз в период времени отсылать на слейв то, что было реально зафиксировано с последнего такого сеанса, слейв сравнивает с тем, что он зафиксировал и не нужные данные у себя удаляет. (например через регистрацию в плане обмена и учет номеров сообщений)

(инициатором взаимодействия по условию всегда должен быть мастер)

таким образом рассинхронизация может быть только на период между вызовами слейва с подтверждениями, но на этот период БОЛЬШЕ отгрузить не получится, таким образом задача квази решена.
24 fisher
 
11.05.11
16:41
(23) При такой схеме нужно гарантировать, что слэйв получит и корректно обработает информацию о зафиксированных транзакциях мастеров. Этим придется заниматься мастерам. То бишь, соответствующие журналы нужно вести на каждом мастере. Это получается децентрализованная схема, без центрального координатора. Тут уже смотри, как тебе удобней. Плюсы/минусы свои у каждого из вариантов.
25 Fragster
 
гуру
11.05.11
16:44
(24) ну тут уж либо поднять 100500 веб серверов, либо вести журналы во многих местах
26 fisher
 
11.05.11
16:51
(25) Не обязательно. Если речь о том, что баз много, а веб-сервис только на координаторе поднят, то откатывать транзакции могут сами мастера, получая через веб-сервис нужную информацию из журнала координатора. Зато на координаторе всегда будет актуальная инфа и в части остатков и в части состояния синхронизации.
27 МуМу
 
12.05.11
14:07
Да делали. Вопрос принципиальный - в разных БД и разных серверах или просто в разных БД на одном сервере?
28 Fragster
 
гуру
12.05.11
14:08
(27) на разных серверах, которые друг от друга на 4000КМ в максимуме (или сколько там от СПб до Иркутска):)
29 Adept
 
12.05.11
14:38
(0) А в транзакции что то произвольное или просто запись в какую то табличку?