Изменения документа Примеры

Редактировал(а) Alexandr Fokin 2026/08/26 19:05

От версии 8.23
отредактировано Alexandr Fokin
на 2026/06/18 22:06
Изменить комментарий: Update document after refactoring.
К версии 8.34
отредактировано Alexandr Fokin
на 2026/07/27 20:22
Изменить комментарий: К данной версии нет комментариев

Сводка

Подробности

Свойства страницы
Содержимое
... ... @@ -44,7 +44,7 @@
44 44  Также решает проблему, если дочерний процесс содержит ожидание (например асинхронный запрос-ответ), тут будет конкуренция сигнала от хендлера ответа к родительскому процессу.
45 45  )))
46 46  |(((
47 -Вариант N4:
47 +Вариант 4:
48 48  
49 49  SimpleStreamTrigger + Timer (один из лучших вариантов).
50 50  
... ... @@ -61,7 +61,34 @@
61 61  но пишущей нагрузки будет меньше чем в варианте 1 (запись - только на активации новым сигналом).
62 62  * Если сигналов нет, то нет пустых срабатываний в отличие от варианта 2 (т.к. нет поступления сигнала от дочерних процессов).
63 63  )))
64 +|(((
65 +|Вариант №5: Trigger + Счетчик в [[Redis>>doc:Разработка.Базы данных.NoSQL.Ключ-значение структура.Redis.WebHome]].
66 +|InMemory счетчик, нагрузка на БД и конкуренция.
67 +Дочерний процесс уменьшает счетчик. И публикует событие только если счетчик достиг 0.
68 +Совмещает преимущества из варианта 1.1 (при этом не нагружает БД), в случае ошибки переключается на режим 1.4.
69 +|(((
70 +Проблема: изменение счетчика не привязано к основной транзакции БД.
71 +
72 +Возможно:
73 +
74 +1. В начале транзакции (или шага) атомарно проверяем MemberSet, если есть запись то удаляем и увеличиваем счетчик на 1 (означает что процесс уже увеличивал счетчик, но потом было падение).
75 +1. До коммита транзакции атомарно добавляем значение в MemberSet и уменьшаем счетчик на 1. Если счетчик равен 0, то публикуем TriggerEvent (в ручную компенсацию добавляем вызов из пункта 1 (при откате изоляции шага и компенсации транзакции)).
76 +1. После коммита транзакции удаляем запись из MemberSet.
77 +1. Trigger получает событие. (Необязательно) в хендлере может првоерить значения счетчиков и MemberSet.
64 64  )))
79 +|(((
80 +В случае обнаружения повреждения обработка фактически переходит в режим 1.4: начинает публиковать событий каждый раз и используется задержка.
81 +
82 +Примеры проблемы:
83 +
84 +* Падение InMemory хранилища. Предполагается режим без снимков и удаление ключей.
85 +Обнаружение (со стороны дочернего процесса) через отсутствие ключей (проверяется в транзакции).
86 +* Дублирование обновления счетчика.
87 +Обнаружение (со стороны дочернего процесса) через значение счетчика < 0.
88 +Обнаружение (со стороны триггера) через активацию триггера (поступления сигнала от процесса), при этом обнаруживается что не все процессы завершены.
89 +)))
90 +)))
91 +)))
65 65  |2|(% style="width:188px" %)Transaction outbox stream process.|(% style="width:1268px" %)[[image:TransactionOutbox. Sequence.jpg]]
66 66  |3|(% style="width:188px" %)Stream trigger|(% style="width:1268px" %)(((
67 67  | |(((
... ... @@ -100,3 +100,27 @@
100 100  |(% style="width:888px" %)Родительский процесс ожидает завершения дочерних процессов (см. пример 1).|(% style="width:266px" %)
101 101  )))
102 102  )))
130 +
131 +----
132 +
133 +==== Внутренние ссылки: ====
134 +
135 +====== Дочерние страницы: ======
136 +
137 +{{children/}}
138 +
139 +====== Обратные ссылки: ======
140 +
141 +{{velocity}}
142 +#set ($links = $doc.getBacklinks())
143 +#if ($links.size() > 0)
144 + #foreach ($docname in $links)
145 + #set ($rdoc = $xwiki.getDocument($docname).getTranslatedDocument())
146 + * [[$escapetool.xml($rdoc.fullName)]]
147 + #end
148 +#else
149 + No back links for this page!
150 +#end
151 +{{/velocity}}
152 +
153 +----