سؤال

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

الآن نحن نستخدم MySQL وإدخال صف واحد لكل زوج من الوضع الواقعي. إن كتابة ملايين الصفوف إلى MySQL تستغرق بعض الوقت (I/O) ، حتى مع الإدراج بالجملة والتحسين الثقيل. نحتاج إلى أن تكون هذه عملية تفاعلية ، وليس عملية دفعة.

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

لذلك ، لتلخيص ، إليك المتطلبات:

  • تكتب الجزء الأكبر من الكمون المنخفض من عشرات الملايين من السجلات
  • يجب أن تستمر البيانات بطريقة ما
  • قراءات عشوائية زمن انتقال منخفضة
  • يكتب دائمة غير مطلوبة
  • الاتساق النهائي على ما يرام

إليك بعض الحلول التي نظرت إليها:

  • اكتب خلف ذاكرة التخزين المؤقت (Terracotta ، Gigaspaces ، التماسك) حيث تتم كتابة السجلات إلى الذاكرة واستنزاف إلى قاعدة البيانات بشكل غير متزامن. هذه تخيفني قليلاً لأنها تبدو أنها تضيف قدرًا معينًا من التعقيد إلى التطبيق الذي أرغب في تجنبه.
  • متاجر ذات قيمة مفاتيح قابلة للتطوير للغاية ، مثل Mongodb و HBase و Tokyo Tyrant
هل كانت مفيدة؟

المحلول

إذا كان لديك ميزانية لاستخدام التماسك لهذا ، فإنني أوصي بشدة بذلك. هناك دعم مباشر للكتابة ، وسلوك الاتساق في نهاية المطاف في التماسك ، وهو أمر يمكن البقاء على قيد الحياة للغاية في انقطاع انقطاع قاعدة البيانات والتماسك (إذا كنت تستخدم> = 3 عقد تماسك على JVMs منفصلة ، ويفضل على مضيفين منفصلين). لقد قمت بتطبيق هذا لقيامه بموقع التجارة الإلكترونية لشركة Fortune 100 ، وهو يعمل بشكل خيالي.

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

لجعل نقطة جيدة حقًا - إن قلقك بشأن إضافة تعقيد التطبيق أمر جيد. مع التماسك ، يمكنك ببساطة كتابة تحديثات إلى ذاكرة التخزين المؤقت (أو إذا كنت تستخدم Hibernate ، فيمكن أن يكون مزود ذاكرة التخزين المؤقت L2). اعتمادًا على تكوين التماسك والطوبولوجيا ، لديك خيار نشر التطبيق الخاص بك لاستخدام ذاكرة التخزين المؤقت للكتابة والتوزيع. لذلك ، فإن تطبيقك ليس أكثر تعقيدًا (وبصراحة غير مدرك) بسبب ميزات ذاكرة التخزين المؤقت.

أخيرًا ، قمت بتطبيق الحل المذكور أعلاه من 2005-2007 عندما تم التماسك بواسطة Tangosol وكان لديهم أفضل دعم ممكن. لست متأكدًا من كيفية الآن الأشياء تحت Oracle - نأمل أن لا تزال جيدة.

نصائح أخرى

لقد عملت في مشروع كبير استخدم Asyncrhonous يكتب Althoguh في هذه الحالة كان مكتوبة يدويًا باستخدام مؤشرات ترابط الخلفية. يمكنك أيضًا تنفيذ شيء من هذا القبيل عن طريق إلغاء تحميل عملية كتابة DB إلى قائمة انتظار JMS.

شيء واحد من شأنه أن يسرع بالتأكيد يكتب DB هو القيام بها على دفعات. يمكن أن تكون تحديثات دفعة JDBC أوامر ذات حجم أسرع من الكتابة الفردية ، وإذا كنت تفعلها بشكل غير متزامن ، يمكنك فقط كتابتها 500 في وقت واحد.

اعتمادًا على كيفية تنظيم بياناتك ، ربما تكون قادرًا على استخدامها Sharding، إذا لم يكن الكمون القراءة منخفضًا بما يكفي ، فيمكنك أيضًا محاولة إضافة التخزين المؤقت. Memcache هو أحد الحلول الشائعة.

يحتوي Berkeley DB على جدول تجزئة عالي الأداء يستند إلى قرص يدعم المعاملات ، ويتكامل مع بيئة Java EE إذا كنت بحاجة إلى ذلك. إذا كنت قادرًا على تصميم البيانات كأزواج مفتاح/قيمة ، فقد يكون هذا حلًا قابل للتطوير للغاية.

http://www.oracle.com/technology/products/berkeley-db/je/index.html

(ملاحظة: اشترت Oracle Berkeley DB منذ حوالي 5-10 سنوات ؛ وقد كان المنتج الأصلي موجودًا لمدة 15-20 عامًا).

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