Двунаправленная синхронизация автономного приложения (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 ответ
Ну, в конце концов, решили подойти к проблеме по-другому. В основном это составляет:
- Минимизируйте объем данных, которые нам нужно синхронизировать, сохраняя как можно больше операций, только в режиме онлайн.
- По возможности передайте данные просто в одном направлении (т.е. либо сгенерированные на сайте и переданные в облако, либо сгенерированные в облаке и отправившие сайт).
- В остальном, где нам нужны данные для поддержки необходимых автономных функций и подлинной двусторонней синхронизации, используйте модель источника событий и обменивайтесь событиями между сайтом и облаком, когда он-лайн.
- Сайты немедленно применяют события к своим данным и сохраняют только те копии событий, которые они еще не смогли передать в облако.
- Облачное приложение будет отслеживать последние события, отправленные на каждый сайт, и запускаться с того момента, когда сайт подключится. Он упорядочивает все события в соответствии с порядком их получения.
- Облако генерирует разрешающие события для любых обнаруженных конфликтов (что в любом случае должно быть редким).
Не то, что мы имели в виду изначально, и не без собственных проблем и недостатков. Но, похоже, наш лучший вариант - двигаться вперед.