eshpilen
پنج شنبه 12 مرداد 1391, 09:41 صبح
به بیان کلی، stateless (بی وضعیت) به معنای آنست که سرور اطلاعات وضعیت بر هر کلاینت را نگهداری نمیکند. برای یک مثال ساده، به یک سرویس خواندن فایل توجه کنید. یک API ممکن به شکلی است که در بیشتر زبانهای برنامه نویسی متداول است، با توابعی همچون FileOpen و FileRead که میتواند مثل این استفاده شود:
File f = FileOpen("myfile.dat");
byte[] firstK = FileRead(f, 1024);
byte[] secondK = FileRead(f, 1024);
در این شبه کد، firstK شامل نخستین 1024 بایت خواهد بود، و دومین secondK شامل 1024 بایت بعدی خواهد بود. اما توجه کنید که چطور هر دو بوسیلهء فراخوانی تابع دقیقا یکسانی ایجاد شدند، که دقیقا لیست آرگومان های یکسانی دارند! این رخ میدهد چراکه سیستم برای هر فایل باز، به خاطر میسپارد که مکان اشاره گر خواندن در کجا قرار دارد. این در این مورد، وضعیت (state) است.
در مقایسه، یک API بدون وضعیت میتواند برای دستیابی به نتایج یکسانی همچون مثال زیر استفاده شود:
firstK = FileRead("myfile.dat", 0, 1024);
secondK = FileRead("myfile.dat", 1024, 1024);
در اینجا، تابع FileRead پارامترهای نام فایل، شروع از کجا، و چقدر برای خواندن را میپذیرد؛ هیچ وضعیتی وابسته شده به فایل وجود ندارد، و فراخوانی دوبارهء یک فرمان یکسان نتیجهء یکسانی را موجب میشود (البته با فرض اینکه خود فایل تغییر نکرده باشد).
واضح است که API بدون وضعیت برای توابع محلی خواندن فایل معنای چندانی ندارد؛ اما آنها در یک API بر اساس وب بسیار بامعنا هستند. سه مزیت کلیدی:
1) جان به در بردن از یک ریستارت سرور. اگر سرور مجبور بود وضعیت بر هر کلاینت را بخاطر بسپارد، یک ریستارت به معنای آن میبود که همهء دیتای مربوط به وضعیت از دست میرفت. اما با یک سرور بدون وضعیت، برای کلاینت ها مهم نیست که سرور ریستارت شده باشد.
2) عدم بستگی کلاینت به سرور؛ پاسخها میتوانند توسط یک دسته (cluster) از سرورها هندل شوند، و هر درخواست میتواند توسط یک ماشین متفاوت در cluster هندل شود. در یک API دارای وضعیت، یا دقیقا ماشین یکسانی مجبور است تمام درخواستها بوسیلهء کلاینت یکسان را هندل کند، و یا وضعیت تمام کلاینت ها باید در بین تمامی سرورها نسخه برداری شود.
3) مقیاس پذیری افزایش یافته. در HTTP، سرور هرگز نمیداند آیا و چه وقت کلاینت درخواست بعدی را صادر خواهد کرد. نگهداری وضعیت برای کلاینت های بیشمار میتواند فشاری را بر روی منابع سرور تحمیل کند (عمدتا حافظه)، و سیستمهای دارای وضعیت یک مکانیزم time-out را برای پایان دادن به نشست هایی که کلاینت ها بین درخواستها تاخیر زیادی دارند استفاده میکنند. اگر سرور بدون وضعیت باشد، چنان مشکلی وجود ندارد.
======================
منبع: http://rest.elkstein.org/
البته در بخش کامنت هاش.
File f = FileOpen("myfile.dat");
byte[] firstK = FileRead(f, 1024);
byte[] secondK = FileRead(f, 1024);
در این شبه کد، firstK شامل نخستین 1024 بایت خواهد بود، و دومین secondK شامل 1024 بایت بعدی خواهد بود. اما توجه کنید که چطور هر دو بوسیلهء فراخوانی تابع دقیقا یکسانی ایجاد شدند، که دقیقا لیست آرگومان های یکسانی دارند! این رخ میدهد چراکه سیستم برای هر فایل باز، به خاطر میسپارد که مکان اشاره گر خواندن در کجا قرار دارد. این در این مورد، وضعیت (state) است.
در مقایسه، یک API بدون وضعیت میتواند برای دستیابی به نتایج یکسانی همچون مثال زیر استفاده شود:
firstK = FileRead("myfile.dat", 0, 1024);
secondK = FileRead("myfile.dat", 1024, 1024);
در اینجا، تابع FileRead پارامترهای نام فایل، شروع از کجا، و چقدر برای خواندن را میپذیرد؛ هیچ وضعیتی وابسته شده به فایل وجود ندارد، و فراخوانی دوبارهء یک فرمان یکسان نتیجهء یکسانی را موجب میشود (البته با فرض اینکه خود فایل تغییر نکرده باشد).
واضح است که API بدون وضعیت برای توابع محلی خواندن فایل معنای چندانی ندارد؛ اما آنها در یک API بر اساس وب بسیار بامعنا هستند. سه مزیت کلیدی:
1) جان به در بردن از یک ریستارت سرور. اگر سرور مجبور بود وضعیت بر هر کلاینت را بخاطر بسپارد، یک ریستارت به معنای آن میبود که همهء دیتای مربوط به وضعیت از دست میرفت. اما با یک سرور بدون وضعیت، برای کلاینت ها مهم نیست که سرور ریستارت شده باشد.
2) عدم بستگی کلاینت به سرور؛ پاسخها میتوانند توسط یک دسته (cluster) از سرورها هندل شوند، و هر درخواست میتواند توسط یک ماشین متفاوت در cluster هندل شود. در یک API دارای وضعیت، یا دقیقا ماشین یکسانی مجبور است تمام درخواستها بوسیلهء کلاینت یکسان را هندل کند، و یا وضعیت تمام کلاینت ها باید در بین تمامی سرورها نسخه برداری شود.
3) مقیاس پذیری افزایش یافته. در HTTP، سرور هرگز نمیداند آیا و چه وقت کلاینت درخواست بعدی را صادر خواهد کرد. نگهداری وضعیت برای کلاینت های بیشمار میتواند فشاری را بر روی منابع سرور تحمیل کند (عمدتا حافظه)، و سیستمهای دارای وضعیت یک مکانیزم time-out را برای پایان دادن به نشست هایی که کلاینت ها بین درخواستها تاخیر زیادی دارند استفاده میکنند. اگر سرور بدون وضعیت باشد، چنان مشکلی وجود ندارد.
======================
منبع: http://rest.elkstein.org/
البته در بخش کامنت هاش.