سؤال

لدي تطبيق عبارة عن مزيج من Java وC++ على Solaris.تعمل جوانب Java من التعليمات البرمجية على تشغيل واجهة مستخدم الويب وإنشاء الحالة على الأجهزة التي نتحدث إليها، ويقوم كود C++ بمعالجة البيانات القادمة من الأجهزة في الوقت الفعلي.تُستخدم الذاكرة المشتركة لتمرير معلومات حالة الجهاز والسياق من كود Java إلى كود C++.يستخدم كود Java قاعدة بيانات PostgreSQL للاحتفاظ بحالته.

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


لقد تم تحقيق النجاح الكبير هنا من خلال كود C++.يتم استخدام واجهة الويب بشكل خفيف إلى حد ما لتكوين الأجهزة؛ما نواجهه حقًا هو التعامل مع أحجام البيانات التي تقدمها الأجهزة بمجرد تهيئتها.

تحتوي كل قطعة من البيانات التي نستعيدها من الجهاز على معرف يشير إلى سياق الجهاز، ونحن بحاجة إلى البحث عن ذلك.يوجد حاليًا سلسلة من كائنات الذاكرة المشتركة التي يتم الاحتفاظ بها بواسطة كود Java/UI والمشار إليها بواسطة كود C++، وهذا هو عنق الزجاجة.بسبب هذه البنية، لا يمكننا نقل معالجة بيانات C++ إلى جهاز آخر.نحن بحاجة إلى أن نكون قادرين على التوسع بحيث يمكن التعامل مع مجموعات فرعية مختلفة من الأجهزة بواسطة أجهزة مختلفة، ولكن بعد ذلك نفقد القدرة على القيام بهذا البحث عن السياق، وهذه هي المشكلة التي أحاول حلها:كيفية إلغاء تحميل معالجة البيانات في الوقت الفعلي إلى صناديق أخرى مع الاستمرار في الرجوع إلى سياق الجهاز.

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


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

أنا الآن أنظر إلى Terracotta كوسيلة لتوسيع نطاق كود Java، لكنني لم أتوصل إلى حد معرفة كيفية توسيع نطاق C++ لمطابقته.

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

لو كان عليك القيام بالمهمة التي أوكلت إلي، ماذا ستفعل؟

يحرر:استنادًا إلى البيانات التي قدمها @john channing، فإنني أتطلع إلى كل من GigaSpaces وGemstone.يبدو أن Oracle Coherence وIBM ObjectGrid يعملان بنظام Java فقط.

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

المحلول

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

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

ثم سأستخدم مبدأ باريتو (قاعدة 80/20) لاختيار عدد صغير من الأشياء التي من شأنها أن تنتج أكبر المكاسب والتركيز فقط على تلك الأشياء.

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

ستكون البدائل الأخرى لتوسيع نطاق كود Java الخاص بك أفقيًا مساحات جيجا, شبكة كائنات آي بي إم أو الأحجار الكريمة Gemfire.

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

نصائح أخرى

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

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

بالنسبة لرمز قاعدة البيانات، كم مرة يتغير؟هل تتطلع إلى التخزين المؤقت في الوقت الحالي؟أفترض أنك نظرت إلى الفهارس وما إلى ذلك عبر البيانات لتسريع قاعدة البيانات؟

ما مستويات حركة المرور لديك في الواجهة الأمامية؟هل تقوم بتخزين صفحات الويب مؤقتًا؟(ليس من الصعب جدًا استخدام واجهة برمجة التطبيقات من نوع JMS للتواصل بين المكونات.يمكنك بعد ذلك وضع مكون صفحة الويب على جهاز واحد (أو أكثر)، ثم وضع رمز التكامل (c++) على جهاز آخر، وبالنسبة للعديد من منتجات JMS، توجد عادةً واجهة برمجة تطبيقات C++ أصلية، على سبيل المثال.يتبادر إلى ذهني ActiveMQ)، ولكنه يساعد حقًا في معرفة مقدار الوقت المستغرق في الويب (JSP؟) وC++ وعمليات قاعدة البيانات.

هل تقوم قاعدة البيانات بتخزين بيانات الأعمال أم أنها تستخدم أيضًا لتمرير البيانات بين Java وC++؟أنت تقول أنك تستخدم الذاكرة المشتركة وليس JNI؟ما هو مستوى الخيوط المتعددة الموجود حاليًا في التطبيق؟هل تصف الكود بأنه متزامن بطبيعته أم غير متزامن؟

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

ما هي متطلبات HA؟أي.معلومات الدولة فقط؟هل يمكن إجراء HA في طبقة الويب فقط عن طريق تجميع بيانات الجلسة؟

هل قاعدة البيانات تعمل على جهاز آخر؟

ما هو حجم قاعدة البيانات؟هل قمت بتحسين استفساراتك على سبيل المثال.حاولت استخدام الصلات الداخلية/الخارجية الصريحة أحيانًا مما يساعد في مقابل الاستعلامات الفرعية المتداخلة (أحيانًا).(انظر مرة أخرى إلى إحصائيات SQL).

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