Golos.io: Новая архитектура клиента: производительность сайта и работа с данными
Друзья, в предыдущем посте мы выявили основные проблемы существующей кодовой базы клиента Golos.io, обозначили наши цели и задачи в плане развития.
Теперь давайте поговорим о новой архитектуре клиента и сервисах, над которыми мы работаем.
Скорость работы сайта и обработка данных
Ранее мы уже проводили работы по обновлению зависимостей (react, redux, nodejs, redux-sagas, webpack e.t.c), уменьшали размер бандла (файла, в котором содержится весь код сайта со всем зависимостями), и в итоге нам удалось получить ощутимый прирост производительности. Однако, дальнейшие обновления и уменьшение бандла более не приведут к качественным изменениям производительности. Единственным действенным способом ускорения работы сайта является создание кешируешего слоя.
Это глобальная задача, и называть данную систему кешем не совсем корректно. В нашем представлении «кеширующий слой» – это комплекс систем, состоящий из баз данных и микросервисов. В данный комплекс будут входить сервисы, отвечающие за:
- быстрые ответы, расширяемый и универсальный API;
- полнотекстовый поиск;
- фильтрацию данных.
В упрощенном виде данный подход будет выглядеть следующим образом.
Из этой схемы видно, что у пользователя появляется два соединения, одно из них это прямое подключение к блокчейну для отправки транзакций в сеть, второе подключение (через Socket Gate) используется для получения данных.
В отличие от текущей реализации, данные, необходимые пользователю, будут забираться не напрямую из блокчейн ноды, а через другие слои из сущности под названием Blockchain State Copy.
Система «кеширующего слоя» будет состоять из следующих сервисов:
State Aggregation Service
Данный сервис необходим для агрегации данных, приходящих в блоках и создания копии стейта, эквивалентной стейту блокчейна.
Для защиты от форков сети мы планируем сохранять список транзакций, до невозвратного блока. В случае возникновения форка сети, при использовании данного сервиса появляется возможность откатывать изменения данных в Blockchain State Copy и уведомлять пользователя о возникшей ошибке.Blockchain State Copy
Представляет из себя обычную Базу Данных, содержащую актуальный стейт блокчейна, с возможностью откатить данные до невозвратного блока и накатить новые данные. С данным хранилищем в перспективе будут взаимодействовать Blockchain API Emulation, Extended API Node, и Search Engine.Blockchain API Emulation
Сервис предназначенный для эмуляции (копирования) запросов от клиента к блокчейну, таким образом, как если бы клиент получал данные напрямую из блокчейна. Здесь должны быть реализованы все запросы из блокчейн API, такие как: getDiscussionBy*, getContent, getTrendingTags, getAccountHistory и т.д. Данная нода так же взаимодействет с Blockchain State Copy.SSR - Server Side Rendering
SSR представляет из себя копию основного приложения, но работающего на сервере. Клиент Tolstoy в данный момент работает по такому принципу. Первичный запрос пользователя на получение данных отправляется на SSR. Ответом на данный запрос будет готовый HTML и необходимые JS бандлы. Данная операция необходима для SEO (поисковая оптимизация) и увеличения производительности для слабого железа.Socket Gate
Новая точка подключения, необходимая для корректной работы клиента с обновленной серверной инфраструктурой. Через данный сервис пользователь будет отправлять все запросы, помимо запросов за запись транзакций в блокчейн, и получать различные данные, например такие как онлайн- нотификации. Socket Gate реализует функцию авторизации пользователей, хранит таблицу соотношения каналов и пользователей. В перспективе, с согласия сообщества, на данный сервис можно будет приземлить отправку запросов на запись транзакций в блокчейн, и избавиться от второго соединения.API Router
Высокоуровневый маршрутизатор запросов от Socket Gate к конечным сервисам/микро-сервисам. Данная абстракция была добавлена для того, чтобы обеспечить непрерывное соединение между клиентом и сервером. При добавлении новых сервисов в инфраструктуру у нас нет необходимости обновлять Socket Gate, соответственно у клиента не будет обрывов соединения.Search Engine
Необходим для реализации полнотекстового поиска данных.
Реализация данной ноды возможна только после окончания работ по внедрению State Aggregation Service и Blockchain State Copy. И может представлять из себя любой поисковый движок.Extended API Node
Сервис представляет из себя набор различных API вызовов, которые не были реализованы в блокчейне, однако являются критически необходимыми. Например, фильтрация данных по дате создания с возможностью выбрать посты только с определенными тегами. В целом в данном сервисе могут быть реализованы любые сложные запросы к БД. Данный сервис также зависим от State Aggregation Service и Blockchain State Copy.
В итоге, после реализации всех вышеописанных сервисов мы получим гибкую и высокопроизводительную систему работы с данными, а клиент станет быстрым и удобным.
State Aggregation Service и Blockchain State Copy позволят нам снизить затраты на инфраструктуру, путем уменьшения количества блокчейн seed-node.
Extended API Node позволит пользователям делать сложные запросы с фильтрацией данных, которые невозможно было сделать без использования БД.
А при помощи Search Engine ноды появится возможность избавиться от сомнительно работающего google поиска.
Однако, это еще не полный список необходимых сервисов, чтобы можно было назвать клиент дружественным к пользователю.
Об инфраструктурных сервисах и юзабилити поговорим в следующем посте.
Иллюстрация к посту - Pexels.com
—
Подписывайтесь на официальный аккаунт блог-платформы Golos.io @golosio, чтобы быть в курсе развития проекта! Телеграм для ваших вопросов — https://t.me/golos_support. Лучшее на Голосе — https://t.me/golos_best
Есть предложения, как сделать Golos.io лучше? Пишите в Issues на нашем Github, в наш Телеграм-канал или в чат разработчиков Golos.io в Телеграм!
—
С уважением, команда Golos.io @golosio: @alex-firsov, @bacher, @b1acksun, @chinpu, @dan-kinescop, @dekol, @devall, @format-x22, @insider, @jevgenika, @kucinskaya.alla, @muhazokotuha, @msm72, @nickshtefan, @yulia.rodnikova, @yuri-vlad.