سؤال

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

ما هي خدمة القفل الموزعة التي ستستخدمها؟

المتطلبات هي:

  1. الاستبعاد المتبادل (القفل) الذي يمكن رؤيته من خلال العمليات/الآلات المختلفة
  2. قفل... الافراج عن الدلالات
  3. تحرير القفل تلقائيًا بعد مهلة معينة - إذا مات حامل القفل، فسيتم تحريره تلقائيًا بعد X ثانية
  4. تنفيذ جافا
  5. سهولة النشر - يجب ألا يتطلب نشرًا معقدًا يتجاوز Netapp أو MySql أو GigaSpaces.يجب أن تعمل بشكل جيد مع تلك المنتجات (خاصة GigaSpaces - ولهذا السبب تم استبعاد TerraCotta).
  6. من الجميل أن يكون لديك:. صافي التنفيذ
  7. إذا كان مجانيًا:كشف/تخفيف حالة الجمود

لست مهتمًا بإجابات مثل "يمكن إجراؤه عبر قاعدة بيانات" أو "يمكن إجراؤه عبر JavaSpaces" - أعرف ذلك.يجب أن تحتوي الإجابات ذات الصلة فقط على تنفيذ جاهز وجاهز ومثبت.

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

المحلول

فيما يلي الخطوط العريضة للإجابة المستندة إلى GigaSpaces والتي تلبي معاييرك، اعتمادًا على ما تعنيه بالضبط في المعايير 3.أنا أعمل مع GigaSpaces من .Net، وليس Java:

قم بإنشاء فئة تأمين باستخدام خاصية SpaceID+SpaceRouting التي تحدد ما هو مقفل وخاصية DataMember المنطقية غير مقفلة:

sealed public class IdLockTrans
{
    [SpaceID]
    [SpaceRouting]
    public string ID
    {
        get;
        set;
    }

    [DataMember]
    public bool Unlocked
    {
        get;
        set;
    }

    public IdLockTrans(Id id)
    {
        ID = id.ID;
    }

    public IdLockTrans()
    {
    }
}

سوف تستخدم وقت تأجير Gigaspaces لإطلاق القفل بعد مهلة معينة.سيؤدي ذلك إلى إزالة gigaspaces كائنات idlockTrans من المساحة تلقائيًا بعد أن تكون خاملة لفترة المهلة.يعني عدم وجود IdLockTrans للمعرف أن المعرف مفتوح.

سوف تقوم فئة الخزانة الخاصة بك بتحديد وتهيئة أعضاء الفصل هؤلاء

    private readonly ISpaceProxy _proxy;
    private readonly long _leaseTime;

    public override bool Lock(Id id, long timeout)
    {
        bool locked;
        IdLockTrans lockTransTemplate = new IdLockTrans(id);
        // Assume that this is a new id.
        try
        {
            _proxy.Write(lockTransTemplate, null, _leaseTime, 0, UpdateModifiers.WriteOnly);
            locked = true;
        }
        catch (EntryAlreadyInSpaceException)
        {
            using (ITransaction tx = _proxy.CreateLocalTransaction())
            {
                try
                {
                    lockTransTemplate.Unlocked = true;
                    IdLockTrans lockTrans = _proxy.Take(lockTransTemplate, tx, timeout);
                    locked = (lockTrans != null);
                    if (lockTrans != null)
                    {
                        lockTrans.Unlocked = false;
                        _proxy.Write(lockTrans, tx, _leaseTime, 0, UpdateModifiers.WriteOnly);
                    }
                    tx.Commit();
                }
                catch
                {
                    tx.Abort();
                    throw;
                }
            }
        }
        return locked;
    }

    public override void Unlock(Id lockedId)
    {
        IdLockTrans lockTrans = new IdLockTrans(lockedId);
        lockTrans.Unlocked = true;
        try
        {
            _proxy.Update(lockTrans, null, _leaseTime, 0, UpdateModifiers.UpdateOnly);
        }
        catch (EntryNotInSpaceException)
        {
            throw new Exception("IdLockTrans for " + lockTrans.ID
                + " not found on Unlock. Lock time exceeded lease time.");
        }
    }

نصائح أخرى

إن تنفيذ .Net الخاص بك قريب جدًا من واجهة برمجة التطبيقات للقفل/إلغاء القفل المتوفرة مع Java API.يرى:http://www.gigaspaces.com/docs/JavaDoc8.0/org/openspaces/core/DefaultGigaMap.html

يمكنك العثور على الكود المصدري لفئة Java هذه كجزء من ملف gs-openspaces-src.zip المتوفر مع المنتج.إن وجود نفس الشيء مع Gigaspaces .Net API يجب أن يكون مباشرًا.

في حال كنت لا تزال تبحث، نلقي نظرة على حارس حديقة أباتشي:

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

توفر وثائق Zookeeper أمثلة على ذلك كيفية بناء خدمة القفل على رأس Zookeeper.

يعد استخدام mysql لقفل مفتاح فريد أمرًا بسيطًا للغاية.

الافتراض 1:

أنت تستخدم المعاملة ويتم قراءة مستوى العزل الخاص بك.

الافتراض 2:يمكنك قفل سلسلة المعالجة الخاصة بك بمفتاح فريد، وتحريره عند تنفيذ معاملتك.

ثم يمكنك استخدام SQL هذا كقفل توزيع:

إدراج في قيم distributed_lock (مفتاح) (#{key}) على مفتاح تحديث مفتاح مكرر = مفتاح ؛

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