Недавно мы внедрили это решение, однако наша база данных была достаточно простой, и у нас был один метасервер (мы называем его мета-сервером, так как это наш сервер, который содержит только идентификаторы), и у нас есть серверы данных. У нас есть три сервера данных, которые выполняют трехстороннюю синхронизацию. Первоначально у нас было только три сервера, но вставка новых идентификаторов была проблемой, и мы не хотели использовать GUID, потому что он не читается человеком.
Итак, мы ввели концепцию IdentityServer (мы назвали его MetaServer), в которой размещается простая веб-служба и простая база данных, база данных состоит из таблиц, в которых используются только Identities, для проверки синхронизации используются Hash и LastUpdate, Hash и LastUpdate.
Например, на Meta Server есть следующие две таблицы:
Tickets
TicketID (Primary Key,Identity)
LastUpdate (DateTime)
Hash (Hash of Ticket)
Tasks
TaskID (Primary Key, Identity)
LastUpdate (DateTime)
Hash (Hash of Task)
Теперь серверы данных будут содержать билеты следующим образом,
Tickets
TicketID (Primary Key)
Subject
Message
...
...
Tasks
TaskID (Primary Key)
Subject
Message
...
...
И наш метод Save в ObjectContext выглядит следующим образом:
Task task = new Task();
task.TaskID = MetaService.GetNewTaskID();
...
...
// following is save method, checking insert or update, as it is used in
//synchronization, thats why i wrote it like this
void SaveTask(Task task){
Task copy = ObjectContext.Tasks.FirstOrDefault(x=>x.TaskID==task.TaskID);
if(copy==null){
copy = new Task();
ObjectContext.Tasks.AddObject(copy);
}
CloneData(task,copy);
ObjectContext.SaveChanges();
}
Чтобы выполнить синхронизацию, я бы предложил добавить такую таблицу, которая будет сохранять каждое изменение в метасервере (мастер-сервере)
Changes
ChangeID
ChangeType = Insert,Update,Delete
ChangeTable
ChangeKey
ChangeTime
Который затем каждый сервер данных может читать с Meta Server и обновлять изменения ...