سؤال

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

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

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

أي مدخلات هو موضع تقدير كبير.

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

المحلول

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

تغليف الوصول إلى جدول في وحدة هو حل جيد.فإنه يخلق لا تعقيد إضافي, مع توفير السليم مستوى التجريد و التغليف.

نصائح أخرى

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

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

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

والشيء الوحيد الذي لAPI gen_server أساس يمنحك أكثر من API النقي الوظائف هو تسلسل الوصول إلى طاولة - وهو شرط غير عادي وإلا إذا كنت في حاجة إليها على وجه التحديد، وسوف يكون قاتلا الأداء

قد يكون فكرة جيدة للتعامل مع الجدول mnesia باستخدام عملية gen_server واحدة عندما تريد استخدام الوصول القذرة وتجنب المعاملات. هذا النهج قد يكون أسرع من TXS، ولكن كما عادة تحتاج لقياس ذلك.

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