كيف نتعامل بكفاءة مع القيود المتعلقة بالوقت على سجلات الذاكرة?

StackOverflow https://stackoverflow.com/questions/6372639

سؤال

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

الآن ، وقد جلب هذا في توقيت.مثال على هيكل السجل هو:

 -record(free_airtime,
            {
                reference_no,
                timer_object,   %% value returned by timer:apply_after/4
                amount
            }).
 

كائن الموقت في السجل مهم لأنه في حالة المستخدم وأخيرا يضع لاستخدام الموارد المحجوزة قبل أن يتم مهلة (أو إذا كانت مهلة) ، يمكن للنظام الاتصال timer:cancel/1 وذلك لتخفيف خادم الموقت من هذا الكائن.الآن المشكلة ، لدي طريقتان للتعامل مع أجهزة ضبط الوقت على هذه السجلات:

الخيار 1:توقيت التعامل معها ضمن الصفقة

 reserve_resources(Reference_no,Amnt)->
    F = fun(Ref_no,Amount) -> 
            case mnesia:read({free_airtime,Ref_no}) of
                [] -> 
                    case mnesia:write(#free_airtime{reference_no = Ref_no,amount = Amount}) == ok of
                        true -> 
                            case timer:apply_after(timer:hours(24),?MODULE,reference_no_timed_out,[Ref_no]) of
                                {ok,Timer_obj} -> 
                                    [Obj] = mnesia:read({free_airtime,Ref_no}),
                                    mnesia:write(Obj#free_airtime{timer_object = Timer_obj});
                                _ -> mnesia:abort({error,failed_to_time_object})
                            end;
                        false -> mnesia:abort({error,write_failed})
                    end;
                [_] -> mnesia:abort({error,exists,Ref_no})
            end
        end,
    mnesia:activity(transaction,F,[Reference_no,Amnt],mnesia_frag).

حول الخيار أعلاه.

تقول مستندات منيسيا أن المعاملات ربما تتكرر من قبل مدير تم (لسبب ما) حتى تكون ناجحة ، وذلك عند وضع التعليمات البرمجية التي هي io:format/2 أو أي شيء آخر لا علاقة له به يكتب أو يقرأ ، قد يتم تنفيذه عدة مرات.جعلني هذا البيان أتوقف عند هذه النقطة والتفكير في طريقة للتعامل مع توقيت الخروج من الصفقة النفس ، لذلك أنا تعديل التعليمات البرمجية كما يتبع:

الخيار 2:توقيت التعامل معها خارج الصفقة

reserve_resources(Reference_no,Amnt)->
    F = fun(Ref_no,Amount) -> 
            case mnesia:read({free_airtime,Ref_no}) of
                [] -> 
                    P = #free_airtime{reference_no = Ref_no,amount = Amount},
                    ok = mnesia:write(P),
                    P;
                [_] -> mnesia:abort({error,exists,Ref_no})
            end
        end,    
    Result  =   try mnesia:activity(transaction,F,[Reference_no,Amnt],mnesia_frag) of
                    Any -> Any
                catch
                    exit:{aborted,{error,exists,XX}} -> {exists,XX}
                    E1:E2 -> {error,{E1,E2}}
                end,
    on_reservation(Result).

on_reservation(#free_airtime{reference_no = Some_Ref})-> 
    case timer:apply_after(timer:hours(24),?MODULE,reference_no_timed_out,[Some_Ref]) of
        {ok,Timer_obj} -> 
                [Obj] = mnesia:activity(transaction,fun(XX) -> mnesia:read({free_airtime,XX}) end,[Some_Ref],mnesia_frag),
                ok = mnesia:activity(transaction,fun(XX) -> mnesia:write(XX) end,[Obj#free_airtime{timer_object = Timer_obj}],mnesia_frag);
        _ -> 
            ok = mnesia:activity(transaction,fun(XX) -> mnesia:delete({free_airtime,XX}) end,[Some_Ref],mnesia_frag),
            {error,failed_to_time_object}
    end;
on_reservation(Any)-> Any.

رمز للتعامل مع الوقت للخروج من الحجز:

reference_no_timed_out(Ref_no)->
    do_somethings_here.....
    then later remove this reservation from the database....below..
    ok = mnesia:activity(transaction,fun(XX) -> mnesia:delete({free_airtime,XX}) end,[Ref_no],mnesia_frag).

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

السؤال 1: أي من هذين التطبيقين هو الصحيح?و / أو خطأ?قل لي (أيضا) الطقس كلاهما مخطئ

السؤال 2: وحدة الموقت ، هل هو مناسب تماما للتعامل مع أعداد كبيرة من الموقت وظائف في الإنتاج?

السؤال 3: بالمقارنة مع شون هيند توقيت-1.1, الذي يعمل على رأس منيسيا ، هو وحدة الموقت (ربما تعمل على رأس الجداول إتس) أقل قادر (لريال مدريد) في الإنتاج?(أسأل هذا لأن استخدام توقيت شون هيند على نظام يستخدم نفسه منيسيا يظهر أن تكون مشكلة من حيث التغييرات المخطط ، مشاكل عقدة الخ)

إذا كان أي واحد لديه طريقة أخرى للتعامل مع المشاكل المتعلقة الموقت مع منيسيا ، تحديث لي الرجال ثنكس...

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

المحلول

السؤال 1:

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

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

السؤال 2:

وحدة الموقت هو أنيق ، ولكن دليل الأداء توصي باستخدام erlang:start_timer بيفس بدلا من ذلك ، انظر

http://www.erlang.org/doc/efficiency_guide/commoncaveats.html#id58959

وأود أن أعرض عملية منفصلة باعتبارها gen_server الذي يعالج الاشياء توقيت.يمكنك إرسالها remove(timer:hours(24), RefNo) رسالة ثم يبدأ جهاز توقيت ، ويحصل على TRef وتثبيت رسم الخرائط {TRef, RefNo, AuxData} إما في منيسيا أو إتس.عندما الزناد الموقت ، يمكن للعملية تفرخ مساعد إزالة RefNo الدخول من الجدول الرئيسي.

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

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

خيار آخر مرة أخرى هو الغش وتخزين التوقيت فقط في بنية بيانات مما يجعل العثور عليه رخيصا جدا جميع ريفنو منتهية الصلاحية في آخر 5 دقائق ثم قم بتشغيل ذلك كل 5 دقائق.من المحتمل أن يكون القيام بالأشياء بكميات كبيرة أكثر فعالية.يتم استخدام هذا النوع من التعامل بالجملة كثيرا بواسطة حبات نظام التشغيل على سبيل المثال.

السؤال 3

لا أعرف شيئا عن timer-tm, ، آسف :)

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