سؤال

أقوم حاليًا بتصميم بنية لتطبيق قائم على الويب والذي يجب أن يوفر أيضًا نوعًا من تخزين الصور.سيتمكن المستخدمون من تحميل الصور كأحد الميزات الرئيسية للخدمة.سيكون عرض هذه الصور أيضًا أحد الاستخدامات الأساسية (عبر الويب).

ومع ذلك، لست متأكدًا من كيفية تحقيق مكون تخزين الصور القابل للتطوير في تطبيقي.لقد فكرت بالفعل في حلول مختلفة ولكن بسبب التجارب المفقودة، أتطلع إلى سماع اقتراحاتكم.وبصرف النظر عن الصور، يجب أيضًا حفظ البيانات التعريفية.وهنا أفكاري الأولية:

  1. استخدم نظام ملفات (موزعًا) مثل HDFS وقم بإعداد خوادم ويب مخصصة كـ "عملاء نظام الملفات" لحفظ الصور التي تم تحميلها وطلبات الخدمة.يتم حفظ البيانات الوصفية للصورة في قاعدة بيانات إضافية تتضمن معلومات مسار الملف لكل صورة.

  2. استخدم نظامًا موجهًا لـ BigTable مثل HBase أعلى HDFS واحفظ الصور وبيانات التعريف معًا.مرة أخرى، تعمل خوادم الويب على ربط عمليات تحميل الصور وطلباتها.

  3. استخدم قاعدة بيانات غير مخططة تمامًا مثل CouchDB لتخزين الصور والبيانات الوصفية.بالإضافة إلى ذلك، استخدم قاعدة البيانات نفسها للتحميل والتسليم باستخدام RESTful API المستندة إلى HTTP.(سؤال إضافي:يقوم CouchDB بحفظ النقط عبر Base64.ومع ذلك، هل يمكنه إرجاع البيانات في شكل صورة/jpeg وما إلى ذلك)؟

هل كانت مفيدة؟

المحلول

لقد تم استخدام CouchDB لذلك، وحفظ الصور كـ "مرفق".ولكن بعد مرور عام، تبين أن ملفات قاعدة بيانات GB CouchDB التي يبلغ عددها عشرات من الملفات كانت بمثابة صداع.على سبيل المثال، لا يزال النسخ المتماثل لـ CouchDB يواجه مشكلات إذا كنت تستخدمه مع أحجام مستندات كبيرة جدًا.

لذلك قمنا بإعادة كتابة برنامجنا لاستخدام CouchDB للحصول على معلومات الصور وAmazon S3 لتخزين الصور الفعلي.الكود متاح في http://github.com/hudora/huImages

قد ترغب في إعداد خدمة تخزين متوافقة مع Amazon S3 في الموقع لمشروعك.وهذا يبقيك مرنًا ويترك خيار أمازون دون الحاجة إلى خدمات خارجية في الوقت الحالي. الفظ يبدو أنه أصبح استنساخ S3 الأكثر شعبية وقابلية للتطوير.

وأحثك أيضًا على النظر في تصميم Livejournal من خلال مصدرها المفتوح الممتاز موجيلFS و بيرلبال القرابين. هذا المزيج من المحتمل أن يكون هذا هو إعداد عرض الصور الأكثر شهرة.

أيضا العمارة فليكر يمكن أن تكون مصدر إلهام، على الرغم من أنها لا تقدم برمجيات مفتوحة المصدر للعامة، كما تفعل Livejournal.

نصائح أخرى

"سؤال إضافي: CouchDB لا يحفظ النقط عبر BASE64."

couchdb يفعل ليس حفظ النقط كما base64 ، يتم تخزينها على أنها ثنائية مستقيمة. عند استرداد وثيقة JSON مع ?attachments=true نقوم بتحويل الثنائي على الرقص إلى BASE64 من أجل إضافته بأمان إلى JSON ، لكن هذا مجرد مستوى عرض تقديمي.

نرى مرفقات مستقلة.

يقدم CouchDB المرفقات مع نوع المحتوى الذي يتم تخزينه ، ومن الممكن ، في الواقع ، مرفقات HTML و CSS و GIF/PNG/JPEG مباشرة إلى المتصفحات.

يمكن بث المرفقات ، وفي CouchDB 1.1 ، حتى يدعم رأس النطاق (لاستمرار الوسائط و/أو استئناف تنزيل متقطع).

يستخدم الأعشاب البحرية (اعتاد أن يطلق عليه Weed-FS) ، وهو تطبيق لورقة Haystack Facebook.

الأعشاب البحرية-FS مرنة للغاية ويقسم إلى الأساسيات. تم إنشاؤه لتخزين مليارات الصور وخدمتها بسرعة.

هل فكرت في Amazon Web Services؟ S3 هو تخزين الملفات المستندة إلى الويب ، و SimpledB هو مخزن السمات مفتاح. كلاهما مؤثرين وقابل للتطوير للغاية. إنه أغلى من الحفاظ على الخوادم والإعدادات الخاصة بك (على افتراض أنك ستفعل ذلك بنفسك ولا توظف أشخاصًا) ، لكنك تنهض وتشغل بسرعة أكبر.

تحرير: أنا أعود إلى الوراء - إنه أغلى على المدى الطويل بأحجام عالية ، ولكن بالنسبة للحجم المنخفض ، فإنه يتفوق على التكلفة الأولية لشراء الأجهزة.

S3: http://aws.amazon.com/s3/ (يمكنك تخزين ملفات الصور الخاصة بك هنا ، وللأداء ، ربما يكون لديك ذاكرة التخزين المؤقت للصورة على الخادم الخاص بك ، أو ربما لا)

SimpledB: http://aws.amazon.com/simpledb/ (يمكن أن تذهب البيانات الوصفية إلى هنا: رسم خرائط معرف الصورة إلى أي بيانات تريد تخزينها)

تحرير 2: لم أكن أعرف ذلك ، ولكن هناك خدمة ويب جديدة تسمى Amazon Cloudfront (http://aws.amazon.com/cloudfront/). إنه لتسليم محتوى الويب السريع ، ويتكامل بشكل جيد مع S3. نوع من مثل Akamai لصورك. يمكنك استخدام هذا بدلاً من ذاكرة التخزين المؤقت للصورة.

نحن نستخدم mogilefs. نحن مستخدمون صغيرون على نطاق واسع مع أقل من 8 تيرابايت وحوالي 50 مليون ملف. لقد تحولنا من التخزين في Amazon S3 منذ بضع سنوات لتحكم أفضل في أسماء الملفات والأداء.

إنه ليس أجمل البرامج ، لكنه "تم اختباره الميداني" للغاية ويستخدمه جميع المستخدمين بشكل أساسي بنفس الطريقة التي ستكون بها.

ربما إلقاء نظرة على وصف Facebook Haystack

الإبرة في كومة قش: تخزين فعال من مليارات الصور

كجزء من Cloudant ، لا أريد دفع المنتج .... لكن BigCouch يحل هذه المشكلة في مكدس تطبيق العلوم الخاص بي (الفيزياء - لا علاقة له بـ Cloudant ، وبالتأكيد لا علاقة له بالربح!). إنه يتزوج من بساطة تصميم Cocuhdb مع التقسيم التلقائي وقابلية التوسع المفقودة في CouchDB خادم واحد. أستخدمه عمومًا لتخزين عدد أقل من الملفات الكبيرة (متعددة GB) وعدد كبير من الملفات الصغيرة (100 ميجابايت أو أقل). كنت أستخدم S3 ولكن تكاليف GET تبدأ فعليًا في إضافة ملفات صغيرة يتم الوصول إليها مرارًا وتكرارًا.

حسنًا ، إذا لم تنجح كل هذه الأشياء AWS ، فإليك بعض الأفكار.

بقدر (3) ، إذا وضعت البيانات الثنائية في قاعدة بيانات ، فإن نفس البيانات ستظهر. ما يجعلها JPEG هي تنسيق البيانات ، وليس ما تعتقده قاعدة البيانات. ما الذي يجعل العميل (متصفح الويب) يعتقد أنه JPEG هو عندما تقوم بتعيين Content-type رأس ل image/jpeg. يمكنك أيضًا تعيينه على شيء آخر (غير مستحسن) مثل النص ، وهكذا يحاول المتصفح تفسيره.

بالنسبة للتخزين على القرص ، أحب Couchdb لبساطته ، لكن HDFs ستعمل بالتأكيد. إليك رابط إلى منشور حول تقديم محتوى الصورة من CouchDB: http://japhr.blogspot.com/2009/04/render-couchdb-images-via-sinatra.html

تحرير: إليك رابط لمناقشة مفيدة حول تخزين الصور في Memcached vs التي تخدمها من القرص تحت Linux/Apache.

لقد قمت بتجربة بعض وظائف _update المتاحة لخوادم CouchDB View في خادم Python View الخاص بي.

أحد الأشياء الرائعة حقًا التي قمت بها هي وظيفة التحديث لتحميل الصور حتى أتمكن من استخدام PIL لإنشاء صور مصغرة وغيرها من الصور ذات الصلة وإرفاقها بالمستند عندما يتم دفعها إلى CouchDB.

قد يكون هذا مفيدًا إذا كنت بحاجة إلى معالجة الصور وترغب في خفض كمية الكود والبنية التحتية التي تحتاجها للمواكبة.

لقد كتبت متجر الصور فوق كاساندرا. لدينا الكثير ويكتب وقراءات عشوائية القراءة/الكتابة منخفضة. لنسبة القراءة/الكتابة عالية أقترح عليك mongodb (الشبكة).

فيما يلي مثال لتخزين صورة blob في CouchDB باستخدام php laravel. في هذا المثال ، أقوم بتخزين ثلاث صور بناءً على متطلبات المستخدم.

إنشاء الاتصال في CouchDB.

$connection = DB::connection('your database name');

/*region Fetching the Uers Uploaded Images*/

$FirstImage = base64_encode(file_get_contents(Input::file('FirstImageInput')));
$SecondImage =base64_encode(file_get_contents(Input::file('SecondImageInput')));
$ThirdImage = base64_encode(file_get_contents(Input::file('ThirdImageInput')));

list($id, $rev) = $connection->putDocument(array(
    'name' => $name,
    'location' => $location,
    'phone' => $phone,
    'website' => $website,
    "_attachments" =>[
        'FirstImage.png' => [
            'content_type' => "image/png",
            'data' => $FirstImage
        ],
        'SecondImage.png' => [
            'content_type' => "image/png",
            'data' => $SecondImage
        ],
        'ThirdImage.png' => [
            'content_type' => "image/png",
            'data' => $ThirdImage
        ]
    ],
), $id, $rev);

...

كما يمكنك تخزين صورة واحدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top