سادگی زیباست...

بررسی انواع معماری های سیستم عامل و برنامه های سیستمی و روشهای توسعه آنها

سادگی زیباست...

بررسی انواع معماری های سیستم عامل و برنامه های سیستمی و روشهای توسعه آنها

سادگی زیباست...

اینکه برای یک سیستم شخصی هم ویندوز لازم هست و هم لینوکس یه چیز مشخص هست. تو لینوکس برای برنامه نویسی (خصوصا زبان پایتون و پرل و همچنین سی) یک بهشت محسوب میشه. این ور هم ویندوز سلاح خودش رو داره (مالتی مدیا، مجموعه آفیس و بازی های فراوان).

یه مشکل که برای خودم همیشه بود، خوندن داده های روی لینوکسم بوده که تو /home ذخیره میکردم. مثلا وقتی با لتک داکیومنت مینوشتم، نیاز میشد تو ویندوز یه فایلی رو ازش بردارم که مثلا برای ایمیل استفاده بکنم. تو این شرایط دو تا راه وجود داره (برادران ردموندی لینوکس رو هنوز نمیشناسن)، یکی ریست کردن و رفتن به لینوکس و راه دوم استفاده از برنامه ای برای خواندن داده های درایو های لینوکس هست.

برنامه رایگان Linux Reader محصول شرکت diskInternals میتونه اکثر فرمت های لینوکسی برای درایو رو شناسایی بکنه و بتونین فایلهای خودتون رو کپی کنین. البته به صورت مستقیم نیمتونین روش کار کنین و باید ابتدا فایل رو سیو کنین.

اینم لینک دانلودش

http://www.diskinternals.com/download/Linux_Reader.exe

۰ موافقین ۰ مخالفین ۰ ۲۳ بهمن ۹۳ ، ۱۳:۵۲
حامد شیخلو

یک موسسه به اسم تیوب هر ماهه یک آماری از زبانهای برنامه نویسی ارائه میده و تو اون بررسی میکنه که محبوبترین زبانهای برنامه نویسی کدوم ها هستن. این آمار ها بر اساس تعداد مهندسان مشغول تو اون زبان برنامه نویسی، فرست های شغلی و همچنین تعداد شرکت های فعال تو اون زمینه ارائه میشه. برای این امارگیری از موتورهای جستجوی معروف مثل گوگل، بینگ، یاهو و بایدو اتفاده میشه.

اول آمار امسال رو ببینیم تا بعد در مورد اون صحبت کنیم:

Dec 2014 Dec 2013 Change Programming Language Ratings Change
1 1 C 17.588% -0.30%
2 2 Java 14.959% -2.35%
3 3 Objective-C 9.130% -1.07%
4 4 C++ 6.104% -2.16%
5 5 C# 4.328% -1.29%
6 6 PHP 2.746% -2.53%
7 10 change JavaScript 2.433% +0.58%
8 8 Python 2.287% +0.08%
9 11 change Visual Basic .NET 2.235% +0.55%
10 12 change Perl 1.826% +0.75%
11 - change Visual Basic 1.802% +1.80%
12 38 change R 1.630% +1.38%
13 9 change Transact-SQL 1.473% -0.40%
14 17 change PL/SQL 1.330% +0.73%
15 18 change Pascal 1.173% +0.58%
16 15 change Delphi/Object Pascal 1.118% +0.43%
17 - change Swift 1.065% +1.06%
18 13 change Ruby 0.978% +0.05%
19 20 change F# 0.888% +0.32%
20 14 change MATLAB 0.867% +0.16%

یه آمار برای بازه طولانی هم قرار داده:

C 1 2 1 1 1 1 1
Java 2 1 2 3 - - -
Objective-C 3 26 37 - - - -
C++ 4 3 3 2 2 2 12
C# 5 5 8 12 - - -
PHP 6 4 5 30 - - -
Python 7 6 6 23 22 - -
JavaScript 8 8 9 9 - - -
Visual Basic .NET 9 - - - - - -
Perl 10 7 4 4 9 19 -
Pascal 15 13 76 7 3 20 5
Lisp 17 16 12 17 5 3 2
Ada 32 25 15 10 6 4 3

بعضی چیزا خیلی جالب هست. مثلا زبان C عین مرد همیشه اول یا دوم هست. زبان objective-c تونسته به لطف iphone به رتبه های خیلی بالا بیاد. زبان پاسکال تو سال 2004 خیلی افت کرده و بعدش دوباره بالا اومده، تو سال 2004 چی شده؟ فکر کنم به خاطر تاثیر زبانهای اسکریپتی باشه.

پیشرفت زبانهای اسکریپتی (غیر از PHP) داره زبانهای دیگه رو تحت تاثیر قرار میده. من آخرش هم نفهمیدم چرا PHP این قدر بد دیزاین شده.

زبان Ada خیلی داره افت میکنه، که این مساله برای من جالبه. زبان ada سخت هست، و این مساله نشان دهنده اینه که در نهایت زبان باید کارا باشه و ساده هم باشه (مثل c).

آدرس وبسایت:

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

نظرتون در مورد این آمار چی هست؟ نظر بدین

۲ موافقین ۱ مخالفین ۰ ۰۲ دی ۹۳ ، ۱۲:۵۶
حامد شیخلو

برای من شرایطی بوجود اومد که میخواستم یه برنامه بنویسم به عنوان یک پلتفرم عمل کنه و با استفاده از ماژولهای مختلف که به مرور براش نوشته میشه، یه عمل خاص رو بر روی داده ها انجام بده. مثلا فرض کنید میخواین برای چند نوع فایل متنی متفاوت، چند تا برنامه بنویسین که بیاد رو اونا پراسس انجام بده. شبیه عکس زیر در نظر بگیرین:

RawFile ----> main program ----if type 1 ---> plugin 1(file processing)-----|-->Output

                                       |_if type 2----> plugin 2(file processing)-----|

                                       |_if type 3----> plugin 3(file processing)-----|

                                                                ...

 یه راه سریع اینه که بیاین یه برنامه بنویسین و پلاگین ها رو جدا بنویسین، تو برنامه خودتون هم بیاین و همون پلاگین ها رو تعریف کنین و ساختار داده هاشون رو مقداردهی اولیه کنین. اونوقت، باید برای هر پلاگین جدید که نوشته میشه، یه تغییری تو کد خودتون بدین. این ساختار زیاد خوب نیست، چون تغییرات نیازمندی رو به برنامه اصلی خودتون هم اتصال میدین.

راهی که من استفاده کردم، اینه که یک سوپر کلاس تعریف کردم و تو اون ساختار کلی پلاگین های خودم رو تعریف کردم. مثلا پروپرتی ها و تابع های اصلی رو. یه فولدر تو پروژه خودم قرار دادم که همه پلاگین ها تو اون قرار بگیرن. برای اینکه اضافه کردن پلاگین نیازی به تغییر کد نداشته باشه، باید اولا کدم تمامی پلاگین ها رو اتوماتین لود میکرد و یه عضو ازش میساخت. هر پلاگین هم باید شرطی که نوع فایل مرتبط رو مشخص میکرد همراه با داده های شناسایی خودش به برنامه اصلی میگفت. تو کد من هر کلاس باید یه regex Pattern رو به عنوان الگو خودش به کد اصلی معرفی میکرد تا برنامه اصلی از طریق اون پلاگین مناسب رو انتخاب بکنه.

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

import importlib, pkgutil, imp
plugins = {}
path = os.path.join(os.path.dirname(__file__),'Plugins')
modules = pkgutil.iter_modules(path=[path])
for loader,mod_name,ispkg in modules:
    if mod_name not in sys.modules:
        if mod_name.startswith('_'):
            mod = importlib.import_module("Plugins."+mod_name)
class_ = getattr(mod,mod_name) t=class_() Plugins[t.name]=t

اینجا برای مشخص شدن پلاگین ها از دیگه فایل ها من اومدم اول اسم فایل پلاگین ها یه "_" گذاشتم و تو شرط اون رو چک کردم.

در نهایت دیکشنری plugins یه کلید داره به اسم کلاس و محتویات اون یه شی از کلاس هست. من اینجا نمیخواستم از کلاس هر بار که لازمم میشه یه اینستنس جدا یسازم (تو پایتون هزینه هز اینستنس از کلاس خیلی زیاده).

۰ موافقین ۰ مخالفین ۰ ۰۱ دی ۹۳ ، ۲۲:۱۵
حامد شیخلو

توضیح مختصر در مورد اینکه gradle چی هست. برنامه گریدل یک سیستم مدیریت خودکارسازی فرآیند ساخت برنامه است (اسم فارسیش سخت میشه) -project automation tool. با استفاده از این سیستم میتونین تو برنامه خودتون از کتابخانه های دیگه استفاده کنین و اگر کس دیگه یا تو سیستم دیگه خواستین کامپایل کنین، فرآیند دانلود و نصب کتابخانه های مورد استفاده به صورت خودکار انجام میشه. یه جورایی شبیه سیستم apt برای نصب برنامه ها تو لینوکس هست.

و اما مشکل من.

من یه کتابخانه گرافیکی برای آندروید میخواستم استفاده بکنم که از چندین بسته دیگه استفاده میکرد و اومده بود از گریدل استفاده کرده بود. وقتیکه تو ادیتورم اومدن باز گردم پروژه رو، شروع کرد به دانلود و نصب بسته ها. تا آخر رفت، اما موقص اتمام نصب یک خطا داد و نتونست تموم بکنه نصب رو. خطای زیر رو داد:

intelli jidea this project using an unsupported version of the android gradle plugin

ظاهرا نسخه بسته 0.13 بود و مال من 0.14 و بنابراین هماهنگی بین اونها نبوده و خطا داد. تو اینترنت بگردین یکم سردرگم میشه آدم. من خودم هم اومدم و جاوا و android sdk رو بروزرسانی کردم، اما خطا درست نشد.

اما راه حل:

همونطور که گفتم گریدل یه سیستم خودکارسازی کامپایل است و بنابراین نیازی به اجرایی بودن خودش نیست. پس کلا باید فایل متنی مثل xml باشه (سیستم maven به این شکل هست، اما سیستم گریدل به صورت  xml نیست).

راه حل خیلی ساده هست، تو فایل build.gradle که کنار کتابخانه ای هست که میخواین اونو نصب کنین، نسخه مقصد خودتون رو اصلاح کنید :)

برای من یکم درک این مساله که چرا این خطا بوجود آومده و یه ادیتوری مثل intelliJ idea نتونسته اون رو رفع کنه یا حتی دکمه ادامه بذاره که بشه پروژه رو کار کرد، سخت هست.

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.14+'
    }
}

۰ موافقین ۱ مخالفین ۰ ۲۱ آذر ۹۳ ، ۱۶:۴۹
حامد شیخلو
با سلام
خیلی وقت بوده که به خاطر پایان نامه وقت نکردم پست بنویسم
برای پایان نامه خودم که قسمتی از اون یه شبیه ساز هست، از یک فریم وورک شبیه ساز رخداد گسسته (Discrete Event Simulator) به اسم SimPy که برای پایتون هست استفاده میکنم. بیشتر تو لینوکس کد مینویسم، اما بنا به دلایلی لازم شد تو ویندوز هم کد بنویسم. تو لینوکس خیلی راحت میتونین با دستور pip یا حتی با apt-get هر ماژولی رو نصب کنید. حتی اگر از Pycharm IDE استفاده کنید، میتونید از قسمت مدیریت ماژوا اون استفاده کنید و پکیج ها رو نصب کنید. 
اما یک مشکل وجود داره، اینکه تو ویندوز بعضی پکیج ها وجود نداره یا بنا به دلایلی نصب نمیشه :(
این مشکل بعضی وقتا به خاطر مشکلات اینترنت هست، بعضی وقتا چندتا دپیندنسی وجود نداره و یا اینکه برای اون نسخه ویندوز نسخه کامپایل شده وجود نداره
دو تا راه حل وجود داره، یکی اینکه سورس رو از PyPi بگیرین و خودتون کامپایل کنید، که البته تو برخی موارد باز هم مشکل حل نمیشه و امکان کامپایل وجود نداره
راه حل دوم پیدا کردن و نصب کردن نسخه کامپایل شده برای ویندوز هست که این مشکل راحت ترین و مطمئن ترین راه هست. 
یک وبسایت خیلی خوب که اکثر بسته های مشکل دار ویندوزی (مثلاnumpy) رو داخل خودش داره و خیلی هم بروز هست. این وبسایت مال یکی از اساتید دانشگاه ارواین کالیفرنیا هست.
میتونید از آدرس زیر به این وبسایت دسترسی داشته باشین

بعضی وقتها از روند کاری این دانشگاه های خارجی خیلی خیلی خوشم میاد. اینکه اصلی اشتراک اطلاعات رو خوب رعایت میکنن و میدونن که این روند حرکتی در نهایت باعث رشد کلی سیستم و خودشون میشه.

۱ موافقین ۰ مخالفین ۰ ۲۹ آبان ۹۳ ، ۱۰:۲۶
حامد شیخلو

هر سیستمی که راه میندازین، باید تمامی جنبه های اون رو بتونین مونیتور کنین. البته این مونیتور کردن بر اساس زیرسیستم های مختلف فرق داره. مثلا برای پهنای باند شبکه معمولا یک نمودار بلند مدت لازم هست و برای مثلا خطاهای سیستم، باید یه مونیتورینگ و سیستم هشدار وجود داشته باشه که 24*7 باشه. اما برای موارد دیگه، هنگام بوجود اومدن یک خطا یا مشکل یا مورد مشکوک، استفاده میشه. مثلا اینکه یه زیر سیستم درست کار نمیکنه، و میایم کارکرد اون رو تریس (trace) میکنیم.

هر سیستم عاملی دارای چندین لایه هست (البته منظورم الزاما معماری لایه ای نیست) که هرکدوم یه وظیفه خاص رو بر عهده دارن. یکی مسئول لایه 2 شبکه و یکی مسئول لایه 3. هر کدوم نیازمند سیستم مونیتورینگ جداگانه هست. مثلا میخوایم بدونیم تو لایه 2 وضعیت چطور هست، باید از ethtool و ابزارهای مشابه استفاده کنیم. اینکه ادمین با این ابزارها آشنا باشه، یه مساله حیاتی هست. اما خب، سخت هست. تعداد این ابزارهای زیاده و شناخت اینکه این ابزارها دقیقا چکار میتونن انجام بدن نیاز به تجربه خیلی زیادی داره.

تو عکس زیر میتونین برای هر لایه ابزارهای موجود رو ملاحظه کنین و در صورت نیاز کارکرد اونها رو با man مطالعه کنین.

۰ موافقین ۰ مخالفین ۰ ۱۷ شهریور ۹۳ ، ۱۴:۰۴
حامد شیخلو
سورس کد برنامه جدول کلمات رو که چنند مدت پیش نوشته بودم تو سرویس گیت هاب برای عموم انتشار دادم. این برنامه اصالتا بر اساس یک برنامه متن باز دیگه هست که تنها فرمت .puz رو پشتیبانب مبکنه و متاسفانه با این فرمت نمیشه جدول فارسی درست کرد. به خاطر همین مساله تو این برنامه یه فرمت جدید برای جداول درست کردم و دیگه امکاناتی که به ذهنم میرسیده اضافه کردم. البته شاید از سورس برنامه زیاد خوشتون نیاد.
فرمتی که برای جداول درست کردم با xml هستش، اما نوشتن جدول نهایی با این فرمت خیلی زمانگیر هست. برای همین یه برنامه دیگه با جاوا نوشتم که سوالات و ساختار جدول رو میگره و فرمت نهایی رو درست میکنه. با این برنامه میشه خیلی سریع جدول ساخت.
برنامه رو از آدرس زیر میتونین بردارین
این هم لینک برنامه تو بازار:
۰ موافقین ۰ مخالفین ۰ ۱۳ شهریور ۹۳ ، ۰۰:۱۱
حامد شیخلو

همواره در طراحی یک سیستم، سعی میشود که از الگوهای طراحی آزموده شده استفاده شود. در این الگوها برای حل مشکلات خاصی، راه حل مشخصی را ارائه میدهد که میتوان آن را استفاده کرد. با ترکیب این الگوها میتوان به قالب کلی سیستم دست یافت. مشابه مبحث طراحی شی گرایی، که در اون design pattern وجود داره، یک مساله anti pattern هم وجود داره. مساله anti pattern مشخص کننده مسائلی هست که توی استفاده از الگو باید در نظر گرفته بشه. حالا بعدا شاید به مساله طراحی الگو پرداخته بشه.

توزیع کننده بار (load balancer)

در این مدل، یک توزیع کننده وجود داره که بر اساس سیاست های متفاوت (میزان بار یا هر سیاست دیگه)، درخواست رو بین چند سرور خدمات دهنده تقسیم کنه. همونطور که توی پست قبلی گفته شد، برنامه کاربردی باید به صورت stateless باشه تا بتونه در صورت تغییر مسیر بتونه همچنان کار کنه. این الگو معمولا در تمامی وبسایت های بزرگ استفاده شده.

تقسیم و تجمیع دوباره (scatter and Gather)

در این مدل، توزیع کننده درخواست های ورودی رو به چندین سرور پاسخگو از بین سرورهای موجود ارسال میکنه. سرور هم بر اساس داده های محلی خودش پردازش رو انجام میده و در نهایت داده ها رو میفرسته به توزیع کننده. توزیع کننده اطلاعات دریافتی رو تجمیع میکنه و ارسال میکنه به درخواست کننده. این الگو معمولا در موتورهای جستجو و وبسایت هایی که با نرخ زیادی از داده طرف هستند استفاده میشه.

کش کردن نتایج (result cache)

در این مدل توزیع کننده ابتدا نتایج پرس و جو رو در نتایج درخواست های قبلی که انجام داده جستجو میکنه. در صورت پیدا کردن نتایج در نتایج اخیر، اون رو به عنوان جواب بازگشت میده. البته باید بررسی بشه که نتیجه بازگشتی حتما آخرین نسخه باشه.

این الگو در کاربردهای بزرگ مورد استفاده قرار میگیرد. یک مثال از سرورهای کش، memcached است (بررسی کامل این محصول بعدا نوشته میشه، چون میخوام استفاده کنم ازش).

فضای اشتراکی

به این الگو "تخته سیاه" هم گفته میشه. در این مدل، تمامی سرورهای کاری (workers)، داده های خودشون رو در فضابی اشتراکی مینویسن. پاسخ نهایی در این سیستم ها به صورت افزایشی تکمیل میشه.

این الگو در JavaSpace و در محصول تجاری GigaSpace استفاده میشه.

مسیر داده و خط داده (Pipe and filter)

این الگو با عنوان "data flow programmin" هم شناخته میشه. تمامی گارگذاران به خطوط لوله داده ای متصل هستند که از طریق اونها داده ها منتقل میشه. این الگو یک الگوی طراحی در نرم افزار هست و برای طراحی سیستم نیز استفاده میشه.

map Reduce

این الگو برای شرایطی که مسیر I/O دیسک به عنوان یک bootleneck مطرح میشه قابل استفاده هست. در این الگو از یک فضای ذخیره سازی توزیع شده استفاده میشه. این الگو در بسیاری از کاربردهای گوگل استفاده میشه. یک پیاده سازی متن باز از این الگو، hadoop هست

Bulk Synchronous Parallel

در این الگو تمامی کارگزاران در یک الگوی ترتیبی دستور خاصی را اجرا میکنند. این ترتیب اجرایی توسط سیستم مرکزی همگام میشود. هر کارگزار تا زمانی که سیستم مرکزی شرط خروج را ارسال کند، حلقه زیر را اجرا میکند:

1- هر کارگذار داده را از خط روردی دریافت میکند.

2- هر کارگذار پردازش دستور رودی را بر روی داده های محلی انجام میدهن

3- هر کارگذار نتایج محلی رو از طریق خط ارتباطی مستقیم به سرور میفرستد.

این الگو در سیستم پردازش گرافی گوگل استفاده میشه و همچنین سیستم متن باز hama برای این سیستم موجود هست.

۱ موافقین ۰ مخالفین ۰ ۰۷ شهریور ۹۳ ، ۱۹:۲۱
حامد شیخلو

یک پست خیلی خوب برای بررسی الگوهای طراحی سیستم‌های مقیاس‌پذیر (scalable system design pattern) جدیداً خوندم که خیلی از سؤالاتم رو در مورد طراحی این سیستم‌ها جواب داد. اما اونطور که خود نویسنده تو اول مقاله گفته، یه مقاله چند سال قبل اون نوشته و به طراحی سیستم‌های توسعه‌پذیر اشاره‌کرده و گفته که اول بهتره اون رو بخونین. من هم اول مقاله قدیمی رو براتون خلاصش رو مینویسم و بعدش هم مقاله جدید رو باید بررسی کنیم. البته مقاله جدیده خیلی خلاصه نوشته‌شده و باید خیلی گسترش پیدا بکنه.

مفاهیم اصلی

"توسعه‌پذیری" به معنای "قدرت پردازشی خالص" نیست

توسعه‌پذیری به‌منظور کاهش اثرات جانبی به وجود آمده به خاطر افزایش در کارایی، هزینه، نگه‌داری و خیلی جنبه‌های دیگر است.

برای مثال، اجرای یک قسمت از برنامه در یک باکس جداگانه، سرعت اجرای بیشتری درزمانی خواهد داشت که بار نیز کم باشد. اما این طراحی قابلیت توسعه ندارد، به دلیل اینکه اگر بار سیستم بیشتر از محدوده خاصی افزایش پیدا کند، کارایی سیستم به‌صورت شدیدی افت خواهد کرد.

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

شناخت جنبه‌های توسعه سیستم، مانند: تعداد کاربران، میزان تراکنش‌ها، میزان داده‌ها.

نحوه اندازه‌گیری و هدف نهایی کارایی، مانند: میزان زمان پاسخ و همچنین میزان گذردهی سیستم

شناخت اینکه چه کسی مشتری نهایی شما خواهد بود.

ترافیکی که از سیستم شما خارج خواهد شد را رتبه‌بندی و اولویت‌بندی کنید، با استفاده از این روش میدانید که کدام ترافیک را در صورت افزایش بسیار زیاد بار قربانی کنید.

توسعه عرضی به‌جای توسعه طولی

بهتر است به‌جای سرمایه‌گذاری و قویی‌تر کردن یک سیستم، از تعداد بیشتری سیستم سخت‌افزاری معمولی استفاده کنید، 

کد خود را به‌صورت ساده و ماژولار نگه‌دارید

قابلیت اینکه شما قسمتی از کد خود را بدون نگرانی از تغییر در کارایی در قسمت‌های دیگر تغییر دهید، شمارا قادر می‌سازد تا به‌صورت مؤثر نسبت به بهینه‌سازی قسمت‌های مختلف سیستم خود آزمایش‌ها متفاوتی انجام دهید.

هیچ‌وقت برای منظور خاصی ماژولار بودن کد خود را به خطر نیاندازید.

هیچ‌گاه نقطه bottleneck سرعت سیستم خود را حدس نزنید، آن را با آزمایش پیدا کنید

نقاط bottleneck نقاطی از سیستم هستند که کد آن‌ها سرعت کمی دارد و به تعداد زیاد هم اجرا می‌شود. هیچ‌گاه کدی که سرعت کمی دارد، اما به‌ندرت اجرا می‌شود را بهینه نکنید.

یک واحد برای اندازه‌گیری و تهیه آمار کارایی برای سیستم خود تهیه کنید و از روی آن برای بهینه‌سازی کد اقدام کنید.

نقشه‌ای برای توسعه داشته باشید

آمار استفاده از سیستم خود را همیشه داشته باشید و نرخ پیشرفت را سعی کنید حدس برنید.


روش‌های اصلی

راه‌اندازی server farm (سرعت دستیابی بلادرنگ)

اگر تعداد زیادی از درخواست‌های مستقل (به‌صورت همزمان) برای سیستم خوددارید، از مجموعه سرورهایی که در مکان فیزیکی نزدیک به یکدیگر قرار دارند استفاده کنید. این سرورها معمولاً به‌صورت مشابه پیکربندی می‌شوند و در مقابل آن‌ها یک توزیع‌کننده بار قرار دارد.

خود کاربردی که در حال اجرا بر روی چند سیستم است، باید به‌صورت stateless باشد تا بتواند به‌صورت کامل به سرورهای دیگر در هرلحظه منتقل شود.

تمامی درخواست‌های ورودی به سیستم از طریق توزیع‌کننده بار به‌تمامی سیستم‌های دیگر منتقل می‌شود و به این صورت بار در بین سیستم‌ها به‌صورت اشتراکی پخش می‌شود.

توزیع بار به‌صورت عرضی صورت می‌گیرد و بنابراین در صورت افزایش بار، تنها نیاز به افزودن تعداد سیستم خواهد بود.

این استراتژی درصورتی‌که از پردازش ابری استفاده کنیم بسیار مؤثرتر خواهد بود و می‌توان با افزایش تعداد ماشین‌های مجازی کارایی سیستم را افزایش داد.

قسمت‌بندی داده‌ها

داده‌های خود را بین چندین پایگاه داده پخش‌کنید و بنابراین هزینه دستیابی به داده‌ها بین چندین سرور پخش خواهد شد.

اصالتاً داده یک عنصر دارای وضعیت است. بنابراین پخش داده‌ها بین چندین سرور باید به صورتی باشد که وضعیت داده‌های نگه‌داری شده در آن سرور در نظر گرفته شود.

در به‌کارگیری یک مکانیسم توزیع داده، باید نحوه دسترسی به داده‌ها در نظر گرفته شود. داده‌هایی که باید به‌صورت همزمان دسترسی شوند، بهتر است در یک سرور قرار گیرند. یک روش پیچیده‌تر اما مؤثرتر، انتقال داده‌ها به سرورهای متفاوت بر اساس مدل دسترسی است.

استفاده از مدل پردازشی همزمان دسته‌ای map/reduce

یک الگوریتم باید توانایی موازی‌سازی را داشته باشد. یعنی اینکه، یک مرحله اجرایی، از مراحل دیگر اجرا به‌صورت کامل مستقل باشد.

روش map/reduce که از طرف شرکت گوگل ارائه‌شده است، یک روش بسیار خوب برای انجام پردازش موازی است. فریم وورک متن‌باز Hadoop برای java می‌توان به‌عنوان یک راه حل نیز استفاده شود.

استفاده از شبکه تحویل محتوا CDN (حافظه میانی ایستا)

استفاده از این فنّاوری برای محتوای ایستا بسیار متداول است. ایده اصلی قرار دادن چندین کپی از یک داده ایستا در نقاط جغرافیایی مختلف است.

درخواست‌های کاربران به نزدیک‌ترین نقطه که داری داده درخواستی باشد انتقال پیدا می‌کند.

استفاده از cache engine (محتوای پویا)

این فنّاوری یک توازن بین زمان و فضای ذخیره‌سازی است. برخی از اجراها ممکن است نیازمند مجموعه یکسان از ورودی‌ها باشد. که این ورودی چندین بار به سیستم داده شود. بنابراین به‌جای انجام پردازش به‌صورت کامل برای هر بار ورود این داده‌ها، بهتر است نتایج پردازش قبلی را در خاطر نگه‌داریم و از آن استفاده کنیم.

این ویژگی معمولاً با استفاده از lookup cache پیاده‌سازی می‌شود.

اکثراً از memcached و EHCached برای این منظور استفاده می‌شود.

استفاده از resource pool

ایجاد نشست برای پایگاه داده و TCP عملکرد پرهزینه‌ای است، پس بهتر است از هر یک چندین بار استفاده شود.

محاسبه نتایج به‌صورت تقریبی

به‌جای محاسبه نتایج دقیق برای یک درخواست، در صورت امکان یک نتیجه تقریبی را با سرعت بالاتر ارائه دهید.

در جهان حقیقی، میزانی از عدم دقت قابل‌پذیرش است.

فیلتر کردن در منبع

سعی کنید بیشتر پردازش را در محلی که داده تولید و ارسال می‌شود انجام دهید، با استفاده از این روش، می‌توان تا حدی داده انتقالی را کاهش داد.

پردازش ناهمگام (asynchronous)

شما درخواست انجام پردازشی را ارسال می‌کنید، اما نتایج این پردازش تا چند مرحله بعد موردنیاز است و می‌توانید تا آن زمان بدون نیاز به این نتایج کار خود را ادامه دهید. بنابراین نیاز به منتظر ماندن تا آماده شدن نتایج نیست.

از جنبه دیگر، یک نخ پردازشی که منتظر منبع خاصی است، تا زمان حیات خود، تمامی منابع موردنیاز خود را از سیستم نگه می‌دارد.برای سیستم‌های با تراکنش بالا، این تعداد نخ پردازشی منتظر می‌تواند بسیار زیاد باشد. درنتیجه کارایی سیستم می‌تواند بسیار کاهش پیدا کند.

فراخوانی سرویس در این مثال، بهتر است که از طریق پردازش‌های غیر همگام انجام شود. این نوع پردازش معمولاً در دو مرحله انجام می‌شود: callback و polling

 

۰ موافقین ۰ مخالفین ۰ ۰۵ شهریور ۹۳ ، ۱۲:۳۸
حامد شیخلو

SDN: Software defined netwworking

NFV: Network functions virtualization

NV: Network Virtualization

ابتدا یک تعریف کلی از هر کدوم

sdn: جدا کردن کنترل شبکه (در نظر بگیریم مغز شبکه) از قسمت forwarding (عضلات) که به منظور فراهم آوردن یک دید مرکزی از شبکه توزیع شده برای بهینه کردن مدیریت سرویسهای شبکه صورت میگیرد.

nfv: بر روی بهینه کردن خود سرویسهای شبکه تاکید میشه. در این حالت سعی میشه سرویسهای شبکه مثل dns، پراکسی و امثالهم از سخت افزار به صورت کامل جدا بشن و کاملا روی یک لایه نرم افزاری اجرا بشن.

NV: اطمینان از اینکه شبکه به صورت کامل با نیازمندیهای مجازی سازی معماری هماهنگی کامل دارد.

این سه تکنولوژی، با استفاده از روشهای مجازی سازی، شبکه بندی رو میتونم قابل توسعه، سریعتر تر بکن و همچنین برای هر نیاز سازمانی، دقیقا شبکه بر اساس اون نیازها طراحی بشه. که در نهایت کاهش هزینه رو هم میتونه به دنبال داشته باشه. برای این کار چندین پیشنهاد الان ارائه شده:

  • انتقال کاربردها به لایه نرمافزار
  • استفاده از سخت افزارهای عمومی برای راه اندازی سیستم
  • توسعه APIها
  • استفاده از روشهاس مجازی سازی بهینه تر
هر کدوم از روشهای nfv, sdn و nv مزایای خاص خودشون رو دارند، اما این روشها وابستگی به همدیگه ندارن. شما نیازی به موجود بودن یک روش دیگه برای راه اندازی روش خودتون ندارین. وقتی sdn تو شبکه راه میندازین، بیشتر تاکید روی این مساله هستش که هر ترافیک داده ای بر اساس سیاست تعریف شده باید به کدوم سمت حرکت کنه و روی سرعت حرکت این ترافیک هم تاثیر داره. در حالی که nfv روی سرویسهای شبکه تاکید داره. nv هم تضمین کننده این هستش که نیازمندیهای شبکه با محیط مجازی سازی همگام باشه.
۰ موافقین ۰ مخالفین ۰ ۲۴ مرداد ۹۳ ، ۱۷:۰۱
حامد شیخلو