понедельник, 25 января 2021 г.

[soft.business] Ищу финансирование для развития RESTinio/SObjectizer/so5extra

Наша совсем маленькая компания stiffstream на протяжении нескольких лет делает такие OpenSource инструменты для С++ как:

  • RESTinio: встраиваемый HTTP/WebSocket сервер, ориентированный на эффективную асинхронную обработку входящих HTTP-запросов;
  • SObjectizer/so5extra: реализация Actor Model, Publish-Subscribe и Communicating Sequential Processes, существенно упрощающая разработку сложных многопоточных приложений.

Прибыли эти разработки не приносят, мы вели их за свои деньги.

К сожалению, кризис 2020-го ударил и по нам. Наши собственные финансовые ресурсы для развития RESTinio и SObjectizer/so5extra практически исчерпаны.

Поэтому мы приостанавливаем работы над этими проектами на неопределенный срок.

UPD. На данный момент история с поиском финансирования закончилась ничем. Развитие наших OpenSource-проектов пока приостановлено. Мы попробуем поднакопить средства на заказной разработке/консультациях, чтобы затем вернуться к работам над RESTinio/SObjectizer/so5extra. Кому интересно, вот послесловие к этой затее.

Соответственно, те предложения, которые были первоначально описаны в этом посте, стали не актуальны. Я спрятал их под кат, сохранив просто для истории.

Если же кто-то на тех или иных условиях готов вложиться в разработку наших OpenSource-проектов, то контакты под катом внизу. Давайте пообщаемся, нам нужна не такая уж и большая сумма.

[prog.c++] Текущие хотелки по SObjectizer/so5extra

Две недели назад был пост о том, что хотелось бы поиметь в RESTinio. Попытаюсь сформулировать что-то подобное и в отношении SObjectizer+so5extra.

Тут, правда, есть большое отличие от RESTinio. Если RESTinio -- это относительно молодой, еще не достигший точки стабилизации проект, позиционирование и список ключевых фич которого все еще является открытым вопросом даже для нас, то SObjectizer -- это состоявшийся и устоявшийся взрослый проект, который достаточно давно стабилизировался. И в который уже нет никакого желания добавлять новые фичи просто "шоб було". Так что если и расширять SObjectizer какой-то новой функциональностью, то такой, чтобы перед пользователем открывались какие-то принципиально новые возможности.

На данный момент я вижу два направления, в рамках которых можно произвести НИОКР и, если в сухом остатке получится приемлемый результат, перенести результаты исследований в SObjectizer.


Первое направление -- это попытка подружить агентов с pull-моделью извлечения новых заявок на обработку.

Суть в том, что сейчас агенты в SObjectizer-е работают в соответствии с push-моделью.

Это значит, что когда вы отсылаете сообщение в mbox, то обычный mbox запихивает заявку на обработку сообщения в очередь событий агента. Рано или поздно дело доходит до обработки этой заявки: диспетчер владеет очередью событий и именно диспетчер извлекает очередную заявку из этой очереди. При этом mbox, который сформировал заявку, не знает когда именно это произойдет.

Push-модель проста, понятна, эффективна и подходит для огромного количества случаев.

Однако бывают моменты, когда агенту выгоднее использовать pull-модель.

Первый сценарий, который можно закрыть посредством pull-модели -- это поддержка приоритетов для заявок (см. недавнюю статью на Habr-е на эту тему). Причем такая поддержка, которая бы позволила использовать приоритеты заявок совместно с базовыми штатными диспетчерами SObjectizer-а, которые изначально для этого вообще не предназначались (например, one_thread, active_obj, active_group, thread_pool, а также asio_thread_pool и asio_one_thread из so5extra).

Второй сценарий -- это еще одно возможное решение проблемы producer-consumer, которое давеча обсуждалось в issue на GitHub-е. Идея в том, что специализированный mbox собирает отосланные в него сообщения, но не сразу отсылает сообщения в очереди событий агентов, а хранит у себя до тех пор, пока какой-то из consumer-ов не освободится и не обратиться за следующим сообщением. В этом случае pull-модель выглядит предпочтительнее push-модели.

Третий сценарий -- это возможность агента читать сообщения напрямую из mchain-а как из обычного mbox-а. Дело в том, что mchain-ы задумывались как средство передачи информации от агентов наружу, в те части приложения, которые написаны без SObjectizer-а (в обратную сторону отлично работают старые-добрые mbox-ы). И в этом качестве они работают отлично. Но иногда их хочется использовать и для общения агентов между собой. А вот тут не все так хорошо, поскольку нет простого и эффективного способа проинформировать агента, заинтересованного в чтении сообщений из mchain-а, о том, что в mchain-е есть информация и можно вызывать receive.

Так что желание подружить агентов и mchain-ы у меня лично есть уже давно, а вот четких мыслей о том, как это сделать, пока не было. Возможно, эксперименты с pull-моделью помогут.

Четвертый сценарий -- это возможность сделать поддержку чего-то вроде selective receive (например, по аналогии с механизмом Stash из Akka). Правда, я не уверен, что это действительно реализуемо. Но, думается, что pull-модель предоставляет здесь несколько больше шансов на успех, нежели push-модель.

В общем, направление многообещающее, но, к сожалению, требующее некоторых исследований и экспериментов. А посему на выходе вполне можно получить и отрицательный результат, который будет вполне себе результатом, который укажет, что в рамках SO-5 это недостижимо.


Второе направление -- это предоставление возможности пользователю создавать свои экземпляры рабочих нитей в штатных диспетчерах.

Тут дело вот в чем: штатные диспетчеры самостоятельно создают экземпляры std::thread когда им требуется очередная рабочая нить для обслуживания заявок агентов. Пользователь никак не может повлиять на то, что за экземпляр создается. Так же пользователь не имеет никакой возможности запустить какие-то действия на этой новой рабочей нити до того, как та начнет цикл обслуживания заявок для агентов.

Временами это не есть хорошо. Например, если пользователь хочет создать 100500 агентов, привязанных к active_obj-диспетчеру (т.е. работающих на собственных рабочих нитях), но при этом желает ограничить размер стека для каждой из рабочих нитей всего 32KiB. Работай пользователь напрямую с POSIX threads у него была бы такая возможность. А вот штатные диспетчеры не позволяют это сделать.

Другой сценарий: пользователь хочет поиграться с приоритетами рабочих нитей. Например, создать one_thread-диспетчер с высоким приоритетом рабочей нити. И thread_pool-диспетчер с низкоприоритетными рабочими нитями. Опять же, на чистом POSIX threads API это можно было бы сделать. А через штатные диспетчеры SO-5 -- нет.

Или, предположим, пользователь хочет привязать конкретную рабочую нить к конкретному ядру процессора. Опять же, посредством штатных диспетчеров SO-5 этого не сделать.

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

Нужно сказать, что диспетчеры asio_one_thread и asio_thread_pool из so5extra позволяют в свойствах диспетчера задать тип для рабочей нити. Так что эти два диспетчера позволяют пользователю реализовывать рабочие нити вручную со всеми нужными свойствами, тогда как основная внутренняя логика работы диспетчера остается на нашей (т.е. мейнтенеров SO-5) совести.

В общем, это направление выглядит гораздо более реалистичным и не требующим настолько большого объема предварительных исследований и прототипирования, нежели эксперименты с pull-моделью. Грубо говоря, можно брать и делать.


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

Так что если вы хотели бы видеть что-то в SObjectizer-е, что могло бы облегчить вам вашу работу, то скажите об этом нам. Например, через issues или discussions на GitHub-е.

Те потребности, о которых мы не знаем, мы просто не можем удовлетворить. Так что делитесь, пожалуйста, своими соображениями.


Наверное, немного странно записывать хотелки когда вопрос о финансировании работ для наших OpenSource проектов еще не решен. И непонятно когда мы сможем вернуться к работе над RESTinio/SObjectizer.

Но, во-первых, этот пост нужен мне самому как "зарубка на память". Будет от чего оттолкнуться когда представится возможность вернуться к SObjectizer-у.

Во-вторых, если вдруг этот пост читает человек, от которого зависит решение проспонсировать наши открытые разработки или нет, то он сможет понять, на что именно его деньги будут потрачены.

[work.opensource.c++] arataga: что это вообще и зачем мы публикуем это в OpenSource?

arataga -- это работающий прототип socks5+http/1.1 прокси сервера, который мы в прошлом году разрабатывали для одного из наших клиентов. К сожалению, этот прототип остался невостребованным. Ну а чтобы не пропадать добру и самопиара ради, мы решили открыть его исходники.

Как все развивалось

Дело было так: с 2019-го года мы работали с заказчиком, который эксплуатировал у себя некий старый прокси-сервер. Весьма старый, написанный с применением модели thread-per-connection, да еще и оставшийся без сопровождения. Собственно, мы как раз и занимались его доработкой под нужды заказчика.

Где-то к концу весны 2020-го стало понятно, что больше ничего хорошего из этого прокси-сервера не выжать. Что нужно его заменять на что-то новое, написанное с нуля или же переделанное готовое (типа nginx или envoy после обработки напильником).

Изначально в этот проект влезать не хотелось вообще, т.к. объем работ предполагался большим, сроки короткими, поэтому наших ресурсов могло тупо не хватить. Но мы согласились помочь в написании ТЗ для будущих исполнителей и уже в процессе подготовки ТЗ сложилось ощущение, что здесь можно будет применить и SObjectizer, и RESTinio, и что при должном разбиении на итерации можно будет справиться и своими скромными силами. Посему ввязались в разработку нового прокси-сервера под требования заказчика.

В итоге в довольно сжатые (как мне кажется) сроки мы сделали прототип, который уже нужно было запускать на нормальное тестирование на площадке клиента... Но сам клиент утратил интерес к этой разработке и перестал реагировать на внешние раздражители.

Что стало неприятным сюрпризом, тем более, что до этого никаких проблем с заказчиком не было. И даже по ходу работ над arataga мы взаимодействовали по другим вопросам и он оплачивал нам сделанные ранее работы.

Наши обязательства перед клиентом закончились. У нас на руках остался arataga и с этим нужно было что-то делать. Например, выбросить и забыть. Или же открыть.

Зачем нужно было делать arataga?

У заказчика были следующие и, как мне представляется, местами весьма специфические условия:

четверг, 21 января 2021 г.

[life] Никто не знал, а я тормоз :)

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

Суть в том, что я с детства считал себя человеком, который думает быстро. Не знаю, с чем это связано. Может быть с тем, что сложные предметы в школе давались легко. Может быть потому, что если начинал заниматься чем-то, что мне нравилось, то быстро прогрессировал. Может быть на меня сильное впечатление произвела фраза Юлия Цезаря "Veni, vidi, vici". Вот не знаю.

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

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

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

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

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

Внезапно (c), да.

Поэтому сейчас пытаюсь научиться действовать не так, как позволял себе раньше. Десять раз подумать. Отложить насколько это возможно. Постараться переключаться на что-то другое, чтобы затем вернуться к промежуточному решению с новым ощущением и взглядом. Оказалось, что я не то чтобы тормоз, но медленный газ.

Самое трудное при таком подходе -- это как-то прервать процесс размышления на волнующую тему. Особенно когда какая-то внезапная мысль приходит посреди ночи. Готовых и 100% работающих рецептов пока нет. Были бы, поделился бы.

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

Какой вывод из всего сказанного?

Не торопитесь. Рефлексируйте побольше, анализ прошлых ошибок себя окупает. Мало кто умеет учиться на чужих ошибках, а собственных у каждого из нас полно, это огромное поле для самоанализа и саморазвития.

суббота, 9 января 2021 г.

[prog.c++] Пару слов про позиционирование RESTinio и основные хотелки для RESTinio на 2021-й

Начало года отличное время для того, чтобы попытаться прикинуть планы на ближайшее (и не очень) будущее. Сегодня скажу пару слов про то, в каком направлении я вижу смысл развивать RESTinio.

ИМХО, уже пришла пора более точно определиться с позиционированием RESTinio в экосистеме C++. Это раньше RESTinio был молодой и мало кому известной разработкой. Сейчас же ситуация меняется, мы уже не молоды ;)

Позиционирование важно потому, что на данный момент можно насчитать с дюжину подобных инструментов для C++. И хотя на слуху находится всего пара-тройка названий, но если какой-то C++ разработчик захочет подобрать встраиваемый HTTP-сервер под свою задачу, то у него будет приличный выбор на любой вкус, цвет и размер кошелька. Конкурировать со всеми и во всех направлениях бессмысленно. Посему следует обозначить нишу для RESTinio.

Мне представляется, что RESTinio уникален тем, что под одной крышей здесь собрано:

  • простота использования RESTinio для каких-то очевидных и понятных действий. Так, чтобы получить запрос и пройтись по списку HTTP-полей, не нужно выписывать вручную процедуры чтения данных из сокета;
  • гибкая настройка RESTinio под условия пользователя. Захотел пользователь применять Boost.Log для логирования? Нет проблем, RESTinio позволяет написать адаптер и RESTinio будет логировать свои действия с помощью этого адаптера. Или, например, захотел пользователь запускать вместе с RESTinio на io_context еще и какие-то свои сетевые операции... Опять же, нет проблем;
  • набор инструментов, которые позволяют применять RESTinio для каких-то нетривиальных сценариев. Например, средства работы с HTTP-заголовками используются в arataga даже для исходящих HTTP-запросов.

Что делает RESTinio хорошим выбором для ситуаций, когда разработчику нужно что-то сильно повыше уровнем, чем Boost.Beast, но при этом хочется иметь гораздо больший контроль за происходящим, чем в oat++ или cpp-httplib.

Отличный пример такой задачи, на мой взгляд, -- это прокси-сервер типа arataga. На Boost.Beast его делать будет слишком хлопотно. А oat++/cpp-httplib вряд ли дадут доступ к своим потрохам.

Именно в этом направлении, думаю, и стоит развивать RESTinio дальше.

Т.е., RESTinio должен быть выше уровнем, чем Boost.Beast, но ниже, чем oat++ и cpp-httplib. Но при этом средствами RESTinio продвинутый разработчик с небольшими усилиями должен уметь создать для себя что-то похожее на oat++/cpp-httplib, но заточенное под специфические требования конкретной прикладной задачи.

Или же, в более лаконичной форме:

RESTinio должен стать конструктором из продвинутых инструментов, отлично подогнанных друг к другу.

Как именно это будет выглядеть пока сказать не могу. Надеюсь, что в процессе дальнейшей эволюции RESTinio это выяснится.


Теперь попробую обозначить несколько приоритетов в предполагаемом развитии RESTinio в 2021-ом году.

Во-первых, это замена http_parser на что-то другое. Конечно же, хочется иметь собственную реализацию, которая бы a) сделала RESTinio полностью header-only библиотекой, и b) поддерживала бы различные тонкие моменты в HTTP-протоколе (вроде chunk extensions). Если это не получится, то рассмотреть и внедрить какую-то готовую альтернативную реализацию (llhttp, picohttpparser, что-то еще).

Во-вторых, добавление режима работы в котором RESTinio не будет загружать весь запрос в память перед вызовом обработчика, а будет отдавать читаемые от клиента данные кусками по мере их поступления. Это позволит a) эффективно обрабатывать запросы с большим объемом входящих данных, и b) использовать RESTinio для сценариев, в которых сейчас RESTinio не может применяться в принципе (например, для разработки прокси-сервисов).

В-третьих, добавление поддержки http/2. Пока RESTinio жестко завязана на работу со всего лишь один протокол. От этого нужно уходить, т.к. рано или поздно, http/2 и http/3 вытеснят http/1.1. И если в 2021-ом получится изменить RESTinio так, чтобы в нем поддерживалось сразу два протокола, то это откроет отличную возможность добавить со временем еще и http/3, а может и еще что-нибудь.

Если в 2021-ом получится реализовать в RESTinio все эти три хотелки, то это будет очень хороший результат. Если получится. Но для этого нужны условия. Впрочем, об этом поговорим через несколько дней.

По поводу поддержки в RESTinio клиента я могу лишь повторить то, что уже говорил раньше: без внешнего финансирования мы поднять такую задачу не сможем. Так что если кто-то готов вложить в RESTinio, минимально, 3.5K USD, то давайте всерьез обсудим такую возможность.


Если кого-то интересует перечень встраиваемых HTTP-серверов для C++, то выглядит он приблизительно так (перечисление в случайном порядке): RESTinio, Boost.Beast, cpp-httplib, http_backend, Pistache, RestBed, served, C++ REST SDK, proxygen, Simple-Web-Server, drogon, oat++

суббота, 2 января 2021 г.

[life.cinema] Очередной кинообзор (2020/12)

Традиционный список отсмотренных (и недосмотренных) за минувший месяц фильмов и сериалов. По той же самой традиции в начале списка идут наиболее понравившиеся фильмы/сериалы, а в конце -- откровенный шлак. Бонусом отдельное мнение по паре фильмов, которые не хотелось вставлять в общий список.

Фильмы

Смертельные иллюзии (2020). Если кому-то хорошо зашли обе части "Иллюзии обмана", то смело можно и этот фильм посмотреть. Снято, по крайней мере, красиво и зрелищно.

Отряд Фокстрот (Foxtrot Six, 2019). Неожиданно бодренький, хотя и дешевый, околофантастический боевик из Индонезии. До "Рейда", конечно же, не дотягивает, но если хочется отключить мозги и посмотреть бескомпромиссное и динамичное рубилово-мочилово, то достойный вариант на нынешнем безрыбье.

Честный вор (Honest Thief, 2020). Все средненько и предсказуемо. Вполне можно и посмотреть, когда ничего лучше нет. Жалко только, что местами спецэффекты были сделаны совсем уж убого и дешево.

Русский рейд (2019). Во-первых, нельзя этот фильм воспринимать всерьез. Во-вторых, местами он ну очень уж наивный, а персонажи настолько плоские и картонные, что дальше просто некуда. В-третьих, даже в некоторых боевых сценах оторопь берет от происходящего на экране, хотя казалось бы, что именно ради этого и снималось. Но зато бодренько, драйвово. Местами возникает откровенный треш, который таки идет фильму на пользу. И огромный плюс фильма, который сильно скрашивает все остальное, это подбор актеров на роль "спортсменов". Очень уж классно ребята вписались в свои роли. Если бы не они, смотреть было бы невозможно.

Новые мутанты (The New Mutants, 2020). Любители серии про "Людей Икс" могут глянуть, конечно. Но лучше не стоит, ничего хорошего в фильме нет, как по мне. А уж зачем туда притянули лесбийские отношения...

Ритм-секция (The Rhythm Section, 2020). Редкая дрянь несмотря на неплохих актеров в главной роли и, местами, отличную работу оператора. Смело можно не смотреть.

Гренландия (Greenland, 2020). Муть полная. Да и на удивление убогие и дешманские спецэффекты для фильма-катастрофы такого масштаба.

Сериалы

Смог полностью отсмотреть два сериала:

Мандалорец (второй сезон). Достойное продолжение первого сезона. По декорациям в некоторых сериях казалось, что даже гораздо круче первого сезона. Тут явно тот случай, когда сериалом по мотивам "Звездных войн" занялись люди, искренне любящие "Звездные войны". Так что настоящим продолжением оригинальной трилогии, определенно, является этот сериал, а не три полнометражных говноаттракциона с Дэйзи Ридли в главной роли. Ну и плюс "Изгой один". Соответственно, любителям первых трех фильмов можно смело рекомендовать к просмотру.

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

И еще два досмотреть не смог, осилив по 3-4 первые серии:

Пенниуорт (Pennyworth, первый сезон). Снято мастерски. Визуальная составляющая выше всяких похвал, как по мне. Но вот этот выдуманный мир альтернативной реальности, в которой происходят события, почему-то начал вызывать тошноту уже где-то на второй серии. А затем и вовсе убил желание смотреть дальше.

Эпидемия (первый сезон). Отличный визуальный ряд. Две первые серии весьма бодренькие и вселяющие надежду. Но уже с третьей серии все скатывается в какие-то непрерывные сопли и нудятину. Происходящее на экране вызывает вопросы из категории "Ну, ну чё за фигня?" А количество неожиданных роялей в кустах начинает зашкаливать. Так что после с трудом досмотренной четвертой серии просмотр сего творения был прекращен.


Отдельно нужно сказать про Рокетмен (Rocketman, 2019). Я так и не понял, что это было. То ли гениальная находка в виде встраивания песен Элтона Джона в нить повествования, то ли это был здоровенный гвоздь в крышку гроба. Одно могу сказать точно: если бы не эти самые песни Элтона, которые, как по мне, близки к гениальности и уже вошли в историю, смотреть было бы вообще нечего.


Также отдельных слов заслуживает новый российский фильм Подольские курсанты (2020). Крайне неоднозначные впечатления. С одной стороны, снято очень качественно. Некоторые батальные сцены доставляют нереально. За что авторам огромная благодарность. С другой стороны, местами события скатываются в откровенную шаблонность, из-за чего возникают вопросы "а зачем это вообще было". Так же, местами, складывается ощущение, что материала было отснятно на мини-сериал, а в полнометражный фильм решили вставить по кусочку из всего. Поэтому какие-то сцены выглядят мало того, что не очень нужными, так еще и слишком гротескными (например, все связанное с "Катюшами").

А уж за кульминационную сцену с боем главных героев в окруженном ДОТе всех причастных следовало бы выгнать из профессии на мороз, ибо дурно пахнущий голливудскими штампами бред с последним выстрелом за мгновение до разрывов заброшенных в ДОТ гранат... Это было уже за гранью добра и зла.

Тем не менее, отдельное спасибо создателям фильма хочется сказать за то, что наверное, это первый из военных фильмов последних лет (в паре с "28 панфиловцев"), в которых у чумазых и перепачканных грязью, копотью и кровью героев из окопов нет ослепительно белых зубов. Почему-то лично мне именно сверкающие белоснежные зубы у солдат, сидящих днями и ночами в окопах, сразу бросаются в глаза в современном кино про войну. Что многое говорит об уровне фильма, если уж даже на достоверность гримма не заморачиваются. В "Подольских курсантах" хотя бы этой фигни не было.

вторник, 29 декабря 2020 г.

[prog.c++] RESTinio-0.6.13: последний большой релиз в 2020-ом и, возможно, вообще последний в рамках ветки 0.6

Состоялся очередной релиз RESTinio: версия 0.6.13, в которой таки были реализованы идеи по выстраиванию обработчиков запросов в цепочки (по аналогии с ExpressJS-овскими middleware). Подробнее про новшества версии 0.6.13 я собираюсь рассказать в отдельной статье на Хабре. Кто не хочет ждать, тот может заглянуть в нашу документацию.

Скорее всего, этот релиз станет последним большим релизом в рамках ветки 0.6. И дальнейшее развитие RESTinio будет происходить уже в рамках новой ветки 0.7 без оглядки на совместимость с веткой 0.6. Это не значит, что мы все поломаем напрочь, но какие-то несовместимости обязательно будут и код под RESTinio-0.7 придется адаптировать.

В пользу того, чтобы перестать развивать ветку 0.6 и начать делать новую 0.7 говорит несколько факторов (порядок их перечисления случаен):

  • в RESTinio уже накопилось несколько моментов, которые требуют переделки (какие-то из них прямо в коде помечены как FIXME). А эта переделка невозможна без слома текущего API;
  • до сих пор в RESTinio поддерживался только http/1.1. Думаю, чтобы двигаться дальше нужно добавлять в RESTinio и http/2, и http/3. А на такую мультпротокольность RESTinio не был расчитан. Непонятно, можно ли уместить поддержку мультипротокольности в существующую архитектуру и API RESTinio. Поэтому проще заниматься этим вопросом без оглядки на совместимость с предыдущими версиями RESTinio;
  • поддержка цепочек обработчиков, которая появилась в 0.6.13, распространяется только на синхронные обработчики. А хочется иметь такую же и для цепочек асинхронных обработчиков. Но придумать как это сделать в рамках версии 0.6 у меня не получилось. Есть смутная идея, но она требует изменения API;
  • сейчас RESTinio сперва полностью загружает в память входящий запрос и лишь затем вызывает обработчик для него. Хочется добавить режим работы, в котором RESTinio сможет отдавать входящий запрос на обработку частями, без предварительного накопления всего содержимого запроса;
  • один из важнейших факторов: лежащая в качестве базы RESTinio внешняя библиотека http-parser осталась без сопровождения. Поэтому в RESTinio парсер HTTP нужно заменить на что-то. Либо на другую готовую стороннюю библиотеку, либо на свой собственный велосипед. Такая замена существенно изменит список зависимостей для RESTinio, а это уже точно ведет к переходу к следующему номеру в версии.

Так что, подозреваю, развитие RESTinio переходит в новую стадию. И впереди меня ждет период вынашивания новых идей и лепки из того, что получится придумать, новой версии RESTinio.

Сколько времени это займет и когда можно ждать 0.7.0 не могу сказать. Вряд ли раньше весны 2021-го.

Соответственно, сейчас очень хороший момент, чтобы рассказать нам о том, чтобы вам хотелось видеть в RESTinio. Любые конструктивные замечания и предложения всячески приветствуются.

Сразу хочу сказать по поводу поддержки клиента в RESTinio. Без внешнего финансирования мы не сможем поднять эту тему. Так что если кто-то использует RESTinio на работе и хотел бы с помощью RESTinio обслуживать не только входящие, но и исходяще соединения, то рассмотрите, пожалуйста, возможность заказать такую доработку RESTinio у нас. Цена вопроса, думаю, будет где-то в районе 3.5-6k USD.


Пользуясь случаем хочу поблагодарить всех, кто интересуется RESTinio. И особенно тех, кто рискнул и выбрал нашу разработку. Очень надеюсь, что вы не разочаровались.

Если кто-то хочет помочь в развитии RESTinio, то на данный момент одним из самых больших подспорьев для нас является распространение информации о RESTinio. Каждое упоминание RESTinio в Интернете (Facebook, LinkedIn, Reddit-е, HackerNews, Twitter, Slack, Telegram и т.д.) поддерживает нашу мотивацию и желание развивать RESTinio дальше.