mirror of https://github.com/voidlizard/hbs2
wip
This commit is contained in:
parent
18a99d55ce
commit
9cde97cb05
|
@ -2,6 +2,24 @@
|
||||||
|
|
||||||
\chapter{Дизайн}
|
\chapter{Дизайн}
|
||||||
|
|
||||||
|
|
||||||
|
Итак, \term{hbs2-browser}{hb2-browser} это компонент, который позволяет
|
||||||
|
просматривать некие метаданные, сохраненные в \term{ref}{ссылках}, видимо,
|
||||||
|
типа \term{refchan}{рефчан}.
|
||||||
|
|
||||||
|
Почему refchan:
|
||||||
|
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Требуется несколько авторов, т.е агентов,
|
||||||
|
которые будут публиковать данные;
|
||||||
|
\item Требуется при этом исключить компрометацию всей
|
||||||
|
системы при компрометации какого-то одного приватного ключа <<автора>>;
|
||||||
|
\item Требуется возможность валидации;
|
||||||
|
\item Требуется проверка ACL;
|
||||||
|
\item Требуется включение/исключение авторов.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
|
||||||
% \section{Структуры данных и протоколы}
|
% \section{Структуры данных и протоколы}
|
||||||
|
|
||||||
% \subsection*{Предпосылки}
|
% \subsection*{Предпосылки}
|
||||||
|
|
|
@ -135,20 +135,101 @@ L2. L2 подразумевает более подробную информац
|
||||||
|
|
||||||
\subsubsection{Собственный EDSL}
|
\subsubsection{Собственный EDSL}
|
||||||
|
|
||||||
Требуется значительное время для разработки, необходим тулинг,
|
Требуется значительное время для разработки, необходима разработка
|
||||||
высокий порог входа, возможное недовольство пользователей.
|
средств разработки и отладки, высокий порог входа, возможное
|
||||||
|
недовольство пользователей.
|
||||||
|
|
||||||
|
|
||||||
\subsubsection{Биндинги в скриптовые ЯП + хост}
|
\subsubsection{Биндинги в скриптовые ЯП + хост}
|
||||||
|
|
||||||
Достаточно затратное встраивание, вопрос, какие именно ЯП выбрать из
|
Достаточно затратное встраивание, вопрос, какие именно ЯП выбрать из
|
||||||
большого списка.
|
большого списка, необходимость принять множество решений при
|
||||||
|
отсутствии достаточного количества объективных факторов для их оценки
|
||||||
|
(какой язык <<лучше>>, какой <<хуже>> и множество еще)
|
||||||
|
|
||||||
\subsubsection{Внешний процесс + IPC}
|
\subsubsection{Внешний процесс + некий IPC}
|
||||||
|
|
||||||
\subsubsection{Внешний процесс + RPC}
|
К недостаткам относятся: необходимость в управлении этим процессом и
|
||||||
|
его артефактами (сокеты, named pipes).
|
||||||
|
|
||||||
|
|
||||||
|
Тем не менее, данный способ видится наиболее универсальным и простым
|
||||||
|
относительно прочих.
|
||||||
|
|
||||||
|
Способ в каком-то роде давно проверенный и доказанный: и cgi и fastcgi
|
||||||
|
работают десятилетия уже, подход масштабируется.
|
||||||
|
|
||||||
|
Внешним процессом может быть как некий сервер/сервант, так и
|
||||||
|
запускаемый нашим процессом внешний процесс, обеспечивающий
|
||||||
|
коммуникацию через pipe.
|
||||||
|
|
||||||
|
При реализации Messaging через пайпы мы получаем такой же абсолютно
|
||||||
|
RPC+Notifications, как во всех прочих частях системы: UDP, TCP, Unix
|
||||||
|
sockets.
|
||||||
|
|
||||||
|
Протокол может быть и бинарным и текстовым. Текстовый протокол может
|
||||||
|
видеться, примерно похожим на HTTP: <<запросом>> является подобный
|
||||||
|
HTTP заголовок, далее пустая строка <<\texttt{CR LF CR LF}>>, далее
|
||||||
|
тело ответа, например, в JSON.
|
||||||
|
|
||||||
|
Заголовки могут быть урезанным набором заголовков HTTP.
|
||||||
|
|
||||||
|
При таком подходе мы можем интегрировать процессы, написанные на
|
||||||
|
других языках, они получают достаточно простой текстовый интерфейс,
|
||||||
|
при условии, что у них нет удобной реализации CBOR.
|
||||||
|
|
||||||
|
Начать же мы можем с того, что просто реализуем \texttt{Messaging} c
|
||||||
|
фреймингом, аналогичный TCP/ByPass --- но для pipes.
|
||||||
|
|
||||||
|
Этот протокол может быть и синхронным и асинхронным, вероятно, лучше
|
||||||
|
сразу же делать его асинхронным --- т.е потоки запросов и ответов
|
||||||
|
являются независимыми, а на какой конкретно запрос поступает ответ ---
|
||||||
|
зависит от специального поля в заголовке \texttt{REQID}.
|
||||||
|
|
||||||
|
При асинхронном подходе нам не обязательно балансировать нагрузку
|
||||||
|
внутри нашего хост-приложения --- балансировать может сам запущенный
|
||||||
|
процесс.
|
||||||
|
|
||||||
|
Почему нужно делать именно так: fork+RPC через pipes.
|
||||||
|
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Имея механизм RPC через потоки ввода--вывода мы можем этот же
|
||||||
|
механизм задействовать для named~pipes, то есть, для взаимодействия
|
||||||
|
с внешним процессом, которым мы не управляем.
|
||||||
|
\item Мы можем управлять нужным процессом и запускать его
|
||||||
|
самостоятельно, не полагаясь на всякие системные вещи, типа systemd
|
||||||
|
и внешних конфигурационных скриптов, снижая количество внешних
|
||||||
|
факторов, влияющих на функционирование системы.
|
||||||
|
\item Мы можем балансировать нагрузку, запуская нужное нам
|
||||||
|
количество процессов и распределяя нагрузку между ними, если они
|
||||||
|
имеют свойство блокироваться.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
Почему бинарный протокол в первую очередь:
|
||||||
|
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Текстовый можно сделать позднее, для этого нужно просто
|
||||||
|
подменить encode/decode в определении протокола.
|
||||||
|
\item Это самое простое по реализации решение в данный момент, и
|
||||||
|
отработанное на примере других протоколов/других транспортов.
|
||||||
|
\item У нас всё уже для этого есть, и с примерами для других видов
|
||||||
|
транспорта. Протокол для pipes будет почти полностью аналогичен
|
||||||
|
протоколу для Unix sockets.
|
||||||
|
\item Автор является и основным разработчиком системы, маловероятно,
|
||||||
|
что на текущем этапе появятся какие-то другие разработчики, которые
|
||||||
|
будут заинтересованы в разработке на других ЯП, кроме Haskell, а раз
|
||||||
|
так, то все просто могут взять библиотеку и писать эти модули на
|
||||||
|
Haskell.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
Почему асинхронный протокол:
|
||||||
|
|
||||||
|
Потому, что синхронный --- его частный случай, как если бы асинхронный
|
||||||
|
процесс просто затыкался после одного запроса. Это всё равно та
|
||||||
|
ситуация, которую надо уметь обрабатывать. Так что сделав асинхронную
|
||||||
|
обработку --- мы получим синхронную бесплатно. Механизмы ServiceProto
|
||||||
|
уже умеют делать синхронные вызовы для асинхронных протоколов.
|
||||||
|
|
||||||
\subsubsection{Внешний процесс + HTTP}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue