| |||
![]()
|
![]() ![]() |
![]()
Распределенные блоговодческие хозяйства Subj - тема, которая реулярно вознкает по поводу очередных ужасов кровавой гэбни или арбузной команды. Тут вот вдруг нафантазировалсь. Сразу говорю - поводом для фантазий был переход на GIT - распределенную систему управления версиями - так что все совпадения с неслучайны. сеть представляет собой множество объектов, пользователей и репозиториев. Пользователь характеризуется уникальным id и возможность авторизации этого id. объект - это либо файл с историей всех его изменений (как в любой vcs) или ассоциация между объектами (объект А ссылается на объект B), или метка (tag) или модуль. Каждый объект имеет хозяина (и вероятно некий список тех, кто имеет право его модификации - пока можно считать, что только хозяин). объект может быть удален - что выражается в изменении его статуса (при этом физически он не удаляется). Модуль - множество объектов (фактически что-то вроде подкаталога). Объект имеет уникальный идентификатор, первичный origin (репозиторий в котором он был впервые создан) набор вторичных origin-ов (последнее множество в каждом репозитории свое, но в частности в нем содержатся те сервера, через которые объект "вышел в мир" с хозяйского). Origin'ы задают сервера, куда есть смысл стучаться за апдейтами. Операции: объект-файл можно создать, переименовать, удалить, изменить, сменить ему владельца. Можно при синхронизации получить из другого репозитория его копию или апдейт, можно отдать его в другой репозиторий. Объекты-ассоциации и тэги можно создавать и редактировать. !Чтобы создать ассоциацию или тэг связанный с объектом не нужно быть его владельцем. Нужно только иметь право на запись в свой репозиторий. Модули в основном предназначены для структурирования множеств объектов и упрощения групповой работы с ними. Тэги напоминают ассоциации и предназначены для классификации объектов и выборке по множеству тэгов. ЖЖ-образный пример: пользователи, понятно, и есть пользователи. журнал - модуль. Постинг - объект-файл с содержимым + некоторый набор стандартных атрибутов (часть атрибутов может быть нагружена на тэги). Комментарий - отдельная объект, принадлежащий автору комментария + две связи - с постингом, к которому он относится и с комментарием, на который ответ. Как это примерно работает: У каждого пользователия есть локальный репозиторий, в котором есть копия соотвествующего модуля. Когда он пишет пост - он создает объект. После этого либо его репозиторий постоянно доступен в on-line, либо у пользователя есть 1-2 внешних сервера, которые поддерживают копию его репозитория и куда он может сливать изменения. Соответственно - он выполняет операцию push - и его пост появляется там. По мере синхронизации дальше его измениня распрострняются по сети. Кроме того - у него есть копии тех репозиториев тех пользователей, ленты которых ему интересны и известны сервера, которые поддерживают клонирование этих репозиториев (аналог ф-ленты). таковыми могут быть online-сервера авторов соотвествующих блогов, или хосты, на которые эти блоги сливают авторы, или же какие-то аггрегирующие сайты, которые поддерживают более или менее все или крупные(например тематические) модули. Имея ссылку на объект процесс апдейта такой: выбирается наиболее удобный из вторичных origin'ов, получается соответствующий объект или модуль целиком, потом идет ссылка к первичному origin'у за актуальным апдейтом (если надо, конечно). Если пишется коммент - асоздается соотвествующий текстовый объект и ассоциации. При синхронизации серверам, которые заданы как origin'ы послыается нотификация о их появлении - реакция по умолчанию - принять соотвествующие объекты. В случае отказа они так же начинают распространяться - и в тех репозиториях, где есть и изначальный пост и соответствующие ассоциации (владельцы которых отличаются) - к посту оказывается привязан коммент: если комментатор есть в вашем "френдлисте" это произойдет при первой же синхронизации, иначе процесс может затянуться, но Собственно в первом приближении все. Чего хочется достичь: не столько защиты от кровавой гэбни или суперанонимности, сколько независимости от капризов авторов и хостеров и наличия полной истории изменений (в частности возможности посмотреть состояние на заданный момент времени): 1) вообще говоря, не существует способа удалить из системы то, что было в нее выложено и успело разойтись: это не бага, а фича. 2) не существует способа воспрепятствовать комментированию: если вам неприятен некий автор или некий комментарий - вы можете запретить его показ или распространение у себя на сервере: но не можете воспрепятствовать тому, что другим он с большой вероятностью будет виден. 3) отказ/отключение любого из серверов вообще говоря не ведет к потере информации, источником которой он является. Также к этому не ведет и уход пользователя из сети - хотя, разумеется, если оно не успело разойтись - потери информации возможны. В первом приближении все. PS: Вообще говоря, блоговодство является частным применением - по идее также можно держать сайты etc. Для "больших" объектов видимо можно иметь альтернативный алгоритм распространения наподобие торрентов - когда файл берется со всех источников, в которых он доступен (вероятно, для этого достаточно просто его нарезать на куски и сделать модулем - дальше при вменяемом алгоритме распределения нагрузки при синхронизации вроде все должно получиться само). PPS: Разумеется - некие гейты (в ЖЖ, LJR, возможно вики), возможность просмотра репозитория, как html-сайта, возможность импорта и апдейта внешних html-сайтов etc - это понятная техника. |
||||||||||||||
![]() |
![]() |