Сервіс і плагіни зберігання
Компонент зберігання забезпечує рівень абстракції рівня бази даних, що використовується у Fledge. Абстракція зберігання явно не є рівнем SQL, і інтерфейс, який він пропонує клієнтам рівня зберігання; сервіс пристрою, API і процес надсилання, навмисно не є інтерфейсом SQL, щоб полегшити заміну базового зберігання будь-яким механізмом зберігання без використання SQL або навіть простим механізмом зберігання файлів. Для структурованих і неструктурованих даних, які зберігаються на рівні зберігання, можна використовувати різні плагіни.
Три вимоги, які призвели до архітектури плагінів та відокремлення доступу до бази даних у мікросервіс у Fledge, є наступними:
- Бажання мати можливість підтримувати різні механізми зберігання даних відповідно до вимог розгортання та клієнтів. Наприклад, SQL, no-SQL, в пам'яті, резервне сховище (диск, SD-карта тощо) або прості файлові механізми.
- Можливість відокремити сховище від південного та північног сервісу Fledge і дозволити розподілення Fledge між кількома фізичними апаратними компонентами.
- Забезпечити гнучкість, щоб дозволити вилучати компоненти з розгортання Fledge, наприклад, вилучити буферизацію і мати просту реалізацію Fledge як маршрутизатора переадресації без зберігання.
Використання JSON
Існує три різні причини, чому JSON використовується на рівні зберігання даних, а саме
- REST API використовує JSON для кодування корисного навантаження в кожній точці входу в API. Це найкращий тип корисного навантаження для всіх REST-інтерфейсів у Fledge. Варіант використання XML був розглянутий і відхилений, оскільки переважна більшість REST-інтерфейсів зараз використовують JSON, а не XML. JSON, як правило, більш компактний і легший для читання, ніж XML.
- Інтерфейс між загальним рівнем зберігання і плагіном також передає запити і результати у форматі JSON. Частково це зроблено для того, щоб зробити його сумісним з REST-навантаженнями, а частково для того, щоб надати розробнику плагіна гнучкість і можливість перенести функціональність на рівень плагіна, щоб мати змогу використовувати специфічні особливості системи зберігання даних з найбільшою ефективністю.
- Деякі структури, які зберігаються, самі є документами у форматі JSON. Передбачається, що в цьому випадку вони залишаться у форматі JSON на всьому шляху до самої системи зберігання і будуть збережені як JSON, а не перекладені. Ці JSON-структури транспортуються в JSON-структурі корисного навантаження запиту (або відповіді) і будуть відправлені як об'єкти в межах цього корисного навантаження, хоча вони не інтерпретуються як щось інше, ніж дані, які будуть зберігатися на рівні зберігання.
Вимоги
Рівень зберігання являє собою інтерфейс для збереження даних для пристрою Fledge, всі збережені дані будуть зчитуватися або записуватися через цей рівень зберігання. Сюди входять
- Дані конфігурації - це набір JSON-документів, проіндексованих за ключем.
- Дані зчитування - показання, що надходять з пристрою, які буферизуються протягом певного періоду часу.
- Дані користувача та облікові дані - це ім'я користувача, паролі та сертифікати, пов'язані з користувачами Fledge API.
- Дані журналу аудиту - це журнал значущих подій за час роботи Fledge.
- Метрики - різні модулі будуть зберігати метрики продуктивності, такі як кількість введених, виведених даних тощо. Вони будуть періодично записуватися цими моделями у вигляді кумулятивних підсумків. Вони будуть збиратис я збирачем статистики, а інтервальна статистика значень буде записуватися в постійне сховище.
- Записи завдань - статус та історія завдань, які були заплановані у Fledge.
- Гнучкі схеми - на рівні зберігання повинно бути написано, що схема, за умови наявності базового механізму зберігання, фіксується не самим рівнем зберігання, а реалізацією зберігання і додатком (Fledge). Зокрема, набір таблиць і стовпців у цих таблицях не є попередньо сконфігурованим у компоненті рівня зберігання (якщо припустити, що базове сховище даних базується на схемі).
Мова реалізації
Ядро платформи Fledge до цього часу було написано з використанням Python, але для рівня зберігання було прийнято рішення реалізувати його на C/C++. Існує ряд факторів, які необхідно взяти до уваги в результаті цього рішення.
- Вибір бібліотеки, зроблений для реалізації на Python, більше не є дійсним, і необхідно зробити вибір на користь C/C++.
- Загальний код, такий як API управління мікросервісами, не може бути використаний повторно, тому необхідна реалізація на C/C++.
Сервіс зберігання відрізняється від інших сервісів Fledge тим, що він підтримує лише плагіни, скомпільовані у спільні об'єкти, які мають визначений інтерфейс C. Сам код плагіна може бути написаний іншими мовами, але він має бути скомпільований у C-сумісний спільний об'єкт з використанням угод виклику C.
Причини вибору мови
Спочатку передбачалося, що весь продукт Fledge буде написаний на Python, але після першої демонстраційної версії почали з'являтися проблеми з обґрунтованістю цього вибору для реалізації такого продукту, як Fledge. Ці проблеми такі;
- Масштабованість - Python по суті є однопотоковою мовою через глобальне блокування інтерпретатора (GIL), яке дозволяє виконувати лише один оператор Python в будь-який момент часу.
- Переносимість - Коли ми почали більше працювати з OSIsoft та ARM, стало зрозуміло, що можливість перенесення Fledge або деяких його компонентів на вбудоване обладнання стане для нас все більш необхідною. Зокрема, обговорювалася платформа ARM mbed. Python не доступний на цій платформі та багатьох інших вбудованих платформах.
Якщо Python не буде мовою для реалізації в майбутньому, то було вирішено, що рівень зберігання даних, як щось, що ще не розпочато, може бути краще реалізовано в інший спосіб. Оскільки проект базується на мікросервісах з REST API між ними, то можна змішувати та поєднувати реалізацію різних компонентів між різними мовами.
Рівень зберігання є окремим мікросервісом і не пов'язаний безпосередньо з будь-яким кодом Python, зв'язок здійснюється лише через REST API. Тому рівень зберігання може реалізовувати модель потоків, яка найкраще йому підходить і не прив'язана до моделі потоків Python, що використовується в інших мікросервісах.
Вибір мови C/C++ ґрунтується на тому, що вона є загальнодоступною на всіх платформах, на яких, за нашими прогнозами, Fledge може працювати в осяжному майбутньому, а також на досвіді, який має команда.
Вибір бібліотеки
Однією з ключових бібліотек, яку необхідно вибрати для C/C++, є бібліотека JSON, оскільки в мові немає власної підтримки для цього. Для цього існує багато бібліотек, наприклад, rapidjson, Jansson та багато інших. Щоб знайти найбільш підходящу, потрібно провести певне дослідження. Фактори, які слід враховувати при виборі бібліотеки, наведені нижче у порядку важливості;
- Функціональність - очевидно, що будь-яка обрана бібліотека має надавати потрібну нам функцію.
- Займана площа - Займана площа є основною проблемою для Fledge, оскільки ми хочемо працювати на обмежених пристроях з ймовірністю того, що в майбутньому пристрій, на якому ми хочемо працювати, може стати ще меншим, ніж ми розглядаємо сьогодні.
- Безпека потоків - Передбачається, що з причин масштабованості та природи REST-інтерфейсу у реалізації буде використано декілька потоків, тому безпека потоків є основною проблемою при виборі бібліотеки.
- Продуктивність - Будь-яка обрана бібліотека повинна бути достатньо продуктивною у виконанні роботи, яку вона виконує, щоб бути розглянутою. Ми повинні уникати вибору повільних або роздутих бібліотек, якщо ми прагнемо працювати на апаратному забезпеченні з обмеженими можливостями.
Вибір бібліотеки JSON також варто розглянути; оскільки об'єкти JSON передаються через інтерфейс плагіна, вибір бібліотеки C++ обмежить використання C++ як мікросервісом, так і плагінами. Можливо, краще використовувати бібліотеку на основі C і, таким чином, мати гнучкість у реалізації на C або C++ як для самого сервісу, так і для плагіна.
Іншим ключовим вибором бібліотеки для підтримки REST-інтерфейсу є бібліотека HTTP, яка може бути використана для підтримки розробки REST-інтерфейсу і здатна підтримувати кастомні поля заголовків і HTTPS. Знову ж таки, їх багато: libmicrohttpd, Simple-Web-Server, Proxygen. Вибір тут також має бути зроблений за тими ж критеріями, що описані вище.
Безпека потоків, ймовірно, також буде важливою, оскільки передбачається, що рівень зберігання буде багатопотоковим і майже напевно використовуватиме асинхронні операції вводу/виводу.