Здравствуйте
КДПВ
Есть RS232-модуль с тремя реле (назовем его «Лампочки»). На Лампочки можно послать команды «on 1» (включить первую лампу), «off 2»,.., «state» (получить состояние всех ламп). Так-же на модуле есть 3 физические кнопки (это важно).
Есть веб-клиенты, в которых можно ткнуть на иконку с лампой чтоб та загорелась. И задать каждой лампочке имя.
На сервере 3 блокирующих процесса (на картинке обозначены синими квадратами с цифрами):
1. Ждет fcgi-запросов от nginx. Если запрос быстрый (сменить имя лампочки, получить состояние из redis), то выполняет. Если запрос медленный (послать команду на Лампочки), то добавляет команду в redis-список
2. Ждет появление команды в списке (redis BRPOP, с таймаутом в 1 секунду), выполняет, результат публикует событие в редисовый pub/sub, снова ждет. Так-же периодически запрашивает состояние Лампочек, и если оно изменилось (понмните про физические кнопки?), обновляет данные в redis и публикует об этом в pub/sub.
3. Сначала слушает fcgi. Установив постоянное соединение, подписывается на redis-рассылку (изменение состояния, имени лампы), проксирует эти события на клиенты в формате EventSource. Этот процесс нужен чтобы все веб-клиенты оперативно получали обновления. Например, один клиент поменял имя лампочки, сообщил об этом в Pub/Sub, все остальные тут-же об этом узнали и запросили новые данные.
Если вы дочитали до сюда, то вам скорее всего нечем заняться в данный момент и вы с удовольствием поразмышляете над следующим вопросом:
Вопрос. Очевидно, схема переусложнена. Вот все говорят «выбирай инструмент под задачу». Здесь мы выясняем истину, какой инструмент идеально подойдет под эту задачу и как бы он эту задачу упростил (учитывая, что процесс №2 может, вместе с Лампочками быть на другом устройстве, соединяясь с остальным бэкендом по сети).
Использованные инструменты: c (ioclt, fcntl), lua, redis, hiredis, libfcgi, nginx, yajl
Бонусный вопрос: как обозвать процессы 1, 2 и 3? У меня никаких идей