Внедрение кэшированных локальных данных, сокращенная функциональность при автономной работе и надежный обмен сообщениями в соответствии с потребностями отдельного приложения. В идеале комбинация этих элементов должна практически скрыть данные о состоянии подключения от пользователя. Достижение этой цели выдвигает ряд задач при проектировке.
- Нужно ли кэшировать данные локально для поддержки автономной работы?
- Как можно сохранить кэшированные данные для последующей загрузки?
- Как должно реагировать приложение при запросе пользователя на выполнение операции?
- Должны ли отдельные операции быть запрещены в автономном режиме?
- Как можно реализовать надежный обмен сообщениями, чтобы гарантировать обновление данных приложения после восстановления подключения?
Кэширование данных и локальное обновление. Необходимо проанализировать требования приложения и проверить типы данных, которые оно использует. Установите точки внутри приложения, в которых происходит обмен данными между сервером и приложением. Требуется ли непосредственный доступ к серверу? Может ли приложение надежно работать с кэшированными данными, или нужно сохранять обновления до тех пор, пока не появится возможность взаимодействия с сервером? Устранение этой зависимости от доступа к серверу в режиме реального времени также снижает зависимость от интерактивного подключения к сети. В идеале приложение становится таким же продуктивным при отсутствии подключения, как и при его наличии.
Основным фактором при таком подходе являются ограничения, установленные в отношении того, насколько согласованными должны быть данные. Использование кэшированных данных означает использование потенциально устаревших, неактуальных данных. Некоторые приложения допускают использование устаревших данных без каких-либо проблем. Например, если данные в значительной мере являются статическими и редко изменяются, они идеально подходят для кэширования на устройстве. Если же обновление данных представляет исключительную важность для других систем, то кэширование обновлений для последующей загрузки может оказаться неприемлемым.
Имеется несколько решений для хранения кэшированных данных. Если в приложении используется платформа Microsoft .NET* Framework, оно может применять объект ADO.NET
DataSet со встроенной функциональностью преобразования данных в формат XML и сохранения в виде файла на диске. Следует ли использовать локальную базу данных? Для карманных ПК и устройств под управлением Windows* CE одним из решений для хранения данных в локальной базе является Microsoft SQL Server* CE. Что если развернуть своего рода систему очереди сообщений, которая хранит данные локально при работе в автономном режиме? Кроме того, приложение может реализовать свой собственный механизм хранения данных на файловой основе. Существуют самые разные возможности. Одни из них лучше подходят для конкретных сценариев, чем другие. Например, если приложению требуется кэшировать большое количество данных, использование локальной базы данных будет лучшим решением, чем вариант с хранением данных в файловом хранилище.
Сокращенная функциональность при выполнении операций в автономном режиме. Другим ключевым фактором при проектировке приложений является ответ на вопрос, достаточно ли хорошо работает приложение с меньшим количеством функций, когда оно не подключено к сети.
Какими будут последствия кэширования всех данных и разрешения пользователям получать доступ к ним в автономном режиме? Если данные поступают из корпоративного хранилища данных, которое должно постоянно обновляться, а устаревшие данные загружаются в систему при восстановлении подключения, эти устаревшие данные, поступающие с устройства, могут нарушить синхронизацию всего хранилища и даже быть записаны поверх более новых важных данных.
Проанализируйте каждую функцию своего приложения и определите, может ли оно использовать кэшированные данные или кэшировать обновления для последующей загрузки или вам следует запретить доступ к данной функции из-за ее зависимости от активного сетевого подключения. Подумайте о возможных последствиях, прежде чем разрешать пользователям работать с данными, которые быстро устаревают. Такой вид встроенного анализа обеспечивает пользователям по крайней мере равноценный уровень функциональности приложения при работе в автономном режиме. Это решение гораздо предпочтительнее полного запрета доступа к приложению.
Надежный обмен сообщениями. Если в приложении будет часто меняться состояние подключения, оно должно иметь какой-то механизм, обеспечивающий загрузку обновлений на сервер и обновление данных на устройстве с помощью внесения последних изменений. В приложении может применяться не зависящий от состояния механизм взаимодействия, работающий по принципу "сохранить и отправить".
Следует помнить о существовании ряда проблем при использовании веб-служб для надежной выдачи сообщений. Для взаимодействия веб-службы используют подключение к сети. Если устройство не подключено, оно не может взаимодействовать с сервером, на котором размещены веб-службы. А значит, в протоколах веб-служб отсутствует встроенный механизм для хранения данных до тех пор, пока не будет восстановлено подключение. Для этого нужно написать собственный код специального решения.
Одним из решений, которое обеспечивает такую функциональность, является очередь сообщений. Очередь сообщений работает по принципу простой очередности, когда сообщения (данные) сохраняются в очереди в том порядке, в котором они поступили. При извлечении данных из очереди они извлекаются в том же порядке, в каком они были добавлены. Эта технология позволяет после восстановления подключения загружать на сервер данные, добавленные в очередь сообщений в автономном режиме, в правильной последовательности. Подключено устройство к сети или нет, данные загружаются на сервер в таком же порядке, как при постоянном подключении устройства к сети. Обновления никогда не обрабатываются хаотично. Более старые обновления никогда не записываются поверх более новых. На рынке представлены несколько систем очереди сообщений, Microsoft Message Queuing (MSMQ) и IBM MQ Services — лишь два из них. Платформа Microsoft .NET Framework содержит библиотеки классов, которые поддерживают взаимодействие через MSMQ.