مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

aminsoraya

عضویت از 1393/10/17

سفارشی سازی و بهینه سازی الگوی طراحی flyweight در برنامه نویسی غیر همزمان

  • پنجشنبه 8 شهریور 1397
  • 12:18
تشکر میکنم

سلام

تو سناریوی من نیاز هست که به صورت غیر همزمان هر چند ثانیه یک بار با جدول اطلاعاتی ارتباط برقرار بشه و فیلدی که ستون IsCompleted اون هنوز false رو بعد از انجام یه سری فعل و انفعلاعات true کنه (به معنای اتمام فرآیند مر بوط به اون رکورد که مجددا چک نشه) این روالها به صورت غیر همزمان پشت صحنه انجام میشه و

بدیهیه که استفاده از الگوی طراحی fly weight  کاملا محسوسه چرا که مدام باید با بانک ارتباط برقرار بشه و این خود هزینه بره.  اما علاوه بر اون باید با هر بار فراخوانی به صورت غیر همزمان رکورد مورد نظر از pool خونده بشه و بعد از اون از pool حذف بشه یا بروزرسانی که نشون بده فیلد آپدیت شده. ! یا حتی باید ابتدا تو pool داده ها رو تبادل کنم و بعدش به صورت غیر همزمان اطلاعات رو تو جدول ثبت کنم

حال به نظر شما آیا این الگوی طراحی با چنین سناریویی باز هم قابل سفارش سازی و استفاده است یا این که من دارم اشتباه میکنم و یا این که شیوه مدرن دیگری هست؟

پاسخ های این پرسش

تعداد پاسخ ها : 3 پاسخ
کاربر سایت

aminsoraya

عضویت از 1393/10/17

  • پنجشنبه 8 شهریور 1397
  • 16:37

سلام مجدد خدمت دوستان عزیز

با چند تا جستجو تو گوگل و بررسی یه مقاله تونستم اون چیزی که میخوام رو بسازم و  سفارشی سازی  سازیش کنم:

روال کار به این صورته که به جای درخواست N  بار به دیتابیس حداقل یه بار pool چک میشه و یه بار با مقدار پر میشه و در دفعات بعد تا زمانی که pool خالی نباشه مقدار بر میگردونه(هر بار که مقداری رو بر گردونه اون مقدار رو از pool کم میکنه)

تکنولوژی که من سفارشیش کردم:

public static class _CacheUrl
    {
        private static Dictionary<int, tbUrl> _cach;
        private static object _lck;
        private static DataContext context = new DataContext();

        static _CacheUrl()
        {
            _cach = new Dictionary<int, tbUrl>();
            _lck = new object();
        }

        public  static tbUrl Read
        {
            get
            {
                lock (_lck)
                {

                    if (_cach.Count == 0)
                    {
                        List<tbUrl> tbUrl = context.tbUrls.Where(r => r.IsCompleted == false).ToList();
                        foreach (var c in tbUrl)
                            _cach.Add(c.Id, c);

                        return _cach.FirstOrDefault().Value;
                    }
                    else
                        return _cach.FirstOrDefault().Value;
                }
            }
        }

        public static void Update(int Id)
        {
            _cach.Remove(Id);
        }
    }

اینم لینک منبع:

https://dzone.com/articles/memory-cache-implementation-c

کاربر سایت

AmirGhasemi

عضویت از 1392/02/25

  • پنجشنبه 8 شهریور 1397
  • 19:10
سلام در این مواقع فقط و فقط و فقط signalR توصیه می گردد و لاغیر
کاربر سایت

aminsoraya

عضویت از 1393/10/17

  • شنبه 10 شهریور 1397
  • 09:32

در مواردی که فیلد جدیدی بروز یا اضاف میشه ، ساختار signalr بسیار عالی عمل میکنه و بدون چک کردن ، خودش رو (فیلد) به برنامه جهت نمایش معرفی میکنه ! خب خیلی خوبه اما

من به دلایل زیر signalr رو توصیه نمیکنم (فقط در صورتی که حداقل دلایل زیر صدق پیدا کنه ولا غیر)

_ در مواقعی که رکوردهایی  از قبل درج شده باشه ! اینجا هدف نهایی انعکاس به سمت اپلیکیشن نیس ! پس نیاز به چک کردن رکوردها هست که ارتباط چندانی با signalr نداره و اینجا بحث round trip  و کاهش io به وجود میاد و خوبه که به جای ارتباطات مکرر با پایگاه داده که باعث کندی برنامه میشه و ترافیک بیخودی ایجاد میکنه تنها با یک بار واکشی رکوردهای مورد نظر ، از رم و الگوهای طراحی بهره گرفت.

_ متاسفانه زیاد با ساختار signalr آشنا نیستم اما بعید نمیدونم که تنها یک بار آگاه سازی انجام میشه و در صورتی که timeout یا خطایی به وجود بیاد رکوردهایی ناکام میمونن .(چون ربات تنها به ازای رکورهایی که فرستنده دیتابیس  یک بار اونها رو ارسال میکنه کار میکنه و اگه به دلیلی از وجود رکورها بی خبر بشه پس قادر به پردازش نیس پس اینجا با عدم صحت عملکرد  مواجه ایم )

_همیشه امکان ارسال n دیتا به سمت اپلیکیشن وجود داره پس HANDLE کردن داده ها که Signalr دریافت میکنه خودش یه چالشه و حتی ممکنه با راه اندازی مجدد سرور همه چی (داده ها )از دست بره

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)