Пользователи наших программных продуктов одновременно работают с набором данных, структура которого представляет собой граф. Разные группы пользователей имеют доступ к разным частям графа в соответствии с правилами доступа. Каждому пользователю необходимо оперативно видеть изменения, которые вносят в граф другие — для того, чтобы избежать конфликтов при обновлении графа.
Персистентное хранение графа обеспечивает наша платформа виртуализации данных, за которой "спрятана" графовая СУБД и другие хранилища. Но постоянно обращаться к СУБД для считывания изменений и передачи их в бэкенд и фронт приложения, конечно, нельзя. Мы построили архитектуру, в которой на стороне бэкенда на Node.JS строятся кэши различных срезов графа. Синхронизация этих кэшей с персистентным хранилищем обеспечивается с помощью механизма подписки. Далее изменения транслируются во фронтенд с помощью протокола websocket.
В результате мы построили решение, позволяющее работать с данными любой сложности, которое можно масштабировать на любое количество пользователей и групп. Мы расскажем о том, как пришли к такому архитектурному решению, исходя из функциональных требований. Также уделим внимание деталям реализации в Node.js.