В личку написал.
All
Предлагаю такую схему: (состряпал на скорую руку)
1. Клиент подключается к мастер-серверу и запрашивает актуальный список контент-серверов.
2. Клиент выбирает ближайший к себе контент-сервер и подключается к нему.
3. Клиент обращается к диспетчеру контента и согласовывает версии и контрольные суммы необходимых ему файлов.
4. Клиент загружает необходимые ему файлы.
Условия:
1. На сервере все GCF находятся в распакованом виде.
2. Обновление файлов на сервере происходит инкрементально (initialVersion -> diff(newVersion) -> diff(newVersion)), тем самым сохраняя возможность обновления до любой версии файла.
3. Работа с GCF происходит на стороне клиента.
Обмен данными между контент-серверами можно реализовать с помощью того же rsync.
Любой желающий может стать контент-сервером, но не может быть мастер-сервером или корневым контент-сервером (для безопасности).
Т. е. звенья:
Код: Выделить всё
MasterServer[] ->
-> ContentServer_1 -> [read all, write ContentCoordServer]
-> ContentServer_2 -> [read all, write ContentCoordServer]
...
-> ContentServer_n -> [read all, write ContentCoordServer]
-> ContentCoordServer_1 -> [read ContentServer, sync]
-> ContentCoordServer_2 -> [read ContentServer, sync]
...
-> ContentCoordServer_n -> [read ContentServer, sync]
MasterServer = мастер-сервер (только чтение)
ContentServer = контент-сервер (только чтение, запись только для координаторов)
ContentCoordServer = координатор контент-серверов (только чтение, для клиентов может выполнять роль обычного контент-сервера, но имеет меньший приоритет чем обычный контент-сервер)
----
P. S. Надеюсь изложил более менее понятно, на работе завал, уже 2-ая бессонная ночь :(