سؤال

أنا بناء على خادم جافا التي تحتاج إلى نطاق.واحدة من سيرفلتس سيتم تقديم الصور المخزنة في الأمازون S3.

مؤخرا تحت الحمل, لقد هربت من الذاكرة في VM كان بعد إضافة رمز لخدمة الصور لذلك أنا متأكد من أن تدفق أكبر بريمج الردود هو الذي يسبب المشاكل.

سؤالي هو :هل هناك أي أفضل الممارسات في كيفية رمز java servlet إلى تيار كبير (>200) رد إلى المتصفح عند القراءة من قاعدة البيانات أو غيرها من سحابة التخزين ؟

لقد فكرت في كتابة ملف محلي درجة الحرارة بالسيارة ثم التفريخ موضوع آخر للتعامل مع تدفق بحيث هر بريمج الموضوع يمكن إعادة استخدامها.هذا يبدو وكأنه سيكون io الثقيلة.

أي الأفكار سيكون موضع تقدير.شكرا

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

المحلول

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

ServletOutputStream out = response.getOutputStream();
InputStream in = [ code to get source input stream ];
String mimeType = [ code to get mimetype of data to be served ];
byte[] bytes = new byte[FILEBUFFERSIZE];
int bytesRead;

response.setContentType(mimeType);

while ((bytesRead = in.read(bytes)) != -1) {
    out.write(bytes, 0, bytesRead);
}

// do the following in a finally block:
in.close();
out.close();

أنا لا أتفق مع توبي, يجب عليك بدلا من "نقطة إلى S3 url."

أما بالنسبة OOM استثناء ، هل أنت متأكد أن له علاقة مع تخدم صورة البيانات ؟ دعونا نقول JVM وقد 256MB "إضافية" الذاكرة إلى استخدام خدمة بيانات الصورة.مع مساعدة Google, "256MB / 200KB" = 1310.2 غيغابايت "إضافية" الذاكرة (في هذه الأيام مبلغ معقول جدا) أكثر من 10 ، 000 عملاء المتزامنة يمكن أن تكون معتمدة.حتى 1300 عملاء المتزامنة هو عدد كبير جدا.هذا النوع من الحمل كنت من ذوي الخبرة ؟ إن لم يكن, قد تحتاج إلى البحث في مكان آخر عن سبب OOM استثناء.

تحرير - فيما يتعلق:

في هذه الحالة استخدام الصور يمكن أن تحتوي على بيانات حساسة...

عندما قرأت خلال S3 الوثائق قبل بضعة أسابيع, لقد لاحظت أنه يمكنك توليد الوقت تنتهي المفاتيح التي يمكن أن تعلق S3 عناوين url.لذا لا يجب أن تفتح الملفات على S3 للجمهور.ما أفهمه من هذه التقنية:

  1. الأولي HTML صفحة روابط التحميل الخاصة بك webapp
  2. ينقر المستخدم على رابط التحميل
  3. الخاص بك webapp يولد S3 URL التي تتضمن الرئيسية التي تنتهي في, دعنا نقول, 5 دقائق.
  4. إرسال إعادة توجيه HTTP إلى العميل مع عنوان URL من الخطوة 3.
  5. المستخدم بتحميل الملف من S3.يعمل هذا حتى إذا كان التحميل يستغرق أكثر من 5 دقائق - مرة واحدة يبدأ التحميل يمكن أن تستمر من خلال الإنجاز.

نصائح أخرى

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

لقد رأيت الكثير من التعليمات البرمجية مثل جون-vasilef هو (حاليا مقبولة) الإجابة, ضيق في حين حلقة القراءة قطع من تيار واحد و الكتابة عليها إلى تيار آخر.

بحجة أنني سأكون ضد وغني عن رمز الازدواجية في صالح استخدام أباتشي IOUtils.إذا كنت تستخدم بالفعل في مكان آخر ، أو إذا كان مكتبة أخرى أو الإطار كنت تستخدم بالفعل اعتمادا على إنه خط واحد وهذا هو المعروف واختبارها جيدا.

في البرمجية التالية سأعرض كائن من الأمازون S3 إلى العميل في بريمج.

import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.io.IOUtils;

InputStream in = null;
OutputStream out = null;

try {
    in = object.getObjectContent();
    out = response.getOutputStream();
    IOUtils.copy(in, out);
} finally {
    IOUtils.closeQuietly(in);
    IOUtils.closeQuietly(out);
}

6 خطوط محددة جيدا مع نمط سليم تيار إغلاق يبدو متينا جدا.

وأنا أتفق بشدة مع كل من توبي و جون Vasileff--S3 كبيرة من أجل إيقاف تحميل كبيرة من كائنات الوسائط إذا كنت يمكن أن يتسامح مع القضايا المرتبطة بها.(مثيل الخاصة التطبيق يفعل ذلك لمدة 10-1000MB FLVs و MP4s.) E. g.:لا جزئية طلبات (byte مجموعة رأس) ، على الرغم من.على المرء أن التعامل مع هذا 'يدويا', في بعض الأحيان ، الخ..

إذا كان هذا ليس خيارا ، جون رمز تبدو جيدة.لقد وجدت أنه بايت العازلة من 2k FILEBUFFERSIZE هو الأكثر كفاءة في microbench علامات.خيار آخر قد يكون مشترك FileChannel.(FileChannels هي مؤشر الترابط-الآمن.)

وقال أريد أن أضيف أيضا أن التخمين في ما تسبب خطأ من الذاكرة الكلاسيكية الأمثل خطأ.يمكنك تحسين فرصك في النجاح من خلال العمل مع المقاييس.

  1. المكان -XX:+HeapDumpOnOutOfMemoryError في JVM معلمات بدء التشغيل فقط في حالة
  2. اتخاذ استخدام jmap على التوالي JVM (jmap -histo <pid>) تحت الحمل
  3. Analyize المقاييس (jmap -ت اخماد أو jhat تبدو في كومة تفريغ).جيدا جدا قد يكون ذلك من الذاكرة قادم من مكان غير متوقع.

بالطبع هناك أدوات أخرى هناك ، ولكن jmap & jhat تأتي مع جافا 5+ 'للخروج من مربع'

لقد فكرت في كتابة ملف محلي درجة الحرارة بالسيارة ثم التفريخ موضوع آخر للتعامل مع تدفق بحيث هر بريمج الموضوع يمكن إعادة استخدامها.هذا يبدو وكأنه سيكون io الثقيلة.

آه, أنا لا أعتقد أنك يمكن أن تفعل ذلك.وحتى لو كنت قد يبدو مشكوك فيها.هر ترابط إدارة يحتاج اتصال في التحكم.إذا كنت تعاني من موضوع المجاعة ثم زيادة عدد المواضيع المتاحة في ./conf/server.xml.مرة أخرى المقاييس هي طريقة للكشف عن هذا--لا مجرد تخمين.

السؤال:أنت أيضا تعمل على EC2?ما هي هر JVM بدء المعلمات ؟

توبي هو الحق ، يجب أن يشير مباشرة إلى S3, إذا كنت تستطيع.إذا كنت لا يمكن أن السؤال هو غامض قليلا لإعطاء استجابة دقيقة:كيف كبيرة هو جافا الخاص بك كومة?كيف العديد من تيارات مفتوحة بشكل متزامن عند نفاد الذاكرة ؟
كيف كبيرة هو قراءة وكتابة/bufer (8K جيد)?
كنت تقرأ 8K من تيار ، ثم كتابة 8k إلى الإخراج ، أليس كذلك ؟ لا تحاول قراءة الصورة كاملة من S3, عازلة في الذاكرة ، ثم إرسال كل شيء في مرة واحدة ؟

إذا كنت تستخدم 8K مخازن, هل يمكن أن يكون 1000 المتزامنة تيارات تسير في ~8Megs من كومة الفضاء ، لذلك كنت بالتأكيد تفعل شيئا خاطئا....

راجع للشغل, أنا لا اختيار 8K من فراغ ، بل هو الحجم الافتراضي على مأخذ مخازن إرسال المزيد من البيانات ، ويقول 1Meg ، سيتم حظر على مكدس tcp/ip يحمل كمية كبيرة من الذاكرة.

عليك أن تحقق أمرين:

  • هل إغلاق تيار ؟ مهم جدا
  • ربما كنت تعطي تيار اتصالات "مجانا".تيار ليست كبيرة, ولكن العديد من تيارات عديدة في نفس الوقت يمكن أن يسرق كل ما تبذلونه من الذاكرة.إنشاء تجمع بحيث لا يمكن أن يكون لديك عدد معين من الجداول قيد التشغيل في نفس الوقت

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

إذا كنت يمكن أن هيكل الملفات الخاصة بك بحيث ثابت ملفات منفصلة في دلو الخاصة ، وأسرع أداء اليوم يمكن أن تتحقق باستخدام الأمازون S3 CDN ، CloudFront.

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