Чтобы интегрировать различные инструменты, которыми я пользуюсь, я хочу написать распределенную систему, которая будет принимать различные события (полученную почту, сообщения в телеграм, информацию от различных приложений), анализировать их и использовать различные способы связи со мной, чтобы выдавать мне те или иные сообщения. Существует большое количество различных low-code и no-code решений, которые позволяют организовать похожие вещи, но мне интересно реализовать это самостоятельно.
Одним из важных компонентов в этой системе является подсистема передачи сообщений. Поскольку сама по себе система опирается на передачу сообщений (а какой-то большой срочности в реализации всей системы нет), то я фокусирую свое внимание именно на инфраструктуре, в частности на системе передачи сообщений.
Таким образом я планирую заняться созданием системы передачи сообщений. Надсистемой является любая распределенная система, работающая на основе передачи сообщений, в частности мой (эфемерный) проект PA (Personal Assistant).
У меня есть опыт написания сетевых приложений и библиотек для сетевого взаимодействия, но помимо этого требуется также разработать протокол для доставки сообщений через распределенную сеть взаимосвзанных модулей. Поскольку сами по себе модули могут быть написаны на разных языках программироания (они должны быть легко заменены на аналогичные -- это тоже одно из требований к системе), существуют ограничения на протокол и формат взаимодействия.
Поскольку опыта разработки протокола у меня нет, я предполагаю, что могу совершить различные ошибки, которые уже решены другими протоколами, поэтому в данный момент я провожу этап исследований аналогов. Как оказалось, существует большое количество готовых решений по связи между компонентами распределенной системы, но большинство из них не удовлетворяют как минимум одному из следующих условий: открытый исходный код, возможность развернуть на собственной инфраструктуре, низкие системные требования, наличие библиотек для использования в различных языках программирования.
Одним из решений, которое удовлетворяло озвученным условиям, оказалось zeromq, поэтому я начал изучать его документацию. В ходе дискуссии с коллегами-программистами (тоже этап исследования) выяснилось, что zeromq сейчас признан устаревшим, а те же авторы разработали nanomsg (и еще более новую версию nng). К сожалению, для них нет готовых библиотек для связи с Common Lisp (этот язык был выбран для реализации прототипа, потому что захотелось), но можно опираться на более старые библиотеки, плюс попрактиковаться в создании таких библиотек для связывания.
Таким образом ближайшие этапы:
- написать систему для передачи сообщения "hello, world" на языке Си
- написать систему для организации защищенного канала связи (на языке Си)
- написать библиотеку для работы с nng из Common Lisp
- написать систему для передачи сообщения "hello, world" на языке Rust
- изучить возможность передачи сообщений в nng-сокет без использования nng