Идеальное место для хранения двоичных данных, которые можно отобразить, вызвав URL - PullRequest
7 голосов
/ 02 декабря 2011

Я ищу идеальное (эффективное и легко обслуживаемое) место для хранения двоичных данных.В моем случае это изображения.Я должен выполнить некоторую обработку изображений, масштабировать изображения и хранить их в подходящем месте, к которому можно получить доступ через службу RESTful.

Из моих исследований до сих пор у меня есть несколько вариантов, например:

  1. Решение NoSql, такое как MongoDB, GridFS
  2. Хранение в виде файлов в файловой системе в иерархии каталогов, а затем использование веб-сервера для доступа к изображениям по URL
  3. Хранилище документов Apache Jackrabbit Document
  4. Храните в кеше что-то вроде Memcache, Squid Proxy

Любые мысли о том, какой из них вы выберете, и почему он будет полезен или есть лучший способ сделать это?

Ответы [ 3 ]

7 голосов
/ 02 декабря 2011

Только что начал использовать GridFS, чтобы делать именно то, что вы описали.

Исходя из моего опыта, главным преимуществом GridFS является то, что он устраняет необходимость в отдельной системе хранения файлов. Весь наш уровень персистентности уже добавлен в Mongo, и поэтому следующим логическим шагом будет также сохранение нашей файловой системы. Простое пространство имен просто потрясающе и позволяет вам использовать богатый язык запросов для извлечения файлов на основе любых метаданных, которые вы хотите прикрепить к ним. В нашем приложении мы использовали объект 'appdata', в который была встроена вся информация о владельце.

Еще одна вещь, которую следует учитывать при хранении файлов в NoSQL, особенно в GridFS, - это то, что оно будет фрагментироваться и расширяться вместе с другими вашими данными. Если у вас есть все хранилище значений ключей БД на сервере Монго, то в конечном итоге, если вам когда-нибудь понадобится расширить кластер серверов с помощью большего количества компьютеров, ваша файловая система будет расти вместе с ней.

Это может показаться небольшим «черным ящиком», так как сами двоичные данные разбиты на куски, перспектива, которая пугает те, которые используются в классической файловой системе на основе каталогов. Это облегчается с помощью программ администратора, таких как RockMongo.

В общем, хранить изображения в GridFS так же просто, как вставлять сами документы, большинство драйверов для всех основных языков обрабатывают все за вас. В нашей среде мы загружали изображения в конечную точку и использовали PIL для изменения размера. Затем изображения извлекались из Монго в другой конечной точке, которая просто выводила данные, и имитировала их в формате JPEG.

Удачи!

EDIT

Чтобы дать вам пример простой загрузки файла с помощью GridFS, вот самый простой подход к PyMongo, библиотеке python.

from pymongo import Connection
import gridfs

binary_data = 'Hello, world!'

db = Connection().test_db
fs = gridfs.GridFS(db)
#the filename kwarg sets the filename in the mongo doc, but you can pass anything in
#and make custom key-values too.
file_id = fs.put(binary_data, filename='helloworld.txt',anykey="foo")
output = fs.get(file_id).read()
print output 
>>>Hello, world!

Вы также можете запросить свои пользовательские значения, если хотите, что может быть ДЕЙСТВИТЕЛЬНО полезно, если вы хотите, чтобы ваши запросы основывались на пользовательской информации, относящейся к вашему приложению.

try:
  file = fs.get_last_version({'anykey':'foo'})
  return file.read()
catch gridfs.errors.NoFile:
  return  None

Это всего лишь несколько простых примеров, и драйверы для многих других языков (PHP, Ruby и т. Д.) Имеют родственников.

3 голосов
/ 02 декабря 2011

Я бы пошел на кролика в сочетании с его стропом REST Framework http://sling.apache.org

Sling позволяет загружать / скачивать файлы через вызовы REST или через веб-порт, в то время как базовый репозиторий крольчих дает вам отличное хранилище с возможностью хранить ваши файлы в древовидной структуре (или, если хотите, в плоском виде).

И кролик, и слинг поддерживают механизм событий, в котором вы можете асинхронно обрабатывать изображение после загрузки в него, т.е. создавать миниатюры.

Руководство по http://sling.apache.org/site/manipulating-content-the-slingpostservlet-servletspost.html описывает, как манипулировать данными с использованием интерфейса REST, предоставляемого sling.

1 голос
/ 02 декабря 2011

Хранение изображений в виде BLOB-объектов в СУБД в другом варианте, и вы сразу получаете некоторые гарантии целостности, безопасности и т. Д. (Если это правильно настроено в базе данных), сохраняете дополнительные метаданные, управляете коллекцией с помощью SQL и т. Д.

...