Опция, которая может быть простой в реализации и все же довольно эффективной, состоит в том, чтобы рассматривать кучу объектов как непрозрачный BLOB-объект и использовать librsync для их синхронизации. Похоже, что все обновления проходят в одном направлении, от мастера к клиентам, и, вероятно, существует некоторое постоянное представление объектов на клиентах - файла или чего-то еще. Я предполагаю, что это файл для остальной части этого ответа, хотя может использоваться любая последовательность байтов.
Способ, которым он будет работать, заключается в том, что каждый клиент будет генерировать "подпись" librsync своей локальной копии большого двоичного объекта и отправлять эту подпись мастеру. Подпись составляет около 1% от размера капли. Затем мастер будет использовать librsync для вычисления дельты между этой сигнатурой и текущими данными и отправит дельту клиенту, который будет использовать librsync для применения дельты к своей локальной копии большого двоичного объекта.
API librsync прост, а передача сигнатурных / дельта-данных относительно эффективна.
Если это нереализуемо, все же может быть полезно использовать более ручной «основанный на дельте» подход, чтобы избежать необходимости создания версий для каждого объекта. Каждый раз, когда мастер вносит изменения, он должен записывать эти изменения в журнал, записывая, что было сделано и с каким объектом. Управление версиями выполняется на уровне всей базы данных, поэтому каждой записи журнала присваивается номер версии.
Когда клиент подключается, он должен отправить свою версию всей коллекции объектов, а затем сервер может ответить содержимым журнала между версией клиента и самой новой записью. Если обновления данного объекта выполняются путем полной замены содержимого объекта, то вы можете оптимизировать это, отфильтровывая все, кроме самой последней версии каждого объекта. Если мастер также отслеживает, какие версии он отправил клиенту, он может знать, когда безопасно отбрасывать старые записи журнала. Даже если это не отслеживается, вы все равно можете отбросить старые записи журнала в соответствии с некоторой эвристикой (вероятно, просто возраст), и если вы получаете соединение от клиента, чья последняя версия старше, чем ваша самая старая запись в журнале, то вам просто нужно отправить весь набор объектов этому клиенту.