Для этого я использую differential execution.
(кстати, слово «раб» неудобно для некоторых людей, с разумом.)
Для каждого удаленного сайта, есть последовательный файл на основном сайте, представляющее то, что существует на удаленном узле.
Существует процедура на основном сайте, проходящая через основную коллекцию, и по мере ее прохождения читает соответствующий файл, обнаруживая различия между существующим на удаленном сайте и тем, что должно существовать. Эти различия производят дельта, которые передаются на удаленный сайт. В то же время процедура записывает новый файл, представляющий, что будет существовать на удаленном сайте после обработки дельт.
Преимущество этого заключается в том, что оно не зависит от обнаружения событий изменений в первичной коллекции, поскольку часто эти события изменения ненадежны или могут быть отменены или отменены другими изменениями, поэтому вы сокращаете ненужные передачи на удаленный сайт.
В случае, если коллекции являются простыми списками вещей, это сводится к наличию локальных копий удаленных коллекций и выполнение алгоритма diff
для получения дельта. Вот несколько таких алгоритмов:
Если коллекции могут быть отсортированы (например, ваш A, B, C пример), просто запустить цикл слияния:
while(ix<nx && iy<ny){
if (X[ix] < Y[iy]){
// X[ix] was inserted in X
ix++;
} else if (Y[iy] < X[ix]){
// Y[iy] was deleted from X
iy++;
} else {
// the two elements are equal. skip them both;
ix++; iy++;
}
}
while(ix<nx){
// X[ix] was inserted in X
ix++;
}
while(iy<ny>){
// Y[iy] was deleted from X
iy++;
}
Если коллекции не могут быть отсортированы (примечание отношения к Levenshtein distance),
Until we have read through both collections X and Y,
See if the current items are equal
else see if a single item was inserted in X
else see if a single item was deleted from X
else see if 2 items were inserted in X
else see if a single item was replaced in X
else see if 2 items were deleted from X
else see if 3 items were inserted in X
else see if 2 items in X replaced 1 items in Y
else see if 1 items in X replaced 2 items in Y
else see if 3 items were deleted from X
etc. etc. up to some limit
Производительность, как правило, не является проблемой, так как процедура не должна быть запущена на высокой частоте.
Есть crude video demonstrating this concept и source code where it is used for dynamically changing user interfaces.
Является ли намерение привести рабов в согласие с мастером? Если да, то почему C удаляется из Slave 1? Если нет, то на каком основании мастер решил, что Slave 1 больше не нужен C? Если цель является конечной последовательностью, разве мастер просто не должен знать, что у каждого раба есть в коллекции? Как подчиненные будут сообщать мастеру, какую информацию они имеют в настоящее время? Как раб мог потерять (или получить) информацию, если они не могут добавлять или удалять предметы самостоятельно? Являются ли элементы изменчивыми? –
@JonathanLeffler Yikes, это была ошибка. Да, цель состоит в том, что подчиненные должны отражать основную коллекцию и что мастер управляет тем, что находится в других коллекциях. Я должен был упомянуть, что коллекции подчиненных могут меняться в зависимости от того, когда подчиненный узел подключился к сети. – haste