Двунаправленная синхронизация автономного приложения (Windows, фильтрация, встроенная БД)

Мы разрабатываем приложение, в котором есть локально установленный компонент (Windows Service + UI, взаимодействует с локальным оборудованием), который синхронизирует свои данные с облачным приложением Azure (централизует данные, предоставляет отчеты и т. Д.). Локальный компонент должен иметь возможность работать в автономном режиме (до недели на удаленных узлах без подключения). Кроме того, на сайте может быть несколько компьютеров, на которых размещено приложение, и каждый из этих локальных экземпляров приложения должен синхронизироваться друг с другом, даже если они отключены от облачного приложения.

  • Мы ожидаем, что от 10 до 100 сайтов на предприятие будет иметь до 10 локальных приложений.
  • Мы в первую очередь разработчики.NET/C#.
  • Фильтрация применяется на уровне записи и требуется, главным образом, для предоставления доступа к новым сайтам / машинам через иногда ограниченные WAN-соединения и сокращения объема данных, передаваемых и хранящихся на сайте на постоянной основе.
  • Мы бы предпочли придерживаться Azure/SQL Azure/.NET.

Я искал различные варианты, но все, кажется, не хватает:

  • MS Sync Framework, похоже, был заброшен (я не прав? Нет поддержки SQL Compact 4?). Кроме того, кажется, что у него есть некоторые ограничения в отношении фильтрации, он выглядит довольно непрозрачным с точки зрения его мониторинга и устранения проблем и имеет возможные проблемы с фрагментацией знаний при применении фильтрации.
  • Встроенные реляционные базы данных не-MS либо не предоставляют механизма синхронизации, ограниченные концентратором, либо, по-видимому, не имели обновлений в течение года (например, empress).
  • Базы данных без SQL (и я признаю, что я только просмотрел около 20 из них, а затем только поверхностно), похоже, больше сосредоточены на распределении данных и загрузке запросов, чем на том, чтобы фактически реплицировать данные по всем узлам. Я не смог найти ни одного, который позволил бы синхронизацию между узлами в локальной сети, когда они отключены от глобальной сети.

Даже игнорируя желание синхронизировать одноранговые узлы в локальной сети при отключении от облака, я не смог найти ни одной встроенной базы данных, которая поддерживает синхронизированную синхронизацию на уровне записей из.NET/Azure.

Кто-нибудь сталкивался с подобной проблемой и нашел решение? Имеет ли смысл строить собственное решение в этом случае?

1 ответ

Решение

Ну, в конце концов, решили подойти к проблеме по-другому. В основном это составляет:

  • Минимизируйте объем данных, которые нам нужно синхронизировать, сохраняя как можно больше операций, только в режиме онлайн.
  • По возможности передайте данные просто в одном направлении (т.е. либо сгенерированные на сайте и переданные в облако, либо сгенерированные в облаке и отправившие сайт).
  • В остальном, где нам нужны данные для поддержки необходимых автономных функций и подлинной двусторонней синхронизации, используйте модель источника событий и обменивайтесь событиями между сайтом и облаком, когда он-лайн.
  • Сайты немедленно применяют события к своим данным и сохраняют только те копии событий, которые они еще не смогли передать в облако.
  • Облачное приложение будет отслеживать последние события, отправленные на каждый сайт, и запускаться с того момента, когда сайт подключится. Он упорядочивает все события в соответствии с порядком их получения.
  • Облако генерирует разрешающие события для любых обнаруженных конфликтов (что в любом случае должно быть редким).

Не то, что мы имели в виду изначально, и не без собственных проблем и недостатков. Но, похоже, наш лучший вариант - двигаться вперед.

Другие вопросы по тегам