Golos.io: Обзор платформы и выявление узких мест
Друзья, этим постом мы открываем серию публикаций, посвященных планам развития клиента Golos.io. Будет много технической информации, поэтому для удобства весь объем разделили на несколько постов.
Для начала давайте заглянем в историю, определим основные проблемы существующей кодовой базы, обозначим наши цели и задачи.
История
Текущий клиент Golos.io до недавнего времени представлял из себя кальку с клиента Steemit от начала 2017 год. Да, было проведено две адаптации под хардфорки, разработанные командой @goloscore, были переписаны места, отвечающие за взаимодействие с блокчейном, но в глобальном смысле в самом клиенте особо ничего не менялось. Чтобы понять, почему сложилась такая ситуация, надо рассмотреть историю создания Steemit, используемые паттерны и технологии.
Клиент Steemit был разработан очень быстро, за три месяца, однако, при этом в разработке были задействованы современные и актуальные подходы и библиотеки (Isomorphic, Immutable, Server Side Rendering, React, Redux, Redux-Saga, Foundation Framework). Подобная скорость разработки с использованием перечисленных выше технологий заслуживает уважения, но в тоже время ухудшает качество кода и способствует накоплению технического долга.
В итоге в коде Steemit часто встречаются спорные решения.
Например, connect используется практически в каждом компоненте, модуле или контейнере. Подобное использование данного модуля, который призван облегчить работу с данными, к сожалению, только усложняет её и приводит к деградации производительности. Некоторые модули и компоненты представляют из себя нечитаемые массивы, длиной 500 (пятьсот) строк кода и более, при этом большое количество логики сконцентрировано в методе render. Сама структура проекта представляет из себя слабоструктурированное нагромождение файлов.
Большой проблемой является роутинг (маршрутизация) внутри приложения. По непонятной причине для реализации роутинга были использованы регулярные выражения, и маршрутизация приложения сильно связана с кодом, реализованном в redux-saga.
Поскольку клиент написан как «чистый» - каждый отдельно взятый пользователь взаимодействует с блокчейном напрямую, и в случае записи транзакции, и в случае чтения данных из блокчейна, каждый, без исключения, вызов нагружает ноду блокчейна. Из-за высокой нагрузки на ноды и проблем их синхронизации несостоятельность данного подхода при работе с блокчейном становится очевидной.
Проблемы
Основная проблема текущей кодовой базы заключается в том, что она крайне сложна в поддержке, а внедрение нового функционала приводит к еще большему накоплению технического долга.
При увеличении трафика нам необходимо увеличивать количество seed-node golos и приложений tolstoy. Но они весьма ресурсозатратны, и требуют большого количества вычислительных мощностей для корректной работы. При этом периодически происходит рассинхронизация, и на восстановление корректной работы уходит много времени и сил.
Для получения данных используется прямое соединение (через web-socket) к seed-node, то есть все, без исключения, запросы обрабатываются нодой блокчейна, будь то случайный посетитель, пришедший из поисковой системы, или зарегистрированный пользователь. При этом механизмы блокчейна для обработки данных оставляют желать лучшего. Из-за жесткого API, реализованного непосредственно в ноде, мы не можем работать с данными способом отличным от заложенного в ноду, о чем уже писала команда @goloscore. Сами же запросы, такие как getDiscussionsBy*, могут выполняться по несколько секунд, а в случае рассинхронизации вообще могут не отдавать никаких данных. Это не только создает неудобства для конечного пользователя, но и ухудшает индексирование сайта поисковыми системами.
Жестко запрограммированный API, без возможности его быстрого изменения (каждое изменение API требует проведения софтфорка) накладывает дополнительные ограничения на использование данных, которые хранятся в блокчейне. Пользователи давно привыкли получать уведомления о событиях, происходящих с их учетной записью, например, лайки/флаги, новые комментарии к постам, и т.д. Однако, блокчейн нода не может предоставить подобного функционала, не говоря уже о push уведомлениях для мобильных устройств, почтовых уведомлений, верификации учетных записей и другого не менее важного функционала.
Все эти обстоятельства привели нас к тому, что необходимо коренным образом менять архитектуру веб-приложения, для реализации более удобного и современного сервиса, по сравнению с тем, что мы имеем на данный момент.
Однако, невозможно просто взять и все переделать, поскольку проект уже запущен, сайтом пользуется много людей, поэтому мы решили постепенно перестраивать отдельные части сервиса.
Цели и задачи
Перед тем как приступить к внесению серьезных изменений давайте обозначим, чего мы, как команда клиента блокчейна, хотим добиться в итоге:
1. Простота регистрации
Обновить систему регистрация новых пользователей. Она должна быть проста и понятна.
2. Скорость работы сайта
Увеличить производительность, сделать ее сопоставимой с современными веб-ресурсами.
3. Работа с данными
Внедрить гибкую систему фильтрации и поиска контента.
4. Пользовательский интерфейс и юзабилити
Полность обновить дизайн приложения. Он должен соответствовать современным реалиям, а сами компоненты при необходимости легко модифицироваться и/или заменяться.
5. Неизменность клиентского окружения
Синхронизировать настройки вне зависимости от того, каким браузером или мобильным приложением пользуется человек.
6. Сервисы и инструменты
Вынести различные вспомогательные инфраструктурные компоненты в отдельные, независимые сервисы, чтобы при необходимости их можно было дорабатывать и обновлять без ущерба для основного приложения.
Иллюстрация к посту - Yandex
—
Подписывайтесь на официальный аккаунт блог-платформы 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.