This commit is contained in:
Dmitry Zuikov 2024-03-23 05:34:47 +03:00
parent 18a99d55ce
commit 9cde97cb05
2 changed files with 105 additions and 6 deletions

View File

@ -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*{Предпосылки}

View File

@ -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}