База данных, подходящая для синхронизации важного состояния между клиентом и сервером и разрешения опроса для другого состояния?
У меня есть устройство, подобное Raspberry Pi, на котором запущен Debian, у которого около 5000 статусов, которые он обновляет дважды в секунду, из которых 100 считаются важными.
У меня есть клиенты C++ и Python, которые подключаются к этому устройству (точнее, мое приложение C++, работающее на этом устройстве), и мне нужно что-то знать об этом. Для 100 важных статусов клиент должен иметь возможность подписаться на обновления тех, которые ему интересны, чтобы устройство автоматически отправляло обновление клиенту, а не ожидало его опроса. Для других 4900 менее важных статусов клиент при необходимости будет выполнять запрос / ответ по длительному таймеру. Использование полосы пропускания вызывает беспокойство, поэтому я не хочу лишнего трафика из-за чрезмерного опроса.
Мне было интересно, могу ли я использовать более продвинутую базу данных (или любой другой инструмент "гибкой синхронизации состояния"), который сделает большую часть тяжелой работы по этому поводу. У меня есть собственное решение на основе сообщений, которое я использую прямо сейчас, и я надеюсь, что смогу заменить его чем-то более стандартным, чтобы уменьшить технический долг. Мой единственный опыт работы с базами данных связан с SQLite.
Пример того, что я надеюсь сделать на стороне клиента. Предположим, у меня есть 50 коллекций по 100 статусов в каждой (или плоский список из 5000 статусов, та же идея).
//onUpdateNotificationReceived is a function pointer/lambda/handler
interfaceToRemoteSystem.subscribeTo(["importantgroup1"], onUpdateNotificationReceived);
//OR (since the keys are fixed and I don't necessarily need groups):
interfaceToRemoteSystem.subscribeTo(["importantstatus1, importantstatus2, ..., importantstatus100"], onUpdateNotificationReceived);
interfaceToRemoteSystem.query(["group24"], onQueryReplyReceived);
//OR:
interfaceToRemoteSystem.query(["status2401", "status2402", ..., "status2500"], onQueryReplyReceived);
Прочие примечания:
- К устройству будут подключены до 5 клиентов одновременно
- Клиенты - это приложения для Linux и Windows.
- Клиент решает, на какие автоматические уведомления подписаться, а не сервер
- В этих системах нет доступа в Интернет, поэтому нет облачных решений
- Меня не волнует древнее государство, только последнее состояние. Поэтому не нужно беспокоиться о "пропущенных сообщениях", вызванных отключениями, так как клиент должен повторно синхронизировать последнее состояние при повторном восстановлении соединения.
- Все соединения должны быть 1: 1. Клиент открывает прямое соединение с IP-адресом устройства и разговаривает с запущенным на нем демоном. На третьем сервере не может быть посредника.
- Я ограничен 1 ГБ ОЗУ
- Согласно моим исследованиям, некоторые серверы GraphQL (например, Hasura), похоже, предлагают подписки на запросы +, но подписки официально не являются частью GraphQL, и в любом случае нет клиента C++ (на самом деле, только клиенты JS и Python кажутся первоклассными гражданами)