Создание распределенного хранилища пользовательских изображений.
- Пользователь в своем приложении сохраняет изображение под уникальным именем (ключом). При коллизии имен выводится ошибка.
- Изображение сохраняется в распределенную бд.
- Сохнаненные изображения могут быть получены из бд по имени.
- Конечный сервер фактического хранения данных выбирается случайным образом, либо по какой-нибудь простой метрике (например, по заполненности данными)
- Пользовательское приложение общается с центральным сервером (СУБД), на котором данные не хранятся. Сервер предоставляет API для доступа к данным.
- Сервер взаимодействует со всеми бд, реплицируя на них запросы получения данных.
- Конечный сервер фактического хранения данных предоставляет интерфейс записи и считывания данных.
- Конечный сервер фактического хранения данных хранит данные в виде ключ - значение.
Таким образом, необходимо создать централизованное распределенное хранилище данных ключ - значение и реализовать прикладное приложение для проверки его работоспособности.
- Протокол взаимодействия - любой (например TCP/UDP, или даже HTTP).
- Тип сообщений - json, bson, или свое.
- Представление изображений для хранения и передачи - бинарный или текстовый (base64).
- Ключ = хэш_сумма(документ). Алгоритм md5, sha2 и т.п.
- Способ хранения данных - выбирается человеком, реализующим эту подсистему, самостоятельно.
Сохдается большой файл со всеми данными. При малых размерах полностью кэшировается в память, а при больших, осуществляется однопроходной линейный поиск по файлу. Оптимизации по желанию.
Структура данных, например, такая:
<флаг><ключ><размер><значение>
<флаг><ключ><размер><значение>
<флаг><ключ><размер><значение>
...
Добавление данных в конец файла, флаг сигнализирует об удалении следующей пары.
В журнале хранится вся необходимая информация для досупа к данным в файле данных. Например, структура журнального файла такая:
<ключ><размер><сдвиг-в-байтах>
<ключ><размер><сдвиг-в-байтах>
<ключ><размер><сдвиг-в-байтах>
...
Здесь <сдвиг-в-байтах>
, это индекс начала документа в файле с данными.
Один документ - один файл. В этом случае путь вычисляется следующим образом. Допустим, ключ документа f8e1c82556d24f478a1d0867892079f0
, тогда путь будет следующий: f8/e1/c8/f0
, где f0 - имя самого файла.