Когда речь идет о фреймворках, необходима контролируемая и последовательная архитектура, которая поощряет передовой опыт и принципы проектирования для создания расширяемых и масштабируемых систем. Marble.js заставляет пользователя мыслить по-другому, использовать непопулярные парадигмы и семантику, но прежде всего устанавливает последовательный способ решения проблем с многоразовыми концепциями, которые легко подключаются. Нет никаких сомнений в том, что это самоуверенный фреймворк. Единообразный способ представления асинхронных вычислений (называемый «эффектом») является наиболее характерным строительным блоком. Но помимо доступного набора функций и обязательной документации, которая стоит за каждым фреймворком, наиболее важную роль играет сообщество, которое ведет его в правильном направлении. С ростом популярности концепций функционального программирования в последние годы Marble.js нашел свою нишу.

Предстоящий основной выпуск v3.0 - это не следующая революция, а скорее эволюция, которая полностью определяет философию, лежащую в основе. Давайте кратко рассмотрим наиболее важные функции, которые появятся в ближайшие недели.

tl;dr

  1. Совершенно новый движок HTTP - лучшая производительность, новые возможности.
  2. Официальная поддержка микросервисов здесь.
    @marblejs/messaging - новый модуль для связи на основе событий.
  3. Асинхронные считыватели - разрешают асинхронные зависимости при запуске приложения.
  4. Ведение журнала - настраиваемое готовое решение для ведения журнала сервера / службы
  5. fp-ts 2.0

Переработана обработка HTTP-запросов.

Базовый протокол HTTP / 1.1 может быть непростым, особенно при попытке поместить его в рамки правильного мышления, основанного на событиях. В самой базовой версии каждый запрос должен сопровождаться соответствующим ответом. Это не полнодуплексная связь - сначала клиент делает запрос, а затем сервер может ответить на него. Это означает, что вы не можете простым способом выборочно пропускать / фильтровать / комбинировать входящие запросы, потому что каждое входящее событие должно быть обработано. Обработка, обеспечиваемая фреймами протокола, очень ограничивает возможности. Некоторое время назад Бен Леш говорил о только что молодой Marble.js v0.x. Он упомянул некоторые потенциальные варианты использования, которые теоретически можно использовать с Observable запросов, например, например, ожидание с обработкой, пока не будет запущен какой-либо другой запрос. До сих пор Marble.js 2.x отражал каждый входящий запрос как отдельный поток, что не позволяло разработчику выполнять так называемую магию Rx.

Версия 3.0 представляет новый, переработанный и оптимизированный механизм обработки HTTP-запросов, который можно легко адаптировать к потребностям разработчика. Это огромная веха для структуры, выводящая потенциальные возможности на новый уровень. Marble.js 3.0 уточняет обработку запросов на основе событий, которую заслуживает реактивная парадигма. Совершенно новый механизм разрешения маршрутов HTTP / 1.1 может работать в двух режимах - непрерывный и прерывистый. Второй способ - это метод по умолчанию, который применяется к 99% возможных вариантов использования, которые вы можете смоделировать с помощью REST API. Под капотом он применяет обработку ошибок по умолчанию для каждого входящего запроса, делая обработку запроса безопасной, но запутанной в одноразовом потоке. Последний 1% - для всех сумасшедших. Новый непрерывный режим позволяет обрабатывать поток входящих запросов плавно, без отсоединения. Имея это, вы можете, например, buffer / throttle / group входящих запросов, открывающих возможности для будущей интеграции с протоколами HTTP / 2 и HTTP / 3. Рассматривая каждый входящий запрос как событие, которое всегда должно быть обработано, c ontinuous режим предполагает необходимость добавления настраиваемого механизма обработки ошибок для каждого обработанного события и сопоставления ответа с соответствующим запросом.

Это было бы невозможно без того факта, что отныне каждый Effect с нетерпением загружается при запуске приложения, а это означает, что каждый маршрут инициализируется собственным объектом Observable. Опять же, это дает вам еще один набор возможностей с точки зрения оптимизации, например, вы можете разрешить все необходимые средства чтения контекста во время запуска приложения.

Микросервисы

Как упоминалось в начале, Marble.js определяет единый интерфейс для асинхронной обработки входящих событий. Его интерфейс очень похож на другие популярные библиотеки, которые вы можете найти во внешнем интерфейсе, например -
redux-observable или ngrx/effects. Обе библиотеки оказали огромное влияние на дизайн и архитектурные решения. Глядя на определение типа Effect в Marble.js, вы можете легко заметить, что это всего лишь функция, обрабатывающая входящие данные в форме Observable-подобных потоков, которые создают событие обработка легко адаптируется к различным видам транспортных протоколов.

Но позвольте мне вернуться к популярному словечку в разработке программного обеспечения ...

… микросервисы.

Им нужен легкий подход к общению друг с другом. HTTP / 1.1, безусловно, является допустимым протоколом, но есть варианты получше, особенно с точки зрения производительности. Хотя в прошлом вы могли использовать REST в качестве уровня взаимодействия служб, все больше и больше проектов переходят на архитектуру, управляемую событиями. Когда служба выполняет некоторую часть работы, в которой могут быть заинтересованы другие службы, эта служба создает событие - запись выполненного действия. Другие службы используют эти события, чтобы они могли выполнять любые свои собственные задачи, необходимые в результате события.

События можно обрабатывать разными способами. Например, они могут быть опубликованы в очереди, которая гарантирует доставку события соответствующим потребителям, или они могут быть опубликованы в потоке модели «pub / sub», который публикует событие и предоставляет доступ всем заинтересованным сторонам. В любом случае производитель отправляет событие, а потребитель получает это событие, реагируя соответствующим образом.

Marble.js v3.0 берет лучшие части ранее упомянутых библиотек RxJS и помещает их во фреймы внутреннего мира, предоставляя общий интерфейс для обработки на основе событий, несмотря на базовый транспортный уровень. @marblejs/messaging определяет концепцию транспортных уровней, аналогичную NestJS. Они берут на себя ответственность за передачу сообщений между двумя сторонами. Модуль обмена сообщениями абстрагирует детали реализации каждого уровня за общим интерфейсом Effect. Для начала, Marble.js 3.0 реализует транспортные уровни AMQP (RabbitMQ) и Redis Pub / Sub. До следующего второстепенного выпуска второй транспортный протокол будет доступен с ограничениями «бета-доступа» . Кроме того, он включает третий «локальный» уровень для обмена сообщениями EventBus, который можно использовать для шаблонов CQRS. Да, все это возможно с последовательным, унифицированным интерфейсом. Предполагается, что в следующих второстепенных выпусках появится больше транспортных уровней, например NATS, MQTT или GRPC.

RabbitMQ:

CQRS:

Читатели Async

Контекстный API - это самая важная вещь, представленная в предыдущем основном выпуске. Еще одна интересная новая функция, которую я не могу пропустить во введении к последней версии, - это «асинхронные программы чтения».

Иногда возникает необходимость приостановить запуск приложения до тех пор, пока не будут выполнены одна или несколько асинхронных задач или заданий. Например, вы можете подождать с запуском сервера до того, как будет установлено соединение с базой данных. Обновленный синтаксис средств чтения контекста сразу обрабатывает обещания или синтаксис async / await в фабрике чтения. Контейнер контекста (включая фабрику приложений Marble) будет ожидать разрешения обещания перед созданием экземпляра любого читателя, который зависит от (внедряет) async reader.

Чтобы сделать привязку зависимостей более явной, версия 3.0 представляет новый набор фабричных функций для привязки асинхронных и синхронных зависимостей - bindEagerlyTo, bindLazilyTo (псевдоним bindTo).

логирование

Проектное решение в версии 2 предполагало, что все, что может заинтересовать разработчиков, должно быть доступно через открытый API в форме наблюдаемых событий. Что ж ... фреймворк развивается, и иногда лучше, чтобы что-то работало из коробки, вместо того, чтобы повторять один и тот же шаблон регистрации снова и снова каждый раз, когда вы создаете новую службу или сервер.

В следующей версии определяется подключаемая зависимость Logger, которая по умолчанию регистрируется в контексте каждой фабрики серверов. Вы можете переопределить привязку Logger и сопоставить операции ввода-вывода стандартного вывода с другим местом назначения (например, с файлом или внешней службой), когда это необходимо. Имея это, вы можете проверять такие вещи, как зарегистрированные зависимости контекста, сопоставленные маршруты HTTP, журналы запросов / ответов, отслеживание событий ввода / вывода и т. Д.

fp-ts v2

Marble - это первый фреймворк для Node.js, который пытается рассказать о функциональном программировании широкой аудитории. Он не следует за ФП в чистом виде, а скорее пытается включить избранные шаблоны и концепции, которые могут хорошо вписаться в экосистему фреймворка. Версия 3.0 наконец-то добавляет официальную поддержку [email protected], делая ее необходимой одноранговой зависимостью, которая должна быть установлена ​​вместе с rxjs.

В [email protected] типы данных больше не реализуются с классами; Самым большим изменением в результате этого является то, что был удален цепной API. В качестве альтернативы предоставляется функция pipe вместе с подходящими функциями верхнего уровня с последними данными (по одной для каждого устаревшего метода).

Критические изменения

Трудно создать структуру, которая сохраняла бы обратную совместимость во всех аспектах с самой первой итерации, особенно когда вы хотите делать ее все лучше и лучше. Как разработчик программ с открытым исходным кодом я все еще учусь от выпуска к выпуску и хочу предоставить разработчикам максимально возможный опыт без критических изменений ... но, как вы знаете, это не так просто. Иногда вы просто находите лучший способ решить проблему. Ваша точка зрения / перспектива меняется по мере того, как вы становитесь разработчиком, стремясь к совершенству.

Новейшая итерация поставляется с некоторыми критическими изменениями API, но не волнуйтесь, они не меняют правила игры, а скорее удобные улучшения, которые открывают двери для новых возможностей в будущем. В процессе разработки цель состояла в том, чтобы как можно раньше уведомить и обсудить входящие изменения в сообществе. Вы можете проверить здесь что изменилось с момента последней версии.

Полевые испытания

Версия 3.0 не была выпущена в запланированные шесть месяцев, но на то есть причина. Середина и конец 2019 года были очень важными для всего проекта. Для меня, как для автора фреймворка, это был шанс проверить функциональные / реактивные концепции на предмет реальных, более масштабных проблем. Это был первый раз, когда у меня была возможность увидеть, как люди, не знающие реактивной и функциональной парадигм, работают с фреймворком, решая нетривиальные проблемы, демонстрируя свой собственный образ мышления и рассуждения. Это был большой вызов. С тех пор я ясно вижу, что уникальность Marble, реактивный подход с функциональным сахаром на вершине, также может быть худшим кошмаром, особенно если команда разработчиков исходит из твердого объектно-ориентированного подхода к программированию. Это был трудный переход, особенно с учетом того, что в какой-то момент я почти отказался от всей реактивной идеи, пытаясь слишком далеко продвинуть мыслительные барьеры.

Начиная с первого общедоступного выпуска, цель фреймворка остается неизменной - распространить функциональное мышление на как можно более широкую аудиторию. Функциональное программирование не страшно, но требует другого подхода к проблемам, особенно в сочетании с реактивной философией.

Marble.js - самый амбициозный проект, который я когда-либо делал. Фреймворк растет от версии к версии. Тенденции показывают, что все больше людей интересуются темами функционального или реактивного программирования. Проект требует серьезной поддержки, поддержки сообщества, документации и четких рамок обработки. На данный момент поддержка сообщества бесценна. Уважаемые сторонники и участники, я хотел бы официально поблагодарить вас и призвать вас принять участие в обсуждениях, которые, несомненно, окажут реальное влияние на будущее платформы Marble.js. Ваш голос - самое дорогое. Спасибо!

Следите за нашими Центром космических полетов GitHub, Twitter и docs.marblejs.com, чтобы получать самую свежую информацию и обновления из космоса!

Удачного взлома и будьте готовы к следующему Большому взрыву! 🚀