<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Yaser Fashami</title>
        <link>https://virgool.io/feed/@yaserf2000</link>
        <description>dotNet full-stack web developer</description>
        <language>fa</language>
        <pubDate>2026-04-14 07:06:16</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/29851/avatar/9YCo7r.jpg?height=120&amp;width=120</url>
            <title>Yaser Fashami</title>
            <link>https://virgool.io/@yaserf2000</link>
        </image>

                    <item>
                <title>سوال مصاحبه‌ای که طرز فکر من در مورد طراحی سیستم را تغییر داد.</title>
                <link>https://virgool.io/TechnicalPapers/%D8%B3%D9%88%D8%A7%D9%84-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%A7%DB%8C-%DA%A9%D9%87-%D8%B7%D8%B1%D8%B2-%D9%81%DA%A9%D8%B1-%D9%85%D9%86-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%B1%D8%A7-%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D8%AF%D8%A7%D8%AF-cglp6kjsnne5</link>
                <description>حدود شش یا هفت سال پیش، برای یک نقش  mid-level  ​​در .NET مصاحبه‌ای داشتم. یکی از سوالات از آن زمان تا به حال با من مانده است: کاربر روی دکمه‌ای در رابط کاربری کلیک می‌کند تا یک گزارش اکسل یا PDF تولید کند. تولید گزارش حدود پنج دقیقه طول می‌کشد (زمان می‌تواند دلخواه باشد). کاربر باید منتظر بماند تا تمام شود. چگونه این جریان را بهینه می‌کنید؟ در آن زمان، من روی چیزی که بهتر می‌دانستم تمرکز کردم: Performance. شروع به فکر کردن در مورد چگونگی سریع‌تر کردن تولید گزارش کردم. شاید می‌توانستم کوئری‌های SQL را بهینه کنم، تبدیل داده‌ها را کاهش دهم یا بخش‌هایی از نتیجه را ذخیره کنم. اگر می‌توانستم فرآیند را از پنج دقیقه به یک دقیقه کاهش دهم، این یک برد بزرگ به نظر می‌رسید. اما حتی اگر آن را پنج برابر سریع‌تر می‌کردم، کاربر هنوز باید منتظر می‌ماند. اگر مرورگر از کار می‌افتاد، همه چیز را از دست می‌داد. اگر شبکه قطع می‌شد، فرآیند متوقف می‌شد. اگر تب را می‌بستند، تمام پیشرفت از بین می‌رفت. در واقع اصلاً مشکل عملکرد نبود، بلکه یک مشکل طراحی بود.چیزی که آن موقع از دست دادمبا نگاهی به گذشته، متوجه می‌شوم که در طرز فکر «کد را سریع‌تر کنید» گیر افتاده بودم. نه اینکه مشکلی در این مورد وجود داشته باشد، بهینه‌سازی عملکرد یک مهارت ارزشمند است. چیزی که فوراً متوجه نشدم، مشکل بزرگتر بود. برنامه تمام این کارها را به صورت همزمان انجام می‌داد و کاربر را تا زمان اتمام کار گروگان نگه می‌داشت. در نهایت با چند اشاره از مصاحبه‌کننده، متوجه این موضوع شدم.سوال بهتر این نبود که «چطور می‌توانم این را سریع‌تر کنم؟»، بلکه این بود که «اصلاً چرا کاربر منتظر می‌ماند؟» اگر تکمیل چیزی چند دقیقه (یا ساعت، روز) طول بکشد، نباید کاربر را مسدود کند. این کار باید در پس‌زمینه، خارج از جریان اصلی درخواست، در حالی که کاربر به کار خود ادامه می‌دهد، اتفاق بیفتد. با این حال، بهینه‌سازی خود کد را فراموش نکنید. پرس‌وجوهای پایگاه داده، پردازش داده‌ها و تولید فایل، همگی مهم هستند. شاید یک ایندکس از دست رفته، یک حلقه ناکارآمد یا یک کتابخانه بهتر برای ایجاد فایل‌های اکسل وجود داشته باشد. اما این بهینه‌سازی‌ها فقط بخشی از راه‌حل هستند، نه کل تصویر.چگونه امروز آن را حل کنمامروز، من هنوز با همان دکمه رابط کاربری شروع می‌کنم. کاربر روی &quot;ایجاد گزارش&quot; کلیک می‌کند، اما به جای انتظار، بک‌اند درخواست را می‌پذیرد، آن را در جایی ذخیره می‌کند (شاید به عنوان یک رکورد کار در پایگاه داده) و بلافاصله برمی‌گرداند. این جوهره ساخت APIهای ناهمزمان است. سپس کار توسط یک worker پس‌زمینه برداشته می‌شود. worker می‌تواند یک hosted service، یک Quartz job یا حتی یک تابع AWS Lambda باشد که توسط یکqueue message فعال می‌شود. worker کارهای سنگین را انجام می‌دهد: دریافت داده‌ها، ساخت فایل و آپلود آن در فضای ذخیره‌سازی ابری. پس از آماده شدن گزارش، worker وضعیت کار را به &quot;تکمیل شده&quot; به‌روزرسانی می‌کند و به کاربر اطلاع می‌دهد. این می‌تواند یک ایمیل با لینک دانلود یا یک پیام SignalR در لحظه باشد که در برنامه نمایش داده می‌شود. لینک به گزارش ذخیره شده اشاره می‌کند که به طور ایمن از بک‌اند ارائه می‌شود.حالا، کاربر منتظر یک درخواست HTTP طولانی مدت نیست. سرور اتصالات باز را برای چند دقیقه نگه نمی‌دارد. اگر چیزی با شکست مواجه شود، می‌توان آن را به طور خودکار دوباره retry کرد. همچنین می‌توانید در صورت نیاز پیشرفت را پیگیری کنید یا کار را لغو کنید. و اگر صد کاربر به طور همزمان درخواست گزارش کنند، سیستم می‌تواند بدون قفل شدن، scale کند. این تجربه سریع‌تر به نظر می‌رسد، حتی اگر زمان تولید گزارش واقعی تغییر نکرده باشد. زیرا در نهایت، کاربران به معیارهای عملکرد اهمیتی نمی‌دهند، بلکه به پاسخگویی اهمیت می‌دهند.چرا هنوز از این سوال استفاده می‌کنم؟چند سال بعد، من شروع به استفاده از همین سوال در مصاحبه با سایر توسعه‌دهندگان کردم. نه برای فریب دادن کسی، بلکه به این دلیل که طرز فکر افراد را آشکار می‌کند. برخی از کاندیداها مستقیماً به سراغ بهینه‌سازی کد و کوئری‌ها می‌روند، درست مثل من در آن زمان. این نشانه خوبی است که آنها راه خود را در تنظیم عملکرد می‌دانند. من می‌توانم با سوالات فنی بیشتری در مورد الگوریتم‌ها، ساختارهای داده یا بهینه‌سازی پایگاه داده ادامه دهم. برخی دیگر لحظه‌ای مکث می‌کنند و شروع به فکر کردن در مورد تجربه کاربری، پردازش پس‌زمینه و تحمل خطا می‌کنند. اینجاست که مکالمه واقعی شروع می‌شود: صف‌ها، تلاش‌های مجدد، اعلان‌ها، اشتراک‌گذاری ایمن فایل و غیره. راه‌های زیادی وجود دارد که می‌توانید این سناریو را به یک بحث گسترده‌تر طراحی سیستم تبدیل کنید. هیچ پاسخ درست واحدی وجود ندارد. اما تفاوت زیادی بین کسی که فقط روی کد تمرکز می‌کند و کسی که می‌تواند یک سیستم مقیاس‌پذیر طراحی کند، وجود دارد.درسوقتی برای اولین بار این سوال را شنیدم، به سریع‌تر کردن کد فکر کردم. حالا به بهتر کردن تجربه فکر می‌کنم. بهینه‌سازی یک پرس‌وجو یا حلقه می‌تواند کمک کند، اما انتظار، خرابی یا مقیاس‌پذیری را برطرف نمی‌کند. اگر بسیاری از کاربران یک گزارش را همزمان شروع کنند، یک طراحی sync به سرعت از کار می‌افتد. یک جریان async، سیستم را پاسخگو و مقاوم نگه می‌دارد، صرف نظر از بار. این تغییر از بهینه‌سازی توابع به طراحی سیستم‌های مقیاس‌پذیر، تفاوت بین یک توسعه‌دهنده خوب و یک توسعه‌دهنده عالی است. اگر می‌خواهید عمیق‌تر به ساخت سیستم‌های مقیاس‌پذیر بپردازید، Clean Architecture  دقیقاً شما را در این مسیر راهنمایی می‌کند. یاد خواهید گرفت که چگونه برنامه‌ها را ساختار (structure) دهید، نگرانی‌ها (separate concerns) را از هم جدا کنید و سیستم‌هایی را طراحی کنید که بدون خرابی رشد کنند. امیدوارم مفید بوده باشد.کانال من:t.me/dotNetSchool</description>
                <category>Yaser Fashami</category>
                <author>Yaser Fashami</author>
                <pubDate>Wed, 18 Feb 2026 12:50:25 +0330</pubDate>
            </item>
                    <item>
                <title>مقایسه Serilog, log4net و NLog کتابخانه های Logging در .Net</title>
                <link>https://virgool.io/TechnicalPapers/%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-serilog-log4net-%D9%88-nlog-%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87-%D9%87%D8%A7%DB%8C-logging-%D8%AF%D8%B1-net-ikxbc1ed8eqs</link>
                <description>هنگام توسعه برنامه های دات نت، به ناچار به یک مکانیسم ثبت log کارآمد و قابل اعتماد نیاز خواهید داشت. شما گزینه هایی دارید. اما چگونه انتخاب کنیم؟ بیایید به دنیای کتابخانه های Logging بپردازیم و سه مورد از محبوب ترین آنها را با هم مقایسه کنیم: Serilog، log4net و NLog.معرفیوقتی می‌خواهید آن کد را که درست عمل نمی‌کند، اشکال‌زدایی کنید، چه کسی وقت دارد تا log ها را سازماندهی کند. اما به من اعتماد کنید، داشتن یک سیستم قوی می‌تواند شما را بعداً نجات دهد. بنابراین، چرا زمانی را برای درک گزینه های خود صرف نمی کنید؟مروری کوتاه بر ثبت کتابخانه هادر چشم انداز دات نت، سه بازیگر اصلی در مورد ثبت کتابخانه ها وجود دارد: Serilog، log4net و NLog. هر کدام با طعم منحصر به فرد و مجموعه ای از ترفندها همراه است. بنابراین، بیایید کمی با لاگ در دات نت دست و پنجه نرم کنید.Serilogبیایید بیشتر در Serilog کاوش کنیم. ما در حال کشف قابلیت‌های بیشتری هستیم، توضیح می‌دهیم که چگونه Serilog از همتایان خود متمایز می‌شود، و بررسی می‌کنیم که چگونه ویژگی‌های آن می‌تواند به بهترین شکل در سناریوهای دنیای واقعی اعمال شود.در دات نت Serilog چیست؟با توجه به نام، فکر می کنید که این فقط مربوط به Logging است - پیام هایی که توسعه دهندگان در طول اجرای یک برنامه برای درک جریان آن ضبط می کنند.- اما با Serilog، چیزی بیش از آنچه که به نظر می رسد وجود دارد. این نه تنها Logging را با &quot;log ساختاری&quot; خود به سطح جدیدی می برد، بلکه رویدادهای log را نیز ساده می کند تا آنها را به راحتی قابل پرس و جو کند.// Using Serilog
Log.Logger = new LoggerConfiguration()     
.WriteTo.Console()     
.CreateLogger();  

Log.Information(&quot;Hello, Serilog!&quot;);   

// Creates structured log data
Log.Information(&quot;Order {OrderId} created for {CustomerId}&quot;, orderId,
customerId);در مثال بالا، ما از ثبت یک پیام رشته ای ساده فراتر می رویم. Serilog به ما اجازه می دهد تا ورودی های log پیچیده تری ایجاد کنیم و داده های خاصی را با هر log مرتبط کنیم. پس، log های ما چیزی بیش از یک رکورد مکتوب هستند. آنها &quot;ساختار یافته&quot; هستند!تصور کنید که یادداشت ها را یادداشت می کنید اما به جای یک بلوک متن، فیلدهای خاصی مانند «OrderId» و «CustomerId» دارید. حالا، آیا این کار ارجاع به یادداشت‌های شما را در آینده آسان‌تر نمی‌کند؟درک عملکرد Serilogاگر هنوز اینجا هستید، به این معنی است که فقط مرا اذیت نمی کنید. شما واقعاً به Serilog علاقه مند هستید. آیا برای سطح بعدی آماده هستید؟ خود را نگه دارید، ما در شرف فرو رفتن در سیاهچاله ساختار زدایی Serilog هستیم!// Serilog De-structuring
Log.Information(&quot;Processing {@Order}&quot;, order);در این مثال، ما از نماد «@» در مقابل شیء Order استفاده می‌کنیم. این بدان معنی است که Serilog شیء &quot;order&quot; را از بین می برد و ویژگی های عمومی شی را ثبت می کند. بیایید این را بیشتر تجزیه کنیم:فرض کنید شما یک شی پیچیده دارید (بیایید آن را &quot;order&quot; بنامیم)، که دارای ویژگی های بسیاری مانند &quot;OrderId&quot;، &quot;OrderName&quot;، &quot;OrderStatus&quot; و غیره است. حالا، وقتی این شی را ثبت می کنید، به طور معمول، نام نوع شی را دریافت می کنید، درست است؟ خیلی مفید نیست، نه؟در اینجا اپراتور &quot;@&quot; به کمک شما می آید. به Serilog می‌گوید: «هی، فقط نام نوع را به من نگو! آن را جداسازی کنید و خصوصیات را ثبت کنید. من همه آنها را می خواهم!// Order class with public properties
public class Order
{    
    public int OrderId { get; set; } 
    public string OrderName { get; set; }
    public string OrderStatus { get; set; }
}  

// Create an instance of an order
Order order = new Order { OrderId = 1001, OrderName = &quot;New Laptop&quot;, OrderStatus = &quot;Processing&quot; };

// Using Serilog De-structuring
Log.Information(&quot;Processing {@Order}&quot;, order);حدس بزنید خروجی چه خواهد بود؟ نام نوع «order» را ثبت نمی‌کند، بلکه مقادیر ویژگی‌های شی «order» را ثبت می‌کند. تصور کنید که بتوانید به راحتی به همه جزئیات به جای فقط نام نوع اشاره کنید!مزایای Serilogبسیار خوب، شما تحمل کرده اید که من در موردSerilog، Logging ساختاریافته و &quot;Destructuring&quot; آن صحبت کنم. اکنون، بیایید مزایای استفاده از این کتابخانه ثبت شگفت انگیز را در برنامه های خود باز کنیم.ویژگی هایی که مزایای قابل توجهی را ارائه می دهندثبت ساختار یافته: این مانند دادن قدرت های فوق العاده به لاگ های شماست. داشتن همه چیز ساختاریافته و سازماندهی شده، پرس و جوی log های شما را به یک رویا تبدیل می کند.پشتیبانی گسترده از سینک: logging در یک کنسول یا یک فایل, قدیمی به نظر می رسد، درست است؟ Serilog با پشتیبانی از مجموعه وسیعی از دیتابیس ها مدرنیته را به ارمغان می‌آورد، از جمله چندین پایگاه داده محبوب، سیستم‌های مدیریت log، و حتی سرویس‌های log مبتنی بر ابر.گزینه های پیکربندی: چه از یک فایل پیکربندی باشد و چه به صورت برنامه ای، Serilog به شما امکان می دهد تا لاگر خود را همانطور که می خواهید تنظیم کنید.کاربردهای دنیای واقعی Serilogحتی جوکر هم موافق است، Serilog محبوب ما در مورد مدیریت لاگ ها در برنامه های کاربردی دنیای واقعی شوخی نیست. اگر چندین سرویس در حال اجرا و برقراری ارتباط دارید، مرتبط کردن logهای مربوط به همه این سرویس‌ها می‌تواند سردردی بدتر از بدترین حالت خماری شما باشد.با استفاده از Logging ساختاریافته، می‌توانید بدون زحمت شناسه‌های درخواست یا حتی نام‌های کاربری را ثبت کنید. بنابراین اشکال زدایی حتی در سیستم های پیچیده توزیع شده به یک راه حل تبدیل می شود.این را تصور کنید: شما در حال اجرای یک فروشگاه آنلاین هستید. هر بار که سفارشی می آید، خدمات مختلف جنبه های مختلفی را پردازش می کنند. اگر می خواهید جریان یک سفارش خاص را بدانید، لاگ ساختاری با Serilog بهترین دوست شماست. «OrderId» را ذخیره کنید و آن را مانند یک کارآگاه دنبال کنید.معایب Serilogهر سکه دو روی دارد و Serilog از این قاعده مستثنی نیست. به دات نت 4.5 یا بالاتر نیاز دارد، بنابراین اگر نسخه‌های قدیمی‌تر دات‌نت را دارید، ممکن است این فنجان چای شما نباشد.اگر نیازهای Logging شما ساده است و با ثبت متن ساده سر و کار دارید، Serilog می تواند مانند استخدام یک دانشمند موشکی برای آموزش یک کودک مهدکودک باشد.log4netروز دوم گشت ما در اطراف چشم انداز جنگلداری، و امروز همه چیز درباره log4net است. حتی اگر در صحنه جدیدتر باشید، احتمال زیادی وجود دارد که شنیده باشید که در جایی از log4net نام برده است. پس بیایید این بسته را باز کنیم و جذابیت قدیمی log4net را کشف کنیم.در دات نت log4net چیست؟یک کهنه کار باتجربه، بیش از یک دهه است که به جامعه دات نت خدمت می کند. این یک اقتباس از کتابخانه معروف log4j در جاوا است. شهرت خوبی به دست آورده است، log4net انعطاف پذیری را فراهم می کند که در هیچ چیز دیگری وجود ندارد.// Using log4net 
var log = LogManager.GetLogger(typeof(MyClass)); 
log.Info(&quot;Hello, log4net!&quot;);  

// Also support for different levels of logging
log.Debug(&quot;Debugging&quot;);
 log.Error(&quot;Something went wrong!&quot;);در مثال بالا، log4net سطوح مختلف گزارش گیری از اطلاعات تا خطا را ارائه می دهد.آیا این فقط شگفت انگیز نیست که چگونه خود را مطابق با نیازهای شما منحرف می کند و قالب می گیرد؟ من را به یاد یوگی مورد علاقه من می اندازد!آشنایی با نحوه عملکرد log4netقدرت log4net در فایل پیکربندی XML آن نهفته است. این به شما کنترل کامل بر عملیات log4net می دهد. آیا نیاز به تغییر تاکتیک های Logging خود در میانه همه چیز دارید؟ شما می توانید این کار را در یک لحظه انجام دهید، درست مانند تغییر مسیر در یک بزرگراه باز!&lt;log4net&gt;
   &lt;root&gt;
     &lt;level value=&quot;DEBUG&quot; /&gt;
     &lt;appender-ref ref=&quot;consoleAppender&quot; /&gt;   
   &lt;/root&gt;   
   &lt;appender name=&quot;consoleAppender&quot;type=&quot;log4net.Appender.ConsoleAppender&quot;&gt;     
    &lt;layout type=&quot;log4net.Layout.PatternLayout&quot;&gt;       
       &lt;conversionPattern value=&quot;%date [%thread] %-5level %logger-%message%newline&quot; /&gt;     
    &lt;/layout&gt;   
   &lt;/appender&gt; 
&lt;/log4net&gt;در این پیکربندی XML، به log4net دستور می‌دهیم تا لاگ‌های سطح DEBUG و بالاتر را روی یک کنسول وارد کند. ConversionPattern جایی است که فرمت پیام log خروجی را کنترل می کنید. بسیار شبیه به بستنی فروشی مورد علاقه خود، آن را با هم مخلوط کنید تا ذائقه شما را برآورده کند!ویژگی های log4netانعطاف پذیری: log4net با چندین سناریو سازگار است. نوشتن log روی یک فایل متنی؟ easy peasy Logging به یک data store؟ این یک بازی کودکانه است شعبده بازی هر دوی آنها با هم؟ چرا که نه! آن را به روش خود داشته باشید!&lt;appender name=&quot;RollingFile&quot; type=&quot;log4net.Appender.RollingFileAppender&quot;&gt;     
     &lt;file value=&quot;myapp-log.txt&quot; /&gt;     
     &lt;rollingStyle value=&quot;Size&quot; /&gt;     
     &lt;maximumFileSize value=&quot;10MB&quot; /&gt;     
     &lt;staticLogFileName value=&quot;true&quot; /&gt; 
&lt;/appender&gt; 
&lt;appender name=&quot;AdoNetAppender&quot; type=&quot;log4net.Appender.AdoNetAppender&quot;&gt;     
    &lt;connectionType value=&quot;System.Data.SqlClient.SqlConnection, System.Data&quot; /&gt;     
    &lt;connectionString value=&quot;data source=[datasource];initial catalog=[database];integrated security=false;&quot; /&gt;     
//...Other settings omitted for brevity
&lt;/appender&gt;با دو تگ ضمیمه ساده، می‌توانیم داده‌های خود را به طور همزمان در یک فایل و یک پایگاه داده ثبت کنیم. حالا این چیزی است که من می گویم ضربه زدن به دو پرنده با یک سنگ!بالغ و پایدار: مدتی بودن در اطراف مزایای خود را دارد، اشکالات کمتر، پذیرش گسترده، و حمایت بسیار زیاد جامعه، که به چند مورد اشاره می کنیم.پیاده سازی موفقیت آمیز log4netبا گذشت زمان، log4net خانه هایی را در بسیاری از برنامه های کاربردی در دنیای واقعی پیدا کرده است. تأکید آن بر سفارشی‌سازی و سازگاری، آن را به یک انتخاب محبوب برای سیستم‌هایی تبدیل می‌کند که نیاز به کنترل دانه‌بندی بر ورود به سیستم دارند.معایب استفاده از log4netتا اینجا فقط از آفتاب و رنگین کمان صحبت می کردیم. اما، به یاد داشته باشید که عمو بن به پیتر چه توصیه ای کرد؟ &quot;قدرت زیاد مسئولیت زیاد هم می آورد!&quot;. و با log4net، از این قاعده مستثنی نیست.فقدان logging ساختاریافته: در مقایسه با Serilog، استخراج اطلاعات معنی‌دار از سیاهه‌ها می‌تواند مانند جستجوی سوزن در انبار کاه به نظر برسد.پیچیدگی پیکربندی ها: در حالی که استفاده از XML برای پیکربندی ها درها را به روی فرصت های بی شماری باز می کند، نکته مهم این است که با آشکار شدن نیازهای شما پیچیده تر می شود. سعی کنید مشکل کوله پشتی را برای یک کودک 8 ساله توضیح دهید، متوجه خواهید شد!بنابراین، هنگام بررسی log4net، همیشه قیاس استاد سوشی را به خاطر بسپارید. مطمئنا، داشتن یک ست سوشی که خودتان انجام دهید سرگرم کننده است، اما فقط در صورتی که بدانید چگونه سوشی درست کنید. در غیر این صورت، ممکن است کثیف شود!NLogبیایید در مورد NLog صحبت کنیم. اغلب به عنوان پسر عموی جوان log4net و رقیب کمتر شناخته شده Serilog مقایسه می شود، NLog به تنهایی ترکیب منحصر به فردی از ویژگی ها را ارائه می دهد. وقتی صحبت از انعطاف پذیری به میان می آید، پیوند برادرانه ای با log4net دارد و با Serilog در زمینه logging ساختاریافته موافق است.NLog چیست؟من دوست دارم NLog را به عنوان پلی بین پیچیدگی Serilog و ماهیت آزمایش شده log4net در نظر بگیرم. از logging ساخت‌یافته پشتیبانی می‌کند و در عین حال سطح بالایی از سازگاری را از نظر مکان و نحوه ذخیره‌سازی لاگ‌ها حفظ می‌کند. اساساً، هر دو سری Serilog و log4net را دارد.// Initialize NLog Logger 
var logger = NLog.LogManager.GetCurrentClassLogger(); 
// Logging an informational message
logger.Info(&quot;Greetings from NLog World!&quot;);مثال بالا یک نمونه لاگر را نشان می دهد که با استفاده از NLog ایجاد می شود. متد GetCurrentClassLogger تضمین می کند که نمونه لاگر به کلاس فعلی اختصاص داده می شود و متعاقباً یک log اطلاعاتی ثبت می شود.شیرجه رفتن عمیق در توابع NLogبهترین‌های هر دو جهان را ارائه می‌کند - ثبت‌نام ساختاری و پیکربندی مبتنی بر XML - بدون هیچ گونه مصالحه‌ای.// NLog – Illustrating structured logging
logger.Info(&quot;Just dispatched an order {OrderId} to client {ClientId} &quot;, 1200, &quot;C100&quot;);این خطوط ساده می‌توانند اطلاعات جامعی را ثبت کنند که پردازش آنها بعداً آسان‌تر است. توجه کنید که چگونه OrderId عددی منحصر به فرد و ClientId الفبایی را مستقیماً به پیام گزارش ارسال می کنیم؟ خوب، این دقیقاً همان چیزی است که ما از Logging ساختار یافته می‌گوییم.مزایای استفاده از NLogممکن است در مقایسه با همسالان خود یک بچه جدید در بلوک به نظر برسد، اما آنچه که روی میز آورده است تازه و سازگار است.ویژگی های کلیدی NLogثبت ساختار یافته: به اندازه Serilog متمایز نیست، اما کار را بدون اضافه کردن سربار اضافی انجام می دهد.انعطاف پذیری: از نظر پیکربندی و تعریف خروجی های گزارش (فایل، کنسول، پایگاه داده یا ایمیل)، NLog به اندازه log4net انعطاف پذیر است.// NLog – Configuring multiple log targets
 var config = new NLog.Config.LoggingConfiguration();  

// Targets for logging - File and Console
 var logfile = new NLog.Targets.FileTarget(&quot;logfile&quot;) { FileName = &quot;log.txt&quot; };
 var logconsole = new NLog.Targets.ConsoleTarget(&quot;logconsole&quot;);  

// Rules for mapping loggers to targets 
config.AddRule(LogLevel.Info, LogLevel.Fatal, logconsole); config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile);  

// Apply config
NLog.LogManager.Configuration = config;کد داده شده سناریویی را ارائه می دهد که در آن NLog دو هدف را برای logging پیکربندی می کند، یعنی logconsole و logfile. تابع AddRule چیزی است که سطوح گزارش خاص را به خروجی های هدف نگاشت می کند.نمونه هایی از کاربردهای عملی NLogدقیقا کجا می درخشد؟ این گزینه برای پروژه‌هایی است که به ویژگی‌های ثبت ساختار یافته نیاز دارند، بدون اینکه از محاسباتی که می‌تواند با Serilog ارائه شود، استفاده شود. علاوه بر این، NLog در سناریوهای throttling که در آن تولید log بسیار زیاد است، بهتر عمل می کند.معایب NLogدر حالی که NLog یک رقیب توانمند است، اما هنوز مناطق خاصی دارد که از پیشرفت ها استقبال می شود:نسبتاً بالغ تر از log4net است. مدت زمان کوتاه تری وجود داشته است.اگرچه این سیستم Logging ساختار یافته دارد، اما به اندازه Serilog تکامل یافته یا پیچیده نیست. از این رو، اگر Logging ساخت یافته اولویت اصلی شماست، ممکن است بخواهید Serilog را نیز بررسی کنید.برای مثال، تصور کنید که طعم بستنی مورد علاقه خود را توضیح دهید. شما فقط نمی گویید &quot;شیرین است&quot;. شما احتمالاً جزئیات خاصی را ارائه می دهید - شاید خامه ای باشد، یا تکه های خمیر شیرینی دارد، یا شما را به یاد روزهای سرگرم کننده تابستان می اندازد.مقایسه: Serilog در مقابل log4net در مقابل NLogآیا برای رویداد اصلی آماده هستید؟ سه قهرمان سنگین وزن جهان دات نت لاگ در حال رویارویی هستند. در این گوشه، سرلوگ، Logging ساخت یافته را ارائه می دهیم. دولتمرد بزرگ، log4net. و آخرین اما نه کم اهمیت ترین، رقیب انعطاف پذیر، NLog.مقایسه ویژگی هابیایید برسیم به ریزگردها. مقایسه کتابخانه‌های Logging ممکن است مانند نان تست بدون کره خشک به نظر برسد، اما، چه کسی گفت که برنامه‌نویسی همیشه پر از اکشن است، درست است؟اول و مهمتر از همه، آیا برنامه شما نیاز به log ساختار یافته دارد؟ اگر بله، Serilog بهترین دوست شما خواهد بود. بیایید دوباره بررسی کنیم که چرا Serilog به عنوان فرزند Logging ساختار یافته است:// Serilog Structured logging
Log.Information(&quot;Order {OrderId} created for {CustomerId}&quot;, orderId, customerId);این logها به‌طور خودکار در جفت‌های کلید-مقدار ساختاربندی می‌شوند و فیلتر کردن آن‌ها را بر اساس ویژگی‌های خاص آسان می‌کنند. اجازه دهید به شما یادآوری کنم ... این طلای خالص در هنگام اشکال زدایی است!حال، اگر برنامه شما واقعاً نیازی به لاگ ساختاری ندارد، اما لاگ قابل تنظیم چیزی است که به دنبال آن هستید، log4net برای همیشه این کار را انجام داده است:// Using log4net
 var log = LogManager.GetLogger(typeof(MyClass)); log.Info(&quot;Hello, log4net!&quot;);با log4net، می‌توانید آنچه را که وارد می‌کنید و جایی که ثبت شده است را پیکربندی کنید.در همین حال، NLog بهترین‌های هر دو دنیا را برآورده می‌کند و لاگ ساختار یافته و پیکربندی بالا را متعادل می‌کند:// NLog structured logging
logger.Info(&quot;Order {OrderId} created for {CustomerId}&quot;, orderId, customerId);درست مانند Serilog، NLog از لاگ ساختاری پشتیبانی می کند و مانند log4net، تنظیمات بالایی را ارائه می دهد. یک توازن واقعی قدرت، اگر از من بپرسید.در اینجا طعم مقایسه ویژگی ها را مشاهده می کنید:مقایسه عملکردعملکرد مانند پلنگ ساکت است، تا زمانی که به آن هجوم نیاورده است. هر سه عملکرد قابل مقایسه ای ارائه می دهند. اما وقتی نوبت به ثبت ساختار یافته و با توان بالا می‌رسد، هم Serilog و هم NLog برتری کمی نسبت به log4net دارند.مقایسه حمایت جامعهآیا تا به حال به نرم افزاری گیر کرده اید که دیگر پشتیبانی ندارد؟ احساس تنهایی زیر باران می کند. با این حال، خبر خوب، هر سه کتابخانه از حمایت جامعه قوی برخوردار هستند. با این حال، Serilog و NLog توسعه فعال تری دارند، زیرا آنها نیازهای مدرن تر Logging را برآورده می کنند.نتیجهوقت آن است که نقاط قوت و ضعف رقبای خود را بسنجیم، درست مانند ارزیاب‌ها در یک بازی المپیک. آیا قهرمان ما Maestro Logging ساختاریافته، Serilog، log4net آزمایش شده و قابل اعتماد یا ادغام هماهنگ هر دو جهان، NLog خواهد بود؟ اما به یاد داشته باشید، ما در اینجا یک برنده را کاملاً اعلام نمی کنیم. در عوض، ما به این نکته اشاره خواهیم کرد که چرا هر کدام می‌توانند قهرمان کاملی در ماجراجویی‌های کدنویسی شما باشند.حکم: Serilog، log4net یا NLog؟انتخاب بین Serilog، log4net و NLog مانند انتخاب بین بازی فوتبال، بسکتبال، یا انجام یک biathlon است. آنها اساساً متفاوت هستند، اما هر کدام مزیت های منحصر به فرد خود را برای بازی به ارمغان می آورند.در اینجا تجسم دیگری برای فکر کردن وجود دارد. تصور کنید پایگاه کد ما یک شهر بسیار پیچیده است و سیاهه ها وسایل نقلیه ای هستند که در آن عبور می کنند. سپس Serilog سوپراسپرت ما خواهد بود، برای بزرگراه‌ها (یا logging ساختاریافته) عالی است، زیرا برای عملکرد و سرعت عالی ساخته شده است، با امتیاز زرق و برق دار بودن.// Serilog: Speeding up your structured log queries
Log.Logger = new LoggerConfiguration()     
.WriteTo.Console()      
.CreateLogger(); 

 Log.Information(&quot;Processing {@Order} at {Time}&quot;, order, DateTime.Now);در همین حال، log4net مانند یک کامیون قابل اعتماد است. ممکن است آنقدرها هم پر زرق و برق یا سریع نباشد، اما قوی و قابل اعتماد است، در شهر ما به راحتی در حال گشت و گذار است و تمام کارهای روزانه logging را بدون عرق کردن انجام می دهد.// log4net: Reliable and gets the job done
 var log = LogManager.GetLogger(typeof(MyClass)); log.Info(&quot;Performing the day to day logging tasks!&quot;);در نهایت، NLog تلاش می‌کند تا تعادلی ایجاد کند، و به عنوان یک SUV عمل می‌کند که توانایی آفرود و راحتی را با هم ترکیب می‌کند و شکاف بین درخشندگی لاگینگ ساختاری Serilog و دوام بدون عارضه log4net را پر می‌کند.// NLog: Best of both worlds
var logger = NLog.LogManager.GetCurrentClassLogger(); logger.Info(&quot;Order {OrderId} named {OrderName} for {CustomerId}&quot;, orderId, orderName, customerId);سرگرم کننده به نظر می رسد، درست است؟ اما هنوز عجله نکنید. به‌عنوان توسعه‌دهندگان، انتخاب‌های ما باید همیشه بر اساس نیازهای خاص و زمینه برنامه‌مان باشد.نکاتی برای انتخاب کتابخانه ثبت Log مناسبانتخاب یک کتابخانه Log یک تصمیم حیاتی است، اما لازم نیست به اندازه گرفتن جکپات در قرعه کشی سخت باشد. در اینجا چند نکته وجود دارد که ممکن است به تمرکز تصمیم شما کمک کند:محتویات log: چه اطلاعاتی را ثبت خواهید کرد؟ آیا متن ساده، رویدادهای غنی از ویژگی، یا هر دو است؟ به یاد داشته باشید، Serilog حامل استاندارد برای Logging ساختار یافته است، NLog یک جایگزین متعادل ارائه می‌کند، و log4net قهرمان logging قدیمی شما است.پیشنهاد کتابخانه: اکوسیستم کتابخانه را نیز در نظر بگیرید. چه خروجی های logging (فایل، کنسول، پایگاه داده، ابر و غیره) پشتیبانی می شوند؟ حمایت جامعه چگونه است؟ادغام: آیا پشته فناوری شما با کتابخانه سازگار است؟ به عنوان مثال، اگر از طرفداران اینترفیس logging داخلی NET Core هستید، هم Serilog و هم NLog یکپارچه سازی عالی ارائه می دهند.// Example: Integrating Serilog with the built-in .NET Core logging
Log.Logger = new LoggerConfiguration()
     .Enrich.FromLogContext()
     .WriteTo.Console()
     .CreateLogger();

  WebHost.CreateDefaultBuilder(args)
     .UseSerilog()
     .Build();کارایی و سهولت استفاده: اگر برنامه شما دارای تعداد زیادی log است، باید مطمئن شوید که کتابخانه انتخابی شما نه تنها سریع است، بلکه برای جستجو و فیلتر کردن نیز ساده است.مانند تیمی که یک بازیکن کامل را برای مسابقه بعدی خود انتخاب می کند، کتابخانه Logging را انتخاب کنید که در بازی که برنامه شما انجام می دهد برجسته باشد. چشمان خود را روی صفحه برنامه نویسی قرار دهید، انگشتان زیرک خود را خم کنید، و اجازه دهید آنها بر روی صفحه کلید برقصند، و یادداشت های log کاملی را روی بوم برنامه دات نت خود ایجاد کنید. بگذارید بهترین logger برنده شود!کانال من:t.me/dotNetSchool</description>
                <category>Yaser Fashami</category>
                <author>Yaser Fashami</author>
                <pubDate>Mon, 25 Dec 2023 17:36:28 +0330</pubDate>
            </item>
                    <item>
                <title>Composition Over Inheritance</title>
                <link>https://virgool.io/TechnicalPapers/composition-over-inheritance-zxdexeoil5al</link>
                <description>اما به چه معنا است؟???????????: بین یک کلاس پایه و یک زیر کلاس رابطه &quot;Is-a&quot; بوجود می آورد. این یک راه سریع و شهودی برای به اشتراک گذاشتن رفتار بین کلاس ها است. اما نگهداری  code base را دشوار میکند. - کلاس های فرعی به پیاده سازی کلاس والد بستگی دارد. navigate سخت است. - زیر کلاس ها همه رفتارهای کلاس والد را به ارث می برند، حتی اگر به آنها نیاز نداشته باشند. - نادیده گرفتن(Overriding) رفتار کلاس والد می تواند اشکال ایجاد کند.???????????: یک رابطه &quot;Has-a&quot; تشکیل میدهد.ایده ساختن آبجکتها پیچیده با ترکیب آبجکتهای ساده تر است.  - کامپوننت ها در کلاس های مختلف قابل استفاده مجدد هستند. - تغییر رفتار در زمان اجرا با تغییر اجزای یک کلاس آسان است. - اجزای کوچکتر و خودکفا راحت تر تغییر می کنند. - کامپوننت ها مستقل هستند و از طریق interface های کاملاً تعریف شده با هم تعامل دارند و وابستگی آنها را کاهش می دهند.مزایای ???????????:- بهبود تست پذیری اجزای جداگانه. - آسان برای تغییر اجزای مستقل. - کپسولاسیون و اصل مسئولیت واحد(SRP) را ترویج می کند.مضرات ???????????:- افزایش تعداد اشیاء در یک سیستم.ترجیح Composition بر Inheritance به این معنی نیست که وراثت یک مفهوم منسوخ است.Inheritance  مفید باقی می ماند، به خصوص زمانی که چندشکلی و سلسله مراتبی حوزه مسئله را مدل می کنند.نظر شما چیست؟همینطور این مقاله را بخوانید</description>
                <category>Yaser Fashami</category>
                <author>Yaser Fashami</author>
                <pubDate>Tue, 07 Nov 2023 14:38:10 +0330</pubDate>
            </item>
                    <item>
                <title>گشتی در معماری (N-layered, DDD, Hexagon, Onion, Clean Architecture)</title>
                <link>https://virgool.io/TechnicalPapers/%DA%AF%D8%B4%D8%AA%DB%8C-%D8%AF%D8%B1-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-back-end-nwu0ygx0gwvs</link>
                <description>درود!? پس میخوای معمار بشی، نه؟ به من دروغ نگو، می دانم که می گویی. حتی اگر این کار را نکنید، باز هم می خواهید توسعه دهنده بهتری باشید. در غیر این صورت وقت صرف خواندن این مقاله نمی کردید ?قابل تقدیر است. به هر حال، همه ما می خواهیم در کاری که انجام می دهیم، اگر بهترین نباشیم، بهتر باشیم. من اینجا هستم تا در این مورد به شما کمک کنم.بنابراین، چگونه می توان یک معمار شد؟ بدیهی است با یادگیری تمامی معماری ها! ? البته این درست نیست. لازم نیست همه چیز را بدانید همچنین لازم نیست با همه آنها تجربه داشته باشید. با این حال، دانستن حداقل محبوب ترین آنها، مانند N-Layered، DDD، Hexagon، Onion و Clean؛ درک تاریخچه آنها، استفاده از آنها و تفاوت بین آنها قطعاً شما را از سایر توسعه دهندگان متمایز می کند.امیدوارم این کلمات مقدمه کافی بوده باشد تا شما را درگیر کند. اگر هنوز علاقه دارید، بیایید شروع کنیم ?همه چیز از کجا شروع شد؟در دوران خوب گذشته، اصلاً معماری وجود نداشت. چه روزهای پر برکتی بود شما فقط با دانستن الگوهای GoF می توانید خود را معمار بنامیدبا این حال، کامپیوترها قدرتمندتر شدند، تقاضای کاربر افزایش یافت که باعث شد پیچیدگی برنامه افزایش یابد.اولین چیزی که توسعه دهندگان حل کردند، جدا کردن UI از منطق تجاری بود. بسته به چارچوب UI، الگوهای مختلف MVC مانند متولد شدند:این برای مدتی کمک کرد، اما نه چندان. اگر شما هم مثل من از جامعه سی شارپ هستید، احتمالاً به اشتباه فکر می‌کنید که جعبه زرد رنگی به نام Model روی آن نمودارها فقط DTO است. همه اینها به خاطر مایکروسافت است. آنها ما را با چارچوب ASP MVC خود گیج کردند. لعنت به تو، مایکروسافت! فکر می کنی از من باهوش تر هستی فقط به این دلیل که من احمق تر هستم؟ ?در واقع، Model در اینجا مخفف Domain Model است که به عنوان منطق تجاری نیز شناخته می‌شود، که در هر برنامه‌ای کاملاً حیاتی است.آیا می توانید قمار کنید، کدام یک از آن سه جزء بالا بیشترین مشکل را ایجاد می کند؟ در حالی که View فقط تصاویر و دکمه‌های ساده است، کنترل‌کننده‌ها در وسط قرار دارند و تمام پیچیدگی‌ها در مدل متمرکز شده است.آن دوره ای بود که الگوهای GoF به سادگی کافی نبودند. بنابراین باید ایده های جدیدی ظاهر می شد. چگونه پیچیدگی را مدیریت کنیم؟ درست! تفرقه بینداز و حکومت کن. ما قبلاً این کار را با MVC انجام دادیم، پس بیایید یک بار دیگر این کار را انجام دهیم.2002 - N-Layeredمعماری ایده آل از هیچ ظاهر نشد. مثل همه چیز، با سعی و خطا راه خودش را رفت.مردی که پیشگام معماری توسعه نرم‌افزار بود و نسل‌های توسعه‌دهندگان را در دهه بعدی تحت تأثیر قرار داد، Martin Fowler نام دارد. او اینگونه بود:او &quot;الگوهای معماری کاربردی سازمانی&quot; را منتشر کرد که در آن معماری N-Layered توضیح داده شد.ایده در اینجا ساده است، گروه بندی همه کدهای مرتبط با هم و فراخوانی آن لایه ها.فاولر می داند که inconsistency چقدر می تواند مضر باشد. بنابراین برای جلوگیری از شلیک گلوله به پای خود، سعی کرد با محدودیت هایی ما را راهنمایی کند:شما می توانید لایه ها را به روشی که می خواهید نام گذاری کنیدمی توانید هر تعداد لایه که نیاز دارید داشته باشیدمی توانید لایه هایی را در این بین اضافه کنیدمی توانید چندین مؤلفه در یک لایه داشته باشیدفقط مطمئن شوید که یک سلسله مراتب واضح بین لایه ها وجود دارد، به گونه ای که آنها یکی یکی به یکدیگر ارجاع می دهند.این به توسعه دهندگان کمک کرد تا نه تنها از شر تکرار کد خلاص شوند، بلکه در نهایت به ساختار کد خود کمک کنند. اگرچه، این قوانین بسیار چابک هستند، در عمل، 3 لایه برای اکثر پروژه ها بیش از اندازه کافی بود.رابط کاربری (UI) - مسئول تعامل با کاربران است.لایه منطق کسب و کار (BLL) - مفاهیم کسب و کار را نشان می دهد. این برنامه کاری را که برنامه شما انجام می دهد را کنترل می کند و آن را در مقایسه با سایرین بسیار منحصر به فرد می کند.لایه دسترسی به داده (DAL) - داده ها را در حافظه نگه می دارد و وضعیت برنامه شما را حفظ می کنددر اینجا ما یک جدایی واضح بین منطق تجاری و UI داریم. معلوم شد که پایگاه داده به اندازه قوانین تجاری مهم است، بنابراین سزاوار لایه خاص خود بود. در واقع، تمام فناوری های خارجی می توانند به آخرین لایه نیز بروند. همه چیز همانطور است که کتاب می گوید ?اگر تعجب می کنید که آن مستطیل ها و فلش های رنگارنگ چه معنایی برای شما دارند، نگران نباشید، ساده است. این لایه‌ها فقط پروژه‌هایی در solution شما هستند و فلش‌ها وابستگی بین آن‌ها را نشان می‌دهند.جداسازی لزوماً نباید با پروژه ها فیزیکی باشد، بلکه می تواند فقط با پوشه ها منطقی باشد. شما همچنین می توانید هر دو روش را ترکیب کنید. از آنچه برای شما مناسب تر است استفاده کنید.تفاوت بین پوشه و پروژه مهم است. یک پروژه در واقع به شما این امکان را می دهد که وابستگی های خود را کنترل کنید. با پوشه ها، ممکن است حتی متوجه نشوید که یک لایه شروع به استفاده از اجزای دیگری می کند. از سوی دیگر، با پروژه های بسیار زیاد، کد شکننده تر و نگهداری آن سخت تر شد. به خاطر داشته باشید که هیچ قانون سختگیرانه ای برای آن وجود ندارد. خودتان را امتحان کنید و ببینید چه چیزی برای شما مناسب تر است. مثل همیشه، این یک معامله بین قابلیت اطمینان و پیچیدگی است. توصیه من در اینجا این است که پروژه های زیادی ایجاد نکنید مگر اینکه واقعاً به آنها نیاز داشته باشید، یک پروژه در هر لایه بیش از اندازه کافی است.هر لایه, لایه زیر را با API خود فراخوانی می کند که معمولاً به شکل یک interface نمایش داده می شود. Access modifiers در هر کلاس به اندازه آن لایه ها مهم هستند:این ممکن است در حال حاضر برای شما بدیهی به نظر برسد، اما این فقط به این دلیل است که شما در دوران سختی زندگی نکرده اید. استفاده از آن همیشه آسان است اما اختراع آن سخت است. ?2003 — Domain Driven Designدر سال 2003، اریک ایوانز، توسعه‌دهنده جوان 46 ساله از بوستون، کتاب خود را با عنوان «طراحی دامنه محور: مقابله با پیچیدگی در قلب نرم‌افزار» منتشر کرد که حداقل یکی از مارتین‌ها را در جهان واقعاً غمگین کرد.در واقع، DDD یک موضوع جداگانه است که باید در سری مقالات خود توضیح داده شود، بنابراین ما در حال حاضر این کار را انجام نمی دهیم، فقط روی تمام تغییرات معماری تمرکز کنیم.ایوانز با تمام ایده های فاولر موافق بود که وابستگی های پروژه باید در یک جهت قرار گیرند. با این حال، او همچنین اشاره کرد که برای ماژول های سطح پایین خوب است که ماژول های بالا را فراخوانی کنند، مگر اینکه dependency direction rule را زیر پا بگذارند. می توان با callbacks، observer patterns و غیره به آن دست یافت.او همچنین دید که کنترلرها منطق زیادی دارند، بنابراین آن را به لایه دیگری به نام Application منتقل کرد.اما مهم‌ترین کاری که ایوانز انجام داد این بود که گفت: «F*uckبه پایگاه داده، منطق تجاری مهم‌تر است». اینو گفت و بعد هیچ کاری نکرد?‍♂️. بله، بله، بله می دانم... DDD and so on. با این حال، از نقطه نظر معماری، او تغییر چندانی ایجاد نکرده است.در معماری او، لایه ها اینطور تعریف شده است:لایه ارائه Presentation Layer- مسئول تعامل با کاربران است.لایه برنامه Application Layer- وظایف را هماهنگ می کند و کار را به اشیاء دامنه واگذار می کند.لایه دامنه Domain Layer- مفاهیم کسب و کار را نشان می دهد. این برنامه کاری را که برنامه شما انجام می دهد را کنترل می کند و آن را در مقایسه با سایرین بسیار منحصر به فرد می کند.لایه زیرساخت Infrastructure Layer- داده ها را در حافظه نگه می دارد و وضعیت برنامه شما را حفظ می کندهمینطورکه می بینید، او تغییر نام داد.رابط کاربری به این معنی است که شما کاربرانی دارید، که همیشه اینطور نیست. گاهی اوقات GUI (رابط کاربری گرافیکی) برای کاربران، گاهی اوقات CLI (واسط خط فرمان) برای توسعه دهندگان و اغلب API (رابط برنامه نویسی برنامه) برای برنامه ها است. لایه Presentation فقط یک نام عمومی تر و مناسب تر است.منطق کسب و کار برای برخی از توسعه دهندگان، به خصوص برای کسانی که اصلاً تجارتی ندارند، گیج کننده بود، بنابراین نام جدیدی معرفی شد - Domain.پایگاه داده تنها ابزار خارجی نیست که ما استفاده می کنیم، بنابراین همه فرستنده های ایمیل، اتوبوس های رویداد، SQL و سایر cr?p ها به زیرساخت منتقل شدند.اساساً همین است. برخی تغییر نام در اینجا. به علاوه یک لایه جدید وجود دارد. تلاش زیادی برای دامنه انجام شد. اما همان معماری با همان وابستگی هاست. اگر از اصل dependency inversion خبر داشت ?.2005 — Hexagon (Ports and Adapters)قبلاً، ماژول‌ها باید به مورد بعدی در ردیف ارجاع دهند. با کشف dependency inversion، همه چیز تغییر کرده است.این یک فرصت باورنکردنی برای توسعه دهندگان نرم افزار بود. ما بالاخره یاد گرفتیم که چگونه جهت وابستگی ها را کنترل کنیم تا آنها را به روشی که دوست داریم نشان دهیم! این بدان معناست که منطق تجاری دیگر به دسترسی به داده ها اشاره نمی کند.اولین کسی که در اینجا پتانسیل را دید، آلیستر کاکبرن بود. یک شش ضلعی کشید، سعی کرد شیطان را صدا بزند و ... نیازی نیست به شما بگویم، خودتان بهتر می دانید که در مهمانی های راک چطور پیش می رود. اینجا هیچ چیز خاصی نیست، یک روز مقداری علف می کشید، روز بعد، صبح با خماری شدید از خواب بیدار می شوید و متوجه می شوید که به طور تصادفی یک معماری جدید را کشف کرده اید.آلیستر از مستطیل ها خسته شد، بنابراین یک شش ضلعی کشید، برای همه چیز دو نام آورد، سعی کرد آن را ترسناک کند. اما همکار توسعه دهنده من نترس. در واقع، این معماری بسیار پیچیده تر از معماری N-layered نیست:چرخیدن و جابجایی زیادی وجود داشت، پس بیایید ببینیم در آنجا چه اتفاقی افتاده است.کاکبرن رویای ایوانز را محقق کرد. اکنون Domain جزء مرکزی سیستم است، نه تنها در کلمات، بلکه در عمل. به هیچ پروژه دیگری ارجاع نمی دهد.برای تأکید بر این که واقعاً قلب است، منطق تجاری به Core تغییر نام داد.ماژول های زیرساخت به نصف تقسیم شدند - abstraction (interfaces) و پیاده سازی. انتزاع ها بخشی از منطق تجاری شدند و به پورت تغییر نام دادند. پیاده سازی در لایه زیرساخت باقی ماند. اکنون به آنها آداپتور می گویند. در عمل، UI همان framework layer بعنوان DB بود، بنابراین به همان سرنوشت دچار شد.وجود رابط های زیرساخت در منطق کسب و کار شما، باعث می شود دامنه مستقل و بدون وابستگی باشد. در نتیجه منطق کسب و کار می تواند در هر محیطی و با هر ابزاری کار کند. آیا می خواهید DB را تغییر دهید؟ فقط پیاده سازی را تغییر دهید، آداپتور مورد نیاز را پیاده سازی کنید و آن را به پورت موجود &quot;وصل کنید&quot;.تغییرات در هر آداپتور (پایگاه داده، فرستنده ایمیل، رابط کاربری) بر منطق تجاری تأثیر نمی گذارد. رابط ها ثابت می مانند.هر جزء را می توان به طور جداگانه deploy کرد. اگر دسترسی به داده را تغییر دهید، فقط دسترسی به داده باید بازسازی شود. اگر UI را تغییر دهید، فقط UI تغییر می کند.از آنجایی که ماژول ها را می توان به طور جداگانه deploy کرد، به این معنی است که می توان آنها را به طور جداگانه توسعه داد.فراموش نکنید، آداپتورهایی در سیستم ما به نام primary (driving) نامیده میشود. آنهایی که توسط سیستم ما فراخوانی می شوند secondary (driven) نامیده می شوند. دانستن آن مهم نیست، اما دانستن آن باعث می شود که شما تحصیل کرده به نظر برسید ?از نظر solution structure، این برای من بهتر کار میکند:باز هم، پوشه در مقابل پروژه چیزی است که باید خودتان تصمیم بگیرید.فقط منابع را دنبال کنید و مطمئن شوید که از جایی که نباید عبور کنند:2008 — Onionاین یکی ترسناک خواهد بود، پس خودتان را آماده کنیدجفری پالرمو داستانی غم انگیز و پر از غم و تاریکی در مورد پسری است که کودکی معصومانه اش با تفکر بی رحمانه پیازها خدشه دار شده است. همانطور که او بزرگ شد، نفرت آتشینی در وجودش موج می زد و وعده انتقامی را می سوزاند که روزی به آن عمل خواهد کرد:و من را در این مورد باور کنید، او برای همیشه به وعده خود وفا کرد. پیاز کوچک او باعث می شود میلیون ها توسعه دهنده در سراسر جهان گریه کنند و در حالی که به سمت دستان مادر می دوند گریه کنند.این معماری از پورت ها و آداپتورها بسیار بهبود می یابد. همچنان شامل dependency inversion است. کد را به انتزاع و پیاده سازی تقسیم می کند. پورت ها هنوز بخشی از منطق تجاری هستند. فقط این بار پالرمو لایه Application را از طرح Evans اضافه می‌کند که می‌تواند حاوی چند پورت نیز باشد.بزرگترین چالش با این معماری، که باعث سردرگمی بسیار می شود، وابستگی بین ماژول ها است.با این حال، قانون ساده است: هر لایه بیرونی فقط و فقط می تواند به لایه های داخلی بستگی داشته باشد.خیلی ساده نیست، ها؟ ? من اینطور فکر می کردم. پس بیایید آن پیاز را خلال کنیم ?.دامنه در وسط قرار دارد. هیچ لایه داخلی درون آن وجود ندارد، بنابراین نباید به هیچ لایه دیگری وابسته باشد.برنامه فقط دامنه را پوشش می دهد، بنابراین این دقیقاً تنها وابستگی است که باید داشته باشد.لایه‌های Infrastructure و Presentation در یک سطح هستند، نمی‌توانند به یکدیگر وابسته باشند، اما می‌توانند به Application و Domain وابسته باشند، جایی که تمام اینترفیس‌های مورد نیاز تعریف شده‌اند.همچنین می توانید ببینید که تمام ماژول های معماری DDD را دارد اما آنها را به گونه ای متفاوت مدیریت می کند. در واقع کار بزرگی می کند! کلید در اینجا، داشتن اجزای وسط است که به ندرت تغییر می کنند و اغلب در لبه ها تغییر می کنند. تغییرات در Application یا هر لایه دیگری روی Domain تأثیر نمی گذارد، فقط لایه های وابسته را تحت تأثیر قرار می دهد. تنها دلیل تغییر دامنه شما زمانی است که منطق کسب و کار تغییر می کند، و این موردی است که به هر حال کل سیستم را تحت تاثیر قرار می دهد.این که چگونه به نظر می رسد در عمل، composition root شما (تابع Main که در آن همه وابستگی ها ثبت می شوند و ماژول ها با هم ترکیب می شوند) بخشی از لایه ارائه (ASP، WPF، CLI) خواهد بود، بنابراین نمودار شکل زیر را خواهد داشت:برای شما آشنا به نظر می رسد؟ این معماری N-layered است، اما اجزا به ترتیب متفاوتی هستند.مهم نیست که چگونه به نظر می رسد، شش ضلعی، پورت ها یا پیاز، هدف نهایی شما باید وابستگی های خود را در قالب یک نمودار غیر چرخه ای یا یک درخت مشخص کنید.2012 — Clean Architecture???There’s a man named Uncle Bob,He’s the cleanest coder on the job,With his agile moves and architecture too,He’ll make your code shine like brand new,Uncle Bob???منظورم اینه که نمیشه بدون ذکر روبرت سی مارتین به سادگی مقاله ای در مورد معماری نوشت.او تمام هیاهوهای پیرامون معماری را دید و تصمیم گرفت جشن را به هم بزند. مارتین راز اصلی هر توسعه‌دهنده‌ای را می‌داند، بنابراین او حتی سعی نمی‌کرد آن را پنهان کند. فقط وقیحانه ایده های مردم را دزدید و آنها را از آن خود نامید.فقط به شوخی، این روزها ایده های اصلی زیادی وجود ندارد، همه از یکدیگر دزدی می کنند.?دامنه ما یک بار دیگر نام خود را تغییر داد. اکنون Entities است. با این حال، این تنها نیست. این نشاندهنده آن است که شما domain services و مدل های anemic ندارید، اما rich class ها با داده ها و رفتار دارید.کلاسهای repository و سایر پورت ها از Domain به لایه Application منتقل می شوند. که به نوبه خود نام مناسب تری داشت - Use Cases.لایه های ارائه و زیرساخت ثابت می مانند. با این حال، مارتین همچنین یک لایه اضافی در بالا اضافه می کند که شامل Frameworks، DLL و سایر وابستگی های خارجی است. این لزوماً به این معنی نیست که DB شما به Entities ارجاع خواهد داشت، بلکه فقط مانع از ارجاع شما از لایه‌های داخلی به آن ابزارهای خارجی می‌شود.بار دیگر، هیچ قانون سختگیرانه ای وجود ندارد. شما می توانید به تعداد لایه هایی که نیاز دارید در هر سطحی که می خواهید اضافه کنید. بنابراین اگر می خواهید یک لایه برای خدمات دامنه تعریف کنید، می توانید.مارتین همچنین یک نمودار کوچک نزدیک به معماری کشیده است.این نشان می دهد که کاربران با فعال کردن endpoint کنترلر که یک use case را فراخوانی می کند، با یک سیستم ارتباط برقرار می کنند و سپس داده ها را از طریق ارائه دهنده (خطوط سیاه) برمی گرداند. Use case می تواند هر پورت مورد علاقه خود را با رابط (خطوط سبز) فراخوانی کند. در حالی که اجرای واقعی بخشی از لایه های بیرونی (خطوط نارنجی) است.سعی می‌کند نشان دهد که جریان اجرا (خط نقطه‌دار) همیشه با جهت وابستگی (خط مستقیم) مطابقت ندارد، که فقط اصل وارونگی وابستگی است.اساسا، استفاده از وارونگی کنترل را بار دیگر برجسته می کند. شما قبلاً این را زمانی که ما در مورد پورت ها و آداپتورها صحبت می کردیم دیده اید.معمولاً در ASP ما کامپوننت جداگانه ای برای ارائه دهنده نداریم. این کار توسط کنترلر نیز انجام می شود. بنابراین کل نمودار را می توان در کد به شکل زیر نشان داد:Other forms of isolationتمام آن معماری هایی که هدفشان جداسازی یک کد از کد دیگر با تقسیم مسئولیت هاست. با این حال، اشکال دیگری از جداسازی وجود دارد: برش های عمودی، بافت محدود، ماژول ها، میکروسرویس ها و غیره. هدف در اینجا تقسیم کد بر اساس ویژگی ها است.برخی آن‌ها را رویکردهای معماری «واقعی» نمی‌دانند، در حالی که برخی چنین می‌کنند. این به شما بستگی دارد. در پایان، آنها تا جایی رشد خواهند کرد که هنوز از هر یک از سبک‌های معماری از بالا یا حتی ترکیبی از آن‌ها استفاده می‌کنند:نتیجهدر این مقاله به معماری های N-layer، DDD، Hexagon، Onion و Clean پرداختیم. اینها تنها معماری موجود نیستند. با این حال، مواردی که شرح داده شد، معروف ترین آنها هستند. ممکن است در مورد BCE، DCI و غیره نیز شنیده باشید.صرف نظر از تفاوت جزئی در جزئیات، تمام معماری ها تقریباً یکسان هستند. همه آنها به یک هدف عمل می کنند - تقسیم مسئولیت ها. همه آنها این کار را با تقسیم کد در لایه های جداگانه انجام می دهند. کل تفاوت در این است که چه اجزایی تعریف شده اند و چه وابستگی هایی بین آن لایه ها وجود دارد.اکنون که تصویر کامل را دارید، شدیداً شما را تشویق می کنم که این مقاله را یک بار دیگر بخوانید. تفاوت بین معماری را خودتان برجسته کنید. همچنین می توانید سعی کنید و به تنهایی با پروژه ها بازی کنید. چند کلاس با اینترفیس بنویسید، به ارجاعات بین پروژه های خود توجه کنید، اینترفیس ها و پیاده سازی ها در کجا قرار می گیرند، چه access modifier استفاده می شود.امیدوارم از هم اکنون، هر بار که یک کلاس ایجاد می کنید، یک PR را مرور می کنید، با همکار خود صحبت می کنید، آگاهانه فکر کنید و آن چیزها را زیر سوال ببرید.کانال من:t.me/dotNetSchool</description>
                <category>Yaser Fashami</category>
                <author>Yaser Fashami</author>
                <pubDate>Mon, 24 Jul 2023 12:11:50 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت APIهای وب مقیاس پذیر و ایمن با محدودیت نرخ در dotNET Core Web API با استفاده از AspNetCoreRateLimit</title>
                <link>https://virgool.io/TechnicalPapers/%D8%B3%D8%A7%D8%AE%D8%AA-api%D9%87%D8%A7%DB%8C-%D9%88%D8%A8-%D9%85%D9%82%DB%8C%D8%A7%D8%B3-%D9%BE%D8%B0%DB%8C%D8%B1-%D9%88-%D8%A7%DB%8C%D9%85%D9%86-%D8%A8%D8%A7-%D9%85%D8%AD%D8%AF%D9%88%D8%AF%DB%8C%D8%AA-%D9%86%D8%B1%D8%AE-%D8%AF%D8%B1-dotnet-core-web-api-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-aspnetcoreratelimit-dx3m0kq0u0uv</link>
                <description>مقدمه: محدود کردن نرخ یک جزء حیاتی در توسعه APIهای وب مقیاس پذیر و ایمن است. نقش مهمی در جلوگیری از سوء استفاده، حفاظت از منابع سرور و تضمین استفاده منصفانه برای همه مصرف کنندگان ایفا می کند. در این پست، اجرای محدودیت نرخ در یک برنامه NET Core Web API را بررسی خواهیم کرد و مثال‌ عملی برای نشان دادن اجرای آن ارائه می‌کنیم.محدود کردن نرخ چیست؟محدود کردن نرخ تکنیکی است که محدودیت‌هایی را بر روی تعداد درخواست‌های API تعیین می‌کند که مشتری می‌تواند در یک بازه زمانی خاص انجام دهد. محدودیت‌هایی را در مورد اینکه مشتریان چقدر می‌توانند به نقاط پایانی یا منابع خاصی دسترسی داشته باشند، ایجاد می‌کند. با اعمال این محدودیت ها، توسعه دهندگان می توانند از سوء استفاده جلوگیری کنند، بار سرور را به طور یکنواخت توزیع کنند و تجربه کاربری با کیفیت بالا را حفظ کنند.پیاده‌سازی Rate Limiting در NET Core Web API:برای پیاده‌سازی محدود کردن نرخ در برنامه NET Core Web API، می‌توانیم از قدرت کتابخانه AspNetCoreRateLimit استفاده کنیم که راه‌حلی قوی و انعطاف‌پذیر ارائه می‌دهد. بیایید به روند گام به گام شیرجه بزنیم:مرحله 1:بسته AspNetCoreRateLimit NuGet را نصب کنید: با نصب بسته AspNetCoreRateLimit از NuGet شروع کنید. می توانید از NuGet Package Manager در Visual Studio استفاده کنید یا دستور زیر را در Package Manager Console اجرا کنید: Install-Package AspNetCoreRateLimit.مرحله 2: پیکربندی Rate Limiting Middleware:یک policy در AspNetCoreRateLimit به عنوان پیکربندی و resolver کلاینت اجرا می‌شود:در فایل Program.cs، خدمات Rate Limiting را با افزودن کد لازم ثبت کنید. این مرحله پایه و اساس را برای فعال کردن Rate Limiting در برنامه شما تنظیم می کند.مرحله 3: تعریف Rate Limit Policies:سیاست های Rate Limiting را با افزودن پیکربندی مورد نیاز تعریف کنید. با ایجاد یک قانون کلی، می‌توانید یک خط‌مشی Rate Limiting پیش‌فرض ایجاد کنید که برای تمام نقاط پایانی API شما اعمال می‌شود. این به جلوگیری از درخواست های بیش از حد از هر مشتری یا آدرس IP کمک می کند و استفاده منصفانه و تخصیص بهینه منابع را تضمین می کند. علاوه بر این، می‌توانید policy های اضافی را تعریف کرده و آن‌ها را سفارشی کنید تا با نیازهای خاص برنامه‌تان هماهنگ شوند.مرحله 4: Enable Rate Limiting Middleware:در فایل Program.cs، میان افزار محدود کننده نرخ را با افزودن کد زیر فعال کنید:این مرحله مهم، عملکرد محدود کننده نرخ را در API شما فعال می کند.مرحله 5: محدودیت نرخ آزمایش:اکنون، می‌توانید پیاده‌سازی محدودکننده نرخ را با درخواست‌های API آزمایش کنید. اگر مشتری از محدودیت های تعریف شده فراتر رود، پاسخی با کد وضعیت 429 دریافت می کند که نشان می دهد &quot;از سهمیه تماس های API فراتر رفته است! حداکثر مجاز: 10 در هر 1 ساعت.&quot;مزایا محدودیت نرخ:محدودیت نرخ مزایای متعددی از نظر محافظت از API شما و اطمینان از عملکرد روان آن ارائه می دهد. بیایید برخی از مزایای کلیدی را بررسی کنیم:محافظت در برابر رفتار توهین آمیز: محدود کردن نرخ به محافظت از API شما در برابر رفتارهای توهین آمیز، مانند درخواست های بیش از حد یا حملات انکار سرویس کمک می کند.بهینه سازی منابع: با محدود کردن تعداد درخواست ها به ازای هر مشتری یا آدرس IP، محدودیت نرخ از فرسودگی منابع جلوگیری می کند و از عملکرد سرور محافظت می کند.امنیت پیشرفته: با محدود کردن تعداد تلاش‌ها یا درخواست‌های ورود به نقاط پایانی حساس، محدودیت نرخ به کاهش خطر دسترسی غیرمجاز یا نقض داده‌ها کمک می‌کند.فرصت‌های کسب درآمد: محدود کردن نرخ به ارائه‌دهندگان API اجازه می‌دهد تا سطوح مختلف یا طرح‌های قیمت‌گذاری را بر اساس استفاده پیاده‌سازی کنند. با تنظیم محدودیت‌های نرخ متفاوت برای سطوح مختلف اشتراک یا سطوح قیمت، می‌توانید خدمات متفاوتی را ارائه دهید و به طور موثر API خود را کسب درآمد کنید.معایب محدودیت نرخ:در حالی که محدودیت نرخ مزایای قابل توجهی را ارائه می دهد، مهم است که معایب احتمالی را نیز در نظر بگیرید. در اینجا چند مورد از معایب را باید در نظر داشت:پیچیدگی پیکربندی: پیاده سازی محدودیت نرخ نیاز به پیکربندی و مدیریت دقیق دارد. تعیین محدودیت‌های نرخ بهینه، تمایز بین انواع مشتری و رسیدگی به موارد لبه می‌تواند پیچیدگی ایجاد کند.کانال من:t.me/dotNetSchool</description>
                <category>Yaser Fashami</category>
                <author>Yaser Fashami</author>
                <pubDate>Mon, 17 Jul 2023 13:19:25 +0330</pubDate>
            </item>
                    <item>
                <title>Composition, Aggregation and Assosiation in a simple word</title>
                <link>https://virgool.io/TechnicalPapers/composition-aggregation-and-assosiation-in-software-engeenering-g5nso3nw5iig</link>
                <description>ترکیب، تجمیع و ارتباط در مهندسی نرم‌افزار به مفاهیم مهمی اشاره دارند که در طراحی و پیاده‌سازی سیستم‌های نرم‌افزاری استفاده می‌شوند. این مفاهیم نحوه ارتباط بین کلاس‌ها و اشیا در یک سیستم را تعریف می‌کنند. در زیر به توضیح هر یک از این مفاهیم پرداخته می‌شود:۱. ترکیب (Composition): ترکیب به معنای ایجاد ارتباط بین دو کلاس است به گونه‌ای که یک کلاس به عنوان یک قسمت (بخش) از کلاس دیگر شناخته می‌شود. به عبارت دیگر، یک کلاس ترکیب‌شده دارای قسمت‌های تشکیل‌دهنده‌ای (زیرکلاس‌ها یا اشیاء) است که هر یک می‌توانند مستقل از یکدیگر عمل کنند. وقتی که کلاس اصلی حذف می‌شود، تمامی قسمت‌های تشکیل‌دهنده نیز از بین می‌روند.ترکیب یک رابطه &quot;has-a&quot; است که در آن یک کلاس شامل کلاس دیگری به عنوان بخشی است. وقتی جسم ظرف از بین می رود، قطعات آن نیز از بین می رود. برای نشان دادن این موضوع، اجازه دهید یک کلاس «ماشین» متشکل از یک کلاس «موتور» را در نظر بگیریم.در این مثال، کلاس &quot;Car&quot; از طریق ترکیب با کلاس &quot;Engine&quot; رابطه &quot;has-a&quot; دارد. هنگامی که یک شی &quot;Car&quot; ایجاد می شود، حاوی یک شی &quot;Engine&quot; است و زمانی که شی &quot;Car&quot; از بین می رود، قسمت &quot;Engine&quot; آن نیز از بین می رود.۲. تجمیع (Aggregation): تجمیع نیز مانند ترکیب، رابطه‌ای بین دو کلاس ایجاد می‌کند، اما با این تفاوت که کلاس‌ها به عنوان اجزای مجزای یک کل شناخته می‌شوند و از هم مستقل هستند. به عبارت دیگر، وقتی کلاس اصلی حذف می‌شود، کلاس‌های دیگر به صورت مستقل باقی می‌مانند و از بین نمی‌روند.تجمیع نیز یک رابطه &quot;has-a&quot; است، اما بر خلاف ترکیب، شیء تجمیع شده می تواند مستقل از شی ظرف وجود داشته باشد. در این مثال، اجازه دهید یک کلاس &quot;Department&quot; را در نظر بگیریم که اشیاء &quot;Employee&quot; را جمع آوری می کند.در این مثال، کلاس &quot;Department&quot; اشیاء &quot;Employee&quot; را جمع می کند. هنگامی که شی &quot;دپارتمان&quot; از بین می رود، اشیاء &quot;کارمند&quot; بدون تاثیر باقی می مانند و می توانند به طور مستقل وجود داشته باشند.۳. ارتباط (Association): ارتباط به عنوان یک رابطه‌ی بین دو کلاس یا شیء در نظر گرفته می‌شود که می‌توانند به صورت دوطرفه یا یکطرفه باشد. ارتباط نشان‌دهنده‌ی ارسال یا دریافت اطلاعات و ارتباطات بین کلاس‌ها است.ارتباط یک رابطه ساده بین کلاس ها است که اغلب با یک رابطه &quot;uses-a&quot; یا &quot;knows-a&quot; نشان داده می شود. در این مثال، بیایید ارتباط بین کلاس های &quot;دانشجو&quot; و &quot;دوره&quot; را نشان دهیم.در این مثال، کلاس های &quot;Student&quot; و &quot;Course&quot; از طریق روش &quot;EnrollInCourse&quot; مرتبط می شوند. یک رابطه ساده &quot;uses-a&quot; بین کلاس‌های «دانشجو» و «دوره» وجود دارد، و آنها به طور محکمی با هم مرتبط نیستند.نتیجهدر کل، تفاوت میان ترکیب، تجمیع و ارتباط در مهندسی نرم‌افزار، در نحوه‌ی ارتباط و تعلق بین کلاس‌ها و اشیاء است. هر یک از این مفاهیم به صورت مختصر، ساختار و روابط میان کلاس‌ها را تعیین می‌کنند تا بتوان بهترین راه‌حل را برای پیاده‌سازی سیستم نرم‌افزاری مورد نظر انتخاب کرد.وهمینطور این مقاله را بخوانیدکانال من:t.me/dotNetSchool</description>
                <category>Yaser Fashami</category>
                <author>Yaser Fashami</author>
                <pubDate>Mon, 17 Jul 2023 09:40:02 +0330</pubDate>
            </item>
                    <item>
                <title>پیاده سازی response caching در dotNET Core</title>
                <link>https://virgool.io/TechnicalPapers/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-response-caching-%D8%AF%D8%B1-dotnet-core-matrdxghsguq</link>
                <description>این response caching تکنیکی برای ذخیره پاسخ های یک API یا برنامه وب در یک کش است تا بتوان آنها را سریعتر به درخواست های بعدی ارائه کرد.پاسخ ها در یک کش با کلیدی که به طور منحصر به فرد آنها را شناسایی می کند ذخیره می شوند و حافظه پنهان دارای اندازه محدود و سیاستی برای حذف موارد در هنگام پر شدن است.مزایای response cachingبهبود عملکرد با کاهش بار روی سرور.کاهش بار سرور، زیرا می تواند به جای ایجاد پاسخ جدید، پاسخ ذخیره شده را ارائه دهد.کاهش استفاده از پهنای باند، مقدار داده‌ای را که باید بین سرور و مشتری منتقل شود، کاهش می‌دهد.امنیت بهبود یافته است زیرا می تواند تعداد درخواست هایی را که به سرور می رسد کاهش دهد و خطر انواع خاصی از حملات را کاهش دهد.روش های پشتیبانی شدهما می توانیم کش را روی روش های زیر اعمال کنیم:GetHeadپیاده سازی در dotNet 6گام یک: پیکربندی Program.csمطمئن شوید که CORS قبل از UseResponseCaching فراخوانی شده است.گام دو: استفاده از کش در کنترلر یا متداین نمونه ای از ذخیره سازی سطح متد است، ما این خط کد را اضافه کرده ایم:[ResponseCache(Duration = 30, Location = ResponseCacheLocation.Client)]برای سطح کنترلر، همان خط را اضافه می کنیم، تفاوت این است که به جای متد، آن را روی کنترلر قرار می دهیمویژگی های ذخیره سازی توضیح داده شدهDuration = 30حداکثر مدت را در header کنترل کش در چند ثانیه تنظیم می کندLocation = ResponseCacheLocation.Clientمکانی را تعیین می کند که داده ها در آن ذخیره شوند.                                                                                               این ResponseCacheLocation دارای سه مقدار Any، Client و None استAny :هم در پروکسی ها و هم در سرویس گیرنده ذخیره می شود و هدر &quot;Cache-control&quot; را روی &quot;public&quot; تنظیم می کند.Client :فقط در سرویس گیرنده ذخیره می شود و هدر &quot;Cache-control&quot; را روی &quot;خصوصی&quot; تنظیم می کند.None :سرصفحه های &quot;Cache-control&quot; و &quot;Pragma&quot; روی &quot;no-cache&quot; تنظیم شده اند.نمونه هایی از ذخیره سازی در دنیای واقعیوب سایت خبریوب سایت های تجارت الکترونیکدر برنامه خود می توانید برای آن دسته از درخواست هایی که پاسخ آنها پس از مدتی تغییر می کند و از آن مطمئن هستید، پاسخ کش را اعمال کنید.چگونه می توان تأیید کرد که کش پیاده سازی شده است؟یک برنامه کاربردی ایجاد کنید و سپس آن را از Postman درخواست کنید و زمان را روی 60 دقیقه تنظیم کنید، متوجه خواهید شد که فقط درخواست اول به کنترلر می رسد، پس از آن حتی اگر سعی کنید درخواست به کنترلر نمی رسد.برگرفته از: Waseem .NET Newsletter https://www.coffeete.ir/yaserf2000 </description>
                <category>Yaser Fashami</category>
                <author>Yaser Fashami</author>
                <pubDate>Sun, 25 Jun 2023 11:51:09 +0330</pubDate>
            </item>
                    <item>
                <title>معماری Clean Architecture در .NET Core : یک بررسی اجمالی</title>
                <link>https://virgool.io/TechnicalPapers/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-clean-architecture-%D8%AF%D8%B1-net-core-%DB%8C%DA%A9-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%A7%D8%AC%D9%85%D8%A7%D9%84%DB%8C-zuwtu1eoxbez</link>
                <description>معماری Clean Architecture دات نت کور یک رویکرد توسعه نرم افزار مدرن است که قابلیت نگهداری، تست پذیری و انعطاف پذیری را در اولویت قرار می دهد. این چارچوبی است که منطق اصلی برنامه را از جزئیات پیاده سازی آن جدا می کند و به روز رسانی و اصلاح سیستم را در طول زمان آسان تر می کند.معماری Clean Architecture چندین مزیت را برای توسعه دهندگان فراهم می کند، از جمله جداسازی نگرانی ها (separation of concerns)، قابلیت تست و نگهداری، و انعطاف پذیری و مقیاس پذیری. این رویکرد شامل چندین مؤلفه مانند موجودیت ها، موارد استفاده، رابط ها و کنترلرها و همچنین چهار لایه شامل ارائه، برنامه کاربردی، دامنه و زیرساخت است.در این مقاله، معماری تمیز NET Core، مزایا، اجزا، لایه‌ها و نحوه پیاده‌سازی آن در NET Core را بررسی خواهیم کرد. همچنین در مورد بهترین شیوه‌ها برای استفاده حداکثری از معماری تمیز NET Core و اینکه چگونه می‌تواند به توسعه‌دهندگان کمک کند تا برنامه‌های کاربردی قوی، مقیاس‌پذیر و قابل نگهداری بسازند، صحبت خواهیم کرد.معماری پاک چیست؟معماری پاک یک رویکرد توسعه نرم افزار است که بر جداسازی نگرانی ها و استقلال اجزای برنامه تاکید دارد. این چارچوبی است که با جدا کردن منطق تجاری اصلی برنامه از جزئیات پیاده سازی آن، قابلیت نگهداری، آزمایش پذیری و انعطاف پذیری را در اولویت قرار می دهد.هدف معماری پاک ایجاد معماری است که بتواند تغییرات و تغییرات را در طول زمان بدون تأثیر بر کل سیستم تحمل کند. این شامل چندین مؤلفه، مانند موجودیت ها، موارد استفاده، رابط ها و کنترلرها، و همچنین چهار لایه، از جمله ارائه، برنامه، دامنه و زیرساخت است.معماری ناب، شیوه‌های کدنویسی خوب و اصول طراحی نرم‌افزار را ترویج می‌کند و نگهداری و مقیاس‌بندی برنامه‌ها را آسان‌تر می‌کند. در معماری NET Core، معماری تمیز به دلیل مزایای آزمایش پذیری، نگهداری و انعطاف پذیری آن به طور فزاینده ای محبوب می شود. معماری پاک NET Core برای ساخت برنامه های قوی، مقیاس پذیر و قابل نگهداری با استفاده از NET Core طراحی شده است.مزایای معماری تمیزمعماری پاک چندین مزیت برای توسعه دهندگان دارد که آن را به یک رویکرد روزافزون در شرکت توسعه ASP.NET تبدیل کرده است. برخی از این مزایا عبارتند از:جداسازی نگرانی ها (separation of concerns): معماری پاک، منطق اصلی کسب و کار برنامه را از جزئیات پیاده سازی آن جدا می کند و جداسازی نگرانی ها را ترویج می کند. این جداسازی به توسعه دهندگان اجازه می دهد تا بر روی وظایف خاص تمرکز کنند بدون اینکه بر سایر اجزای برنامه تأثیر بگذارند. این به نوبه خود نگهداری و به روز رسانی سیستم را در طول زمان آسان تر می کند.قابلیت تست و نگهداری (Testability and Maintainability): معماری پاک شیوه های کدنویسی خوب و اصول طراحی نرم افزار را ترویج می کند و آزمایش و نگهداری برنامه را آسان تر می کند. با معماری تمیز، توسعه‌دهندگان می‌توانند تست‌های خودکاری بنویسند که بر منطق اصلی کسب‌وکار برنامه تمرکز می‌کنند و اطمینان حاصل می‌کنند که طبق انتظار عمل می‌کند. این رویکرد همچنین به توسعه دهندگان اجازه می دهد تا تغییرات و اصلاحات را بدون تأثیر بر کل سیستم انجام دهند.انعطاف پذیری و مقیاس پذیری (Flexibility and Scalability): معماری تمیز به گونه ای طراحی شده است که انعطاف پذیر و مقیاس پذیر باشد. با رویکرد ماژولار آن، توسعه‌دهندگان می‌توانند ویژگی‌ها یا مؤلفه‌های جدیدی را بدون تأثیر بر پایگاه کد موجود به سیستم اضافه کنند. این رویکرد همچنین مقیاس‌بندی برنامه را در صورت نیاز آسان‌تر می‌کند و به آن اجازه می‌دهد تا کاربران، داده‌ها و ترافیک بیشتری را مدیریت کند.معماری پاک چندین مزیت را برای توسعه دهندگان فراهم می کند، از جمله جداسازی نگرانی ها، قابلیت آزمایش و نگهداری، و انعطاف پذیری و مقیاس پذیری. این مزایا آن را به یک رویکرد ایده آل برای شرکت های توسعه دهنده ASP.NET تبدیل می کند که به دنبال ساخت برنامه های کاربردی قوی، مقیاس پذیر و قابل نگهداری هستند.مولفه های معماری پاکمعماری پاک یک رویکرد توسعه نرم افزار ماژولار است که شامل چندین مؤلفه است که هر کدام نقش منحصر به فرد خود را در سیستم دارند. در این بخش، چهار مؤلفه اصلی معماری پاک و نقش‌های مربوط به آن‌ها را بررسی می‌کنیم:موجودیت ها: موجودیت ها جزء اصلی معماری پاک هستند. آنها منطق اصلی کسب و کار برنامه را نشان می دهند و مسئول کپسوله کردن وضعیت و رفتار برنامه هستند. موجودیت ها مستقل از جزئیات پیاده سازی سیستم هستند و آزمایش، نگهداری و به روز رسانی آنها را در طول زمان آسان تر می کند.موارد استفاده: موارد استفاده الزامات تجاری خاص برنامه است. آنها مجموعه ای از اقدامات یا عملکردهای مرتبط را نشان می دهند که برنامه انجام می دهد. موارد استفاده با استفاده از موجودیت ها پیاده سازی می شوند و مستقل از جزئیات پیاده سازی سیستم هستند و آزمایش، نگهداری و اصلاح آنها را آسان تر می کند.رابط ها: رابط ها راهی را برای اجزای مختلف سیستم فراهم می کنند تا با یکدیگر ارتباط برقرار کنند. آنها مرز بین منطق تجاری اصلی برنامه و جزئیات اجرای آن را نشان می دهند. رابط‌ها ماژولار و انعطاف‌پذیر بودن برنامه را تضمین می‌کنند و به مرور زمان اصلاح و به‌روزرسانی آن را آسان‌تر می‌کنند.کنترلرها: کنترلرها مسئول مدیریت ورودی و تعاملات کاربر هستند. آنها به عنوان پلی بین رابط کاربری و منطق اصلی تجاری برنامه عمل می کنند. کنترلرها با استفاده از اینترفیس ها پیاده سازی می شوند و آنها را مستقل از جزئیات پیاده سازی سیستم می کند.معماری پاک شامل موجودیت‌ها، موارد استفاده، رابط‌ها و کنترل‌کننده‌ها است که برای ایجاد یک سیستم انعطاف‌پذیر و قابل آزمایش با هم کار می‌کنند. استخدام توسعه‌دهنده NET Core که بهترین شیوه‌های معماری پاک را برای توسعه برنامه‌های مقیاس‌پذیر و قابل نگهداری می‌داند، بسیار مهم است.لایه های معماری پاکمعماری Clean Architecture یک رویکرد توسعه نرم افزار است که بر جداسازی نگرانی ها و استقلال اجزای برنامه تأکید دارد. این چارچوبی است که با جدا کردن منطق تجاری اصلی برنامه از جزئیات پیاده سازی آن، قابلیت نگهداری، آزمایش پذیری و انعطاف پذیری را در اولویت قرار می دهد. در این بخش، چهار لایه Clean Architecture با ASP.NET Core و نقش های مربوطه را بررسی می کنیم.لایه نمایشی (Presentation Layer)لایه Presentation مسئول مدیریت رابط کاربری و منطق ارائه است. این لایه ای است که با کاربر تعامل دارد و راهی برای تعامل آنها با برنامه فراهم می کند. این لایه با استفاده از ASP.NET Core پیاده سازی می شود که مجموعه ای قوی از ابزارها و کتابخانه ها را برای ایجاد رابط های کاربری فراهم می کند. لایه ارائه مسئول دریافت ورودی کاربر و نمایش خروجی است، اما مسئولیتی در قبال منطق تجاری برنامه ندارد.سطح کاربردی (Application Layer)لایه Application مسئول اجرای موارد استفاده برنامه است. به عنوان یک واسطه بین لایه های ارائه و دامنه عمل می کند و با فراخوانی متدهای لایه دامنه مناسب، مسئولیت اجرای موارد استفاده را بر عهده دارد. لایه Application همچنین مسئول هماهنگی جریان داده بین لایه های ارائه و دامنه است. این با استفاده از کلاس‌ها و رابط‌های C# پیاده‌سازی می‌شود و باید مستقل از لایه‌های ارائه و زیرساخت باشد.لایه دامنه (Domain Layer)لایه دامنه قلب معماری پاک است. این مسئول اجرای منطق تجاری برنامه است و شامل موجودیت ها و موارد استفاده است. لایه دامنه مستقل از لایه های ارائه و زیرساخت است و فقط باید دارای منطق تجاری باشد که مخصوص برنامه است. لایه دامنه با استفاده از کلاس ها و رابط های C# پیاده سازی می شود و باید پایدارترین لایه برنامه باشد.لایه زیرساخت (Infrastructure Layer)لایه زیرساخت مسئول پیاده سازی زیرساخت برنامه مانند پایگاه های داده، API های خارجی و سیستم های فایل است. این لایه ای است که با سیستم های خارجی در تعامل است و راهی را برای برنامه برای تداوم داده ها فراهم می کند. لایه زیرساخت با استفاده از کلاس ها و رابط های C# پیاده سازی می شود و باید مستقل از لایه های ارائه و دامنه باشد.معماری Clean Architecture با ASP.NET Core شامل چهار لایه است: لایه ارائه، لایه برنامه، لایه دامنه و لایه زیرساخت. این لایه ها با هم کار می کنند تا یک سیستم ماژولار و انعطاف پذیر ایجاد کنند که آزمایش، نگهداری و به روز رسانی آن در طول زمان آسان است. هنگامی که توسعه دهندگان ASP.NET را استخدام می کنید، مهم است که اطمینان حاصل شود که آنها با این رویکرد آشنا هستند تا از توسعه برنامه های کاربردی با کیفیت بالا، مقیاس پذیر و قابل نگهداری اطمینان حاصل شود.پیاده سازی Clean Architecture در NET Coreپیاده سازی Clean Architecture در NET Core می تواند برای بسیاری از توسعه دهندگان، به ویژه آنهایی که تازه وارد این فریم ورک هستند، کاری دلهره آور باشد. با این حال، با راهنمایی صحیح، این یک فرآیند ساده است که می تواند مزایای قابل توجهی از نظر قابلیت نگهداری، آزمایش پذیری و انعطاف پذیری داشته باشد. در این بخش، مراحل مربوط به پیاده سازی Clean Architecture در NET Core را بررسی خواهیم کرد.راه اندازی یک پروژه جدیداولین قدم در پیاده سازی Clean Architecture در NET Core، راه اندازی یک پروژه جدید است. این کار را می توان با استفاده از Visual Studio یا NET CLI انجام داد. هنگام راه‌اندازی پروژه، انتخاب الگوی پروژه مناسب که از معماری پاک پشتیبانی می‌کند، ضروری است، مانند الگوی ASP.NET Core Web Application با پیکربندی پروژه «API» یا «Empty».ایجاد لایه ها و کامپوننت هاپس از راه اندازی پروژه، مرحله بعدی ایجاد لایه ها و اجزای معماری پاک است. این شامل ایجاد چهار لایه است: Presentation، Application، Domain و Infrastructure و اجزای مربوطه آنها مانند موجودیت ها، موارد استفاده و رابط ها. اطمینان از جدا شدن لایه ها از یکدیگر و وابستگی بین لایه ها وارونه ضروری است.پیاده سازی تزریق وابستگیتزریق وابستگی یک جنبه حیاتی از معماری پاک در NET Core است. ضروری است که اطمینان حاصل شود که لایه ها و مؤلفه ها به طور آزاد به هم متصل شده اند و وابستگی های بین آنها با استفاده از یک ظرف تزریق وابستگی تزریق می شود (dependency injection container)، مانند ظرف داخلی ارائه شده توسط ASP.NET Core. این امکان تست آسان و انعطاف پذیری در تغییر وابستگی ها در آینده را فراهم می کند.تست اپلیکیشنتست یک جنبه حیاتی از معماری پاک در NET Core است. اطمینان از اینکه برنامه به طور کامل در همه سطوح، از جمله تست های واحد، تست های یکپارچه، و تست های انتها به انتها آزمایش شده است، ضروری است. این تضمین می کند که برنامه همانطور که انتظار می رود کار می کند و تغییرات ایجاد شده در پایگاه کد بر عملکرد برنامه تأثیر نمی گذارد.برای اجرای موفقیت آمیز Clean Architecture در NET Core، استخدام توسعه دهندگان با تجربه ASP.NET بسیار مهم است. آنها درک کاملی از اصول طراحی نرم‌افزار، بهترین شیوه‌های کدنویسی و کار با ASP.NET Core به ارمغان می‌آورند و فرآیند پیاده‌سازی روان و یک برنامه کاربردی با کیفیت بالا و قابل نگهداری را تضمین می‌کنند.بهترین روش ها برای معماری پاکمعماری Clean Architecture یک رویکرد محبوب برای توسعه نرم افزار است که بر جداسازی نگرانی ها و قابلیت نگهداری کد تأکید دارد. در حین اجرای Clean Architecture در NET Core بهترین شیوه هایی که موفقیت پروژه را تضمین می کند. در این بخش، برخی از بهترین روش‌ها برای Clean Architecture .NET Core را بررسی می‌کنیم.ساده نگه داشتن معماری: یکی از مهم ترین بهترین روش ها برای Clean Architecture در NET Core، ساده نگه داشتن معماری تا حد امکان است. این امر شامل اجتناب از پیچیدگی های غیر ضروری در لایه ها و اجزاء و پایبندی به اصول اولیه معماری پاک است.اجتناب از وابستگی بین لایه‌ها: معماری پاک بر وارونگی وابستگی‌ها (inversion of dependencies) بین لایه‌ها تأکید می‌کند، که تضمین می‌کند که لایه‌ها به‌طور سست و مستقل از یکدیگر متصل شوند. اجتناب از وابستگی بین لایه‌ها ضروری است، که می‌تواند منجر به اتصال محکم (tight coupling) شود و حفظ codebase را دشوار کند.نوشتن کد تمیز و خوانا: معماری پاک نوشتن کدهای تمیز و خوانا را ترویج می کند که درک و نگهداری آن آسان باشد. پیروی از بهترین شیوه های کدنویسی، مانند استفاده از نام متغیرها و توابع معنی دار، نظر دادن به کد (commenting the code)، و رعایت قراردادهای کدنویسی ضروری است.بازسازی منظم پایگاه کد: Refactoring یک جنبه حیاتی از Clean Architecture در NET Core است. برای حذف هرگونه افزونگی، بهبود کیفیت کد و اطمینان از اینکه کد در طول زمان قابل نگهداری است، باید به طور مرتب codebase را بازسازی کنید. این شامل شناسایی مناطقی از codebase است که نیاز به بهبود دارند و تغییرات لازم را ایجاد می کنند.نتیجهدر نتیجه، Clean Architecture یک رویکرد موثر برای توسعه نرم افزار در NET Core است که قابلیت نگهداری، تست پذیری و انعطاف پذیری را ارتقا می دهد. با اجرای Clean Architecture و پیروی از بهترین شیوه ها، توسعه دهندگان می توانند برنامه های کاربردی با کیفیت بالا، قابل نگهداری و مقیاس پذیر ایجاد کنند. https://www.coffeete.ir/yaserf2000 </description>
                <category>Yaser Fashami</category>
                <author>Yaser Fashami</author>
                <pubDate>Tue, 13 Jun 2023 09:38:22 +0330</pubDate>
            </item>
                    <item>
                <title>چرا می خواهید پایگاه داده خواندن/نوشتن جداگانه داشته باشید؟</title>
                <link>https://virgool.io/TechnicalPapers/%DA%86%D8%B1%D8%A7-%D9%85%DB%8C-%D8%AE%D9%88%D8%A7%D9%87%DB%8C%D8%AF-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D8%AE%D9%88%D8%A7%D9%86%D8%AF%D9%86%D9%86%D9%88%D8%B4%D8%AA%D9%86-%D8%AC%D8%AF%D8%A7%DA%AF%D8%A7%D9%86%D9%87-%D8%AF%D8%A7%D8%B4%D8%AA%D9%87-%D8%A8%D8%A7%D8%B4%DB%8C%D8%AF-zx8fows1ddaf</link>
                <description>در اینجا چند نکته وجود دارد که باید در نظر بگیرید.به عنوان مهندسان نرم افزار، ما همیشه به دنبال راه هایی برای بهبود برنامه ها و سیستم های خود هستیم. درست؟یکی از تکنیک هایی که اغلب نادیده گرفته می شود استفاده از پایگاه های داده خواندن و نوشتن (CQRS) جداگانه است.و این طیفی از مزایای را ارائه می دهد:- عملکرد بهینه شده (Optimized performance)- افزایش مقیاس پذیری (Increased scalability)- تحمل خطا (Fault tolerance)بیایید آنها را تجزیه کنیم.اول، این امکان را برای عملکرد بهینه پایگاه داده فراهم می کند. با جدا کردن خواندن از نوشتن، می توانید بهتر هر پایگاه داده را برای هدف خاص خود تنظیم کنید و از conflict جلوگیری کنید.مزیت دیگر افزایش مقیاس پذیری است. شما می توانید هر پایگاه داده را به طور مستقل با استفاده از پایگاه های داده خواندن و نوشتن جداگانه مقیاس کنید. این به ویژه زمانی مفید است که برنامه شما دارای ترافیک خواندنی سنگین است، اما ترافیک نوشتن کمی دارد یا برعکس.پایگاه داده خواندن و نوشتن جداگانه نیز می تواند تحمل خطا را بهبود بخشد. در صورت قطعی در پایگاه داده نوشتن، می توانید در حین بازیابی پایگاه داده نوشتن، خواندن ها را به پایگاه داده خواندنی هدایت کنید. این می تواند به کاهش زمان خرابی کمک کند و اطمینان حاصل کند که برنامه شما در دسترس کاربران شما باقی می ماند.در نهایت، داشتن پایگاه داده جداگانه می تواند کد برنامه شما را ساده کند. شما می توانید از فناوری های مختلف پایگاه داده برای پایگاه های خواندن و نوشتن استفاده کنید یا حتی از طرح های مختلف برای بهینه سازی هر کدام برای هدف خود استفاده کنید. این می تواند درک و نگهداری کد برنامه شما را آسان تر کند.چه با استفاده از فناوری پایگاه داده یکسان یا در حال اجرا در یک محیط polyglot persistence، ایده‌های اصلی همچنان پابرجا هستند.با این حال، یک نقطه ضعف بزرگ افزایش پیچیدگی عملیاتی است.اکنون باید حفظ چندین data store، همگام سازی داده ها بین آنها و حل برای eventual consistency را در نظر بگیرید.مهندسی نرم‌افزار، برای من، داشتن گزینه‌ها و توانایی در نظر گرفتن tradeoff هایی است که انجام می‌دهید و آنچه را که می‌خواهید به دست آورید یا از دست بدهید. https://www.coffeete.ir/yaserf2000 </description>
                <category>Yaser Fashami</category>
                <author>Yaser Fashami</author>
                <pubDate>Wed, 07 Jun 2023 11:35:18 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش طراحی سیستم: سه مفهوم سیستم های توزیع شده که باید بدانید</title>
                <link>https://virgool.io/TechnicalPapers/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%B3%D9%87-%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D9%87%D8%A7%DB%8C-%D8%AA%D9%88%D8%B2%DB%8C%D8%B9-%D8%B4%D8%AF%D9%87-%DA%A9%D9%87-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%A8%D8%AF%D8%A7%D9%86%DB%8C%D8%AF-vfuuw89udhbt</link>
                <description>در این پست، سه مفهوم طراحی سیستم را مورد بحث قرار خواهیم داد که می توان از آنها برای حل مشکلات طراحی مربوط به سیستم های توزیع شده استفاده کرد. از آنجایی که این مفاهیم را می توان برای انواع سیستم های توزیع شده به کار برد، در مصاحبه های طراحی سیستم بسیار مفید هستند.در اینجا لیستی از مفاهیمی است که در مورد آنها بحث خواهیم کرد:HeartbeatSplit BrainMerkle Tree1. تپش قلبزمینه:در یک محیط توزیع شده، داده ها (یا کار) بین سرورها توزیع می شود. چنین تنظیماتی به سرورها نیاز دارد که بدانند چه سرورهای دیگری بخشی از سیستم هستند تا درخواست‌ها را به طور مؤثر هدایت کنند. علاوه بر این، سرورها باید بتوانند تشخیص دهند که آیا سرورهای دیگر آماده و در حال اجرا هستند یا خیر. در یک محیط غیرمتمرکز، هر زمان که درخواستی به یک سرور می رسد، سرور باید بتواند تصمیم بگیرد که کدام سرور مسئول رسیدگی به آن درخواست است. به این ترتیب، تشخیص به موقع خرابی سرور بسیار مهم است، و سیستم را قادر می سازد تا اقدامات اصلاحی انجام دهد و داده ها (یا کار) را به سرور سالم دیگری منتقل کند و از خراب شدن بیشتر محیط جلوگیری کند.تعریف:در یک محیط توزیع شده، هر سرور به طور دوره ای یک پیام Heartbeat را به یک سرور مانیتورینگ مرکزی یا سرورهای دیگر در سیستم ارسال می کند تا نشان دهد که هنوز زنده و کار می کند.راه حل:ضربان قلب یکی از مکانیسم های تشخیص خرابی در یک سیستم توزیع شده است. اگر سرور مرکزی وجود داشته باشد، همه سرورها به صورت دوره ای پیام ضربان قلب را به آن ارسال می کنند. اگر سرور مرکزی وجود نداشته باشد، همه سرورها به طور تصادفی مجموعه ای از سرورها را انتخاب می کنند و هر چند ثانیه یک پیام ضربان قلب برای آنها ارسال می کنند. به این ترتیب، اگر برای مدتی پیام ضربان قلب از یک سرور دریافت نشود، سیستم می تواند شک کند که سرور ممکن است از کار افتاده باشد. اگر در یک بازه زمانی تنظیم‌شده ضربان قلب وجود نداشته باشد، سیستم می‌تواند به این نتیجه برسد که سرور دیگر زنده نیست و ارسال درخواست به آن را متوقف کند و شروع به کار بر روی جایگزینی آن کند.مثال:سیستمهای Google File System &#40;GFS&#41; و HDFS از Heartbeating برای برقراری ارتباط با سرورهای دیگر در سیستم برای ارائه دستورالعمل‌ها و جمع‌آوری وضعیت استفاده می‌کنند.2. تقسیم مغززمینه:در یک محیط توزیع شده با یک سرور مرکزی (یا رهبر)، اگر سرور مرکزی از بین برود، سیستم باید به سرعت یک جایگزین پیدا کند. در غیر این صورت، سیستم می تواند به سرعت خراب شود.یکی از مشکلات این است که ما واقعاً نمی‌توانیم بفهمیم که آیا رهبر برای همیشه متوقف شده است یا یک شکست متناوب مانند توقف GC یا یک اختلال موقت شبکه را تجربه کرده است. با این وجود، این cluster باید پیش برود و یک رهبر جدید انتخاب کند. اگر رهبر اصلی یک شکست متناوب(intermittent failure) داشت، اکنون خود را با یک رهبر به اصطلاح زامبی می یابیم. رهبر زامبی را می توان به عنوان یک گره رهبر تعریف کرد که توسط سیستم مرده تلقی شده و از آن زمان دوباره آنلاین شده است. گره دیگری جای آن را گرفته است، اما رهبر زامبی ها ممکن است هنوز این را ندانند. این سیستم اکنون دارای دو رهبر فعال است که می توانند دستورات متناقضی را صادر کنند. چگونه یک سیستم می تواند چنین سناریویی را شناسایی کند تا همه گره های سیستم بتوانند درخواست های رهبر قدیمی را نادیده بگیرند و خود رهبر قدیمی تشخیص دهد که دیگر رهبر نیست؟تعریف:سناریوی رایجی که در آن یک سیستم توزیع شده دارای دو یا چند رهبر فعال است، تقسیم مغز نامیده می شود.تقسیم مغز با استفاده از Generation Clock حل می شود، که به سادگی یک monotonically increasing number برای نشان دادن نسل سرور است.راه حل:هر بار که یک رهبر جدید انتخاب می شود، generation number  افزایش می یابد. این بدان معناست که اگر رهبر قدیمی شماره نسل &quot;1&quot; داشته باشد، نسل جدید &quot;2&quot; خواهد داشت. این شماره نسل در هر درخواستی که از رهبر به گره های دیگر ارسال می شود گنجانده می شود. به این ترتیب، گره ها اکنون می توانند به راحتی رهبر واقعی را با اعتماد به رهبر با بیشترین تعداد متمایز کنند. شماره تولید باید روی دیسک ثابت بماند تا پس از راه‌اندازی مجدد سرور در دسترس باقی بماند. یک راه این است که آن را با هر ورودی در گزارش Write-Ahead ذخیره کنید.مثال ها:کافکا: برای مدیریت Split-Brain (جایی که می‌توانیم چندین کارگزار کنترل‌کننده فعال داشته باشیم)، کافکا از «Epoch number» استفاده می‌کند که صرفاً یک عدد یکنواخت در حال افزایش برای نشان دادن نسل یک سرور است.در HDFS: برای اطمینان از فعال بودن,  ZooKeeper  تنها یک NameNode در هر زمان استفاده می شود. یک epoch number به عنوان بخشی از هر transaction ID نگهداری می شود تا تولید NameNode را منعکس کند.3. درختان مرکلزمینه:سیستم های توزیع شده چندین نسخه از داده ها را روی سرورهای مختلف (به نام replicas) برای تحمل خطا و در دسترس بودن بالاتر نگهداری می کنند. برای همگام نگه داشتن داده ها در بین همه سرورهای مشابه، سیستم به مکانیزمی کارآمد برای مقایسه داده ها بین دو نسخه نیاز دارد. در یک محیط توزیع‌شده، چگونه می‌توانیم به سرعت دو نسخه از طیف وسیعی از داده‌های موجود در دو کپی مختلف را با هم مقایسه کنیم و دقیقا بفهمیم که کدام قسمت‌ها متفاوت هستند؟تعریف:یک replica می تواند حاوی داده های زیادی باشد. تقسیم ساده لوحانه کل محدوده برای محاسبه checksums  برای مقایسه چندان امکان پذیر نیست. به سادگی داده های زیادی برای انتقال وجود دارد. در عوض، می‌توانیم از درختان مرکل برای مقایسه کپی‌های یک محدوده استفاده کنیم.راه حل:درخت مرکل یک درخت باینری از هش ها است که هر گره داخلی هش دو فرزندش است و هر گره برگ هش بخشی از داده های اصلی است.مقایسه درختان مرکل از نظر مفهومی ساده است:هش ریشه هر دو درخت را مقایسه کنید.اگر مساوی هستند، متوقف شوید.تکرار در فرزندان چپ و راست.در نهایت، این بدان معنی است که کپی ها دقیقاً می دانند که کدام بخش از محدوده متفاوت است، اما میزان داده های مبادله شده به حداقل می رسد. مزیت اصلی درخت مرکل این است که هر شاخه از درخت را می توان به طور مستقل بدون نیاز به گره ها برای دانلود کل درخت یا کل مجموعه داده بررسی کرد. از این رو، درختان Merkle مقدار داده‌هایی را که برای همگام‌سازی باید منتقل شوند به حداقل می‌رسانند و تعداد خواندن دیسک را کاهش می‌دهند.عیب استفاده از درختان مرکل این است که بسیاری از محدوده های کلیدی می توانند با پیوستن یا خروج یک گره تغییر کنند، در این مرحله درختان باید دوباره محاسبه شوند.مثال هابرای ضد آنتروپی و حل تعارضات در پس زمینه، Dynamo آمازون از درختان مرکل استفاده می کند.نتیجه:➡ این مفاهیم طراحی سیستم را تمرین کنید تا خود را از دیگران متمایز کنید!➡ درباره این رویکردها در &quot;مصاحبه طراحی سیستم&quot; و &quot;مصاحبه طراحی سیستم پیشرفته&quot; بیشتر بیاموزید.➡ برای راهنمایی در مورد طراحی سیستم و مصاحبه کدنویسی، من را در Linkedin دنبال کنید. https://www.coffeete.ir/yaserf2000 </description>
                <category>Yaser Fashami</category>
                <author>Yaser Fashami</author>
                <pubDate>Tue, 06 Jun 2023 17:20:37 +0330</pubDate>
            </item>
                    <item>
                <title>Load Balancer vs. Reverse Proxy vs. API Gateway</title>
                <link>https://virgool.io/TechnicalPapers/load-balancer-vs-reverse-proxy-vs-api-gateway-dssxslpdu2jw</link>
                <description>با افزایش استفاده از فناوری‌های دیجیتال توسط کسب و کارها برای عملکرد، ترافیک و داده‌های وب به طرز چشمگیری در حال رشد است. این رشد باعث بروز مسائلی درباره عملکرد سرور، قابلیت مقیاس‌پذیری، امنیت و مسائل زیرساختی دیگر می‌شود. اما چگونه همه آن را مدیریت کنیم؟فهم تفاوت‌های کلیدیتوزیع کننده بار، پروکسی معکوس و API Gateway همه فناوری‌هایی هستند که برای بهینه‌سازی و مدیریت ترافیک وب استفاده می‌شوند. با این حال، آن‌ها در عملکرد و موارد استفاده خود تفاوت دارند. فهم تفاوت‌ها بین آن‌ها برای انتخاب راه‌حل مناسب برای نیازهای زیرساختی شما بسیار حائز اهمیت است.مروری بر Load Balancerتوزیع کننده بار یک راه‌حل سخت افزاری یا نرم‌افزاری است که ترافیک ورودی را در سرورهای متعدد توزیع می‌کند تا از بارزایی روی هر سرور جلوگیری شود. این اقدام عملکرد سرور را بهبود می‌بخشد، ازمدت زمان عملکرد بیشینه اطمینان حاصل می‌کند و به راحت تر شدن در مقیاس‌پذیری زیرساخت شما کمک می‌کند.به عنوان مثال، فرض کنید که یک وب سایت تجارت الکترونیکی دارید که در طول فروش‌های تعطیلات تعداد زیادی بازدیدکننده دریافت می‌کند. در این حالت، Load Balancer می‌تواند به توزیع ترافیک ورودی در سرورهای متعدد کمک کند و از پاسخگویی و دسترسی به وب سایت برای مشتریان اطمینان حاصل کند.توزیع کننده بار همچنین می‌تواند بررسی‌های سلامتی را بر روی سرورها انجام داده و ترافیک را به سرورهای سالم هدایت کند تا از عملکرد پایدار زیرساخت شما اطمینان حاصل شود. علاوه بر این، Load Balancer می‌تواند برای توزیع ترافیک از الگوریتم‌های مختلفی مانند round-robin یا کمترین اتصال‌ها استفاده کندمروری بر Reverse Proxyپروکسی معکوس جلوی خوشه‌های سرور قرار می‌گیرد و درخواست‌ها را از مشتریان دریافت کرده و به سرور مناسب منتقل می‌کند. این می‌تواند به بهبود عملکرد، امنیت و قابلیت مدیریت کمک کند.به عنوان مثال، فرض کنید یک خوشه سرور دارید که چندین برنامه وب را میزبانی می‌کند. در این حالت، Reverse Proxyمی‌تواند به هدایت درخواست‌ها به برنامه‌های مناسب کمک کند و عملکرد را بهبود بخشیده و خطر آسیب‌پذیری‌های امنیتی را کاهش دهد.پروکسی‌های معکوس همچنین می‌توانند Load Balancer، حافظه پنهان سازی و پایان دادن SSL را انجام دهند که عملکرد و امنیت را بهبود می‌بخشد. علاوه بر این، پروکسی‌های معکوس می‌توانند برای ارائه محتوای استاتیک استفاده شوند که بار کاری روی سرورهای پشتیبان را کاهش می‌دهد.مروری بر API Gatewayیک نرم‌افزار است که سرویس‌های پشتیبانی را فراهم می‌کند و یک رابط استاندارد برای مشتریان فراهم می‌کند. این نرم‌افزار مدیریت و ادغام چندین API را ساده می‌کند و با بارکشی از سرویس‌های پشتیبان به سرور دروازه، قابلیت مقیاس‌پذیری را بهبود می‌بخشد.به عنوان مثال، فرض کنید یک معماری مبتنی بر میکروسرویس‌ دارید که از چندین API برای ارائه قابلیت‌های مختلف استفاده می‌کند. در این حالت، API Gateway می‌تواند به ساده‌سازی مدیریت و ادغام این API‌ها کمک کند و یک نقطه ورودی تکی برای مشتریان فراهم کند.دروازه‌های API همچنین می‌توانند عملیات احراز هویت، محدودیت نرخ و حافظه پنهان سازی را انجام دهند که امنیت و عملکرد را بهبود می‌بخشد. علاوه بر این، دروازه‌های API می‌توانند برای تبدیل فرمت‌های داده مانند تبدیل XML به JSON استفاده شوند تا یک رابط یکپارچه برای مشتریان فراهم کنند.در نتیجه، Load Balancer، Reverse Proxy و API Gateway همه ابزارهای ضروری برای مدیریت ترافیک وب و بهبود قابلیت مقیاس‌پذیری، عملکرد و امنیت زیرساخت هستند. فهم تفاوت‌ها بین آن‌ها برای انتخاب راه‌حل مناسب برای نیازهای شما حائز اهمیت است.عملکرد و موارد استفاده از Load Balancerتوزیع بار برای برنامه‌ها و خدمات وب مدرن یک عملکرد حیاتی است. این عمل شامل توزیع ترافیک شبکه ورودی بین چند سرور است تا عملکرد، قابلیت اعتماد و دسترسی را بهبود بخشد. Load Balancerمی‌تواند به صورت‌های مختلفی انجام شود، از جمله الگوریتم‌های IP hashing, round-robin و weighted. این الگوریتم‌ها تعیین می‌کنند که چگونه ترافیک بین سرورها بر اساس عواملی مانند ظرفیت سرور، زمان پاسخ و تاخیر شبکه توزیع شود.Load Balancerتوزیع‌کننده بارها می‌توانند از پروتکل‌های مختلفی مانند HTTP/HTTPS، TCP و یا UDP پشتیبانی کنند، که این امکان را به آنها می‌دهد تا ترافیک وب، ایمیل و پایگاه داده را مدیریت کنند. این انعطاف‌پذیری، توزیع‌کننده بارها را به یک ابزار چندمنظوره برای مدیریت انواع مختلف ترافیک شبکه تبدیل می‌کند.انواع توزیع‌کننده بارتوزیع‌کننده بارها معمولاً به دو صورت سخت‌افزاری و نرم‌افزاری موجود هستند. توزیع‌کننده بارهای سخت‌افزاری دستگاه‌های ویژه‌ای هستند که معمولاً در مراکز داده استفاده می‌شوند. آنها برای مدیریت بار بالا و ارائه ویژگی‌های پیشرفته مانند آزادسازی SSL، حافظه نهان و پایش سلامت طراحی شده‌اند. توزیع‌کننده بارهای سخت‌افزاری اغلب در محیط‌های شرکتی که عملکرد و قابلیت اطمینان اهمیت دارد، استفاده می‌شوند.توزیع‌کننده بارهای نرم‌افزاری، به طرف دیگر، می‌توانند در ابر یا روی سرورهای سنتی میزبانی شوند. آنها معمولاً هزینه موثرتری نسبت به توزیع‌کننده بارهای سخت‌افزاری دارند و انعطاف‌پذیری بیشتری در ارتباط با نصب و پیکربندی دارند. توزیع‌کننده بارهای نرم‌افزاری می‌توانند به عنوان ماشین‌های مجازی، کانتینرها یا به عنوان بخشی از زیرساخت مبتنی بر ابر، استقرار یابند.مزایای توزیع‌کننده بارتوزیع‌کننده بارها چندین مزیت برای برنامه‌ها و سرویس‌های وب ارائه می‌دهند. با توزیع ترافیک به صورت یکنواخت بین چندین سرور، توزیع‌کننده بارها زمان پاسخ را بهبود می‌بخشند و هزینه سرویس را کاهش می‌دهند. آنها همچنین توزیع ترافیک بهینه را فراهم می‌کنند که قابلیت در دسترس بودن و تجربه کاربر را بهبود می‌بخشد. توزیع‌کننده بارها می‌توانند ترافیک را تشخیص داده و آن را از سرورهایی که بار زیادی دارند یا آفلاین هستند، به سمت سرورهای سالم تغییر مسیر دهند، تضمین می‌کنند که کاربران همیشه به سرورهای سالم هدایت می‌شوند.سناریوهای متداول توزیع‌کننده بارتوزیع‌کننده بار به طور معمول برای وبسایت‌ها و برنامه‌هایی با ترافیک بالا استفاده می‌شود که نیاز به در دسترسی بالا، قابلیت اعتماد و قابلیت مقیاس‌پذیری دارند. به عنوان مثال، پلتفرم‌های تجارت الکترونیکی از توزیع‌کننده بار برای مدیریت افزایش ترافیک در فصل خرید اوج استفاده می‌کنند. شبکه‌های توزیع محتوا (CDN) از توزیع‌کننده بار برای توزیع محتوا به کاربران از سرور نزدیک استفاده می‌کنند که باعث کاهش تاخیر و بهبود عملکرد می‌شود. سرویس‌های بازی چندنفره آنلاین از توزیع‌کننده بار برای اطمینان از توزیع متساوی جلسات بازی در سرورها استفاده می‌کنند و تجربه بازی بی‌وقفه و پیوسته‌ای را برای کاربران فراهم می‌کنند.در کل، توزیع‌کننده بار یک عملکرد بحرانی برای برنامه‌ها و سرویس‌های وب مدرن است. این عملکرد راهی قابل اعتماد، قابل مقیاس و کارآمد برای مدیریت ترافیک شبکه فراهم می‌کند و اطمینان می‌یابد که کاربران تجربه سریع و بی‌وقفه‌ای داشته باشند. برای شما که یک وبسایت کوچک یا یک برنامه شرکت بزرگ را اجرا می‌کنید، توزیع‌کننده بار می‌تواند به شما کمک کند تا خدمات با کیفیت بالا را به کاربران خود ارائه دهید.عملکرد و کاربردهای پروکسی معکوسپروکسی معکوس چندین عملکرد را انجام می‌دهد، از جمله توزیع بار، حافظه‌پنهانی و احراز هویت. همچنین می‌تواند اقدامات امنیتی مانند آزادسازی SSL را انجام دهد و سرور شما را در برابر هکرها و تهدیدهای سایبری دیگر محافظت کند.پروکسی‌های معکوس در صنعت به طور گسترده استفاده می‌شوند و محبوبیت آنها تنها در حال افزایش است. آنها چندین مزیت دارند و می‌توانند در تنوعی از سناریوها استفاده شوند. در این مقاله، انواع پروکسی‌های معکوس، مزایا و برخی از سناریوهای رایج را بررسی خواهیم کرد.انواع پروکسی معکوسپروکسی‌های معکوس می‌توانند مبتنی بر سخت‌افزار یا نرم‌افزار باشند. پروکسی‌های معکوس سخت‌افزاری عملکرد و قابلیت مقیاس‌پذیری بالا را ارائه می‌دهند و معمولاً در مراکز داده یافت می‌شوند. آنها طراحی شده‌اند تا بارهای ترافیکی بالا را پشتیبانی کنند و ویژگی‌های پیشرفته‌ای مانند آزادسازی SSL، حافظه‌پنهانی محتوا و نظارت بر وضعیت سلامتی را ارائه دهند. پروکسی‌های معکوس سخت‌افزاری معمولاً در محیط‌های سازمانی استفاده می‌شوند که عملکرد و قابلیت اعتماد بسیار مهم هستند.از طرف دیگر، پروکسی‌های معکوس نرم‌افزاری می‌توانند در ابر میزبانی شوند یا در سرورهای سنتی میزبانی شوند. آنها معمولاً از لحاظ هزینه مقرون به صرفه‌تر از پروکسی‌های معکوس سخت‌افزاری هستند و درباره نصب و پیکربندی انعطاف پذیرتری ارائه می‌دهند. پروکسی‌های معکوس نرم‌افزاری می‌توانند به صورت ماشین‌های مجازی، کانتینرها یا به عنوان بخشی از زیرساخت مبتنی بر ابر راه‌اندازی شوند.مزایای پروکسی معکوسپروکسی‌های معکوس چندین مزیت برای سرویس‌ها و برنامه‌های وب فراهم می‌کنند. با توزیع ترافیک به صورت یکنواخت بین چند سرور، پروکسی‌های معکوس زمان پاسخ را بهبود می‌بخشند و هزینه سرویس را کاهش می‌دهند. آنها همچنین توزیع ترافیک کارآمد را فراهم می‌کنند که قابلیت دسترسی به وبسایت را افزایش می‌دهد. پروکسی‌های معکوس می‌توانند ترافیک را از سرورهایی که درگیر بار زیادی هستند یا آفلاین هستند، تشخیص داده و تغییر مسیر دهند، تضمین می‌کنند که کاربران همواره به سرورهای سالم هدایت می‌شوند.سناریوهای معمول پروکسی معکوسپروکسی معکوس معمولاً برای وبسایت‌ها و برنامه‌های کاربردی با ترافیک بالا که نیاز به دسترسی بالا، قابلیت اعتماد و قابلیت مقیاس‌پذیری دارند، استفاده می‌شود. به عنوان مثال، پلتفرم‌های تجارت الکترونیک از پروکسی‌های معکوس برای مدیریت ترافیک بالا در رویدادها و فروش‌های فصلی استفاده می‌کنند. سرویس‌های ویدئویی آنلاین نیز از پروکسی‌های معکوس برای توزیع بار و بهبود کیفیت و تجربه کاربر استفاده می‌کنند. همچنین، پروکسی‌های معکوس می‌توانند برای احراز هویت کاربران، جلوگیری از حملات سایبری و محافظت از سرورهای وب استفاده شوند.با استفاده از پروکسی معکوس می‌توانید تجربه کاربران را بهبود بخشید، قابلیت دسترسی و عملکرد سرویس‌های خود را ارتقا دهید و در عین حال امنیت و حفاظت سیستم خود را تقویت کنید.قابلیت‌ها و مورد استفاده‌های API Gatewayیک API Gateway یک سرور است که به عنوان نقطه ورودی برای معماری میکروسرویس عمل می‌کند. آن یک منبع واحد ورودی برای چندین میکروسرویس فراهم می‌کند، ارتباط را بین آن‌ها استانداردسازی کرده و امکانات امنیتی و نظارتی را اضافه می‌کند.انواع API Gatewayمی‌تواند نرم‌افزاری باشد یا به عنوان سرویس مبتنی بر ابر فراهم شود. API Gateway مبتنی بر نرم‌افزار در سیستم‌های پیش‌فرض نصب می‌شود در حالی که API Gateway مبتنی بر ابر بر روی یک پلتفرم ابری میزبانی می‌شود. همچنین، می‌تواند در ابرهای عمومی، خصوصی یا هیبریدی مستقر شود که به نیازها و ترجیحات سازمان وابسته است.دروازه API نرم‌افزاری کنترل و سفارشی‌سازی بیشتری را ارائه می‌دهد و به سازمان‌ها اجازه می‌دهد دروازه را بر اساس نیازهای خاص خود تنظیم کنند. همچنین عملکرد و تاخیر بهتری دارد زیرا نزدیکتر به سرویس‌های پشتیبانی است. اما، نیازمند به نگهداری و مدیریت بیشتری دارد زیرا سازمان مسئول نگهداری سخت‌افزار و نرم‌افزار است.دروازه API مبتنی بر ابر  توسعه و مدیریت آسانتری دارد، زیرا ارائه دهنده ابر مسئولیت نگهداری و به‌روزرسانی را برعهده دارد. همچنین قابلیت مقیاس‌پذیری و انعطاف‌پذیری بیشتری را فراهم می‌کند زیرا سازمان می‌تواند به راحتی نمونه‌ها را بر اساس نیازهای ترافیک اضافه یا کم کند. با این حال، ممکن است تاخیر بیشتری داشته باشد و قابلیت سفارشی‌سازی کمتری نسبت به دروازه‌های مبتنی بر نرم‌افزار داشته باشد.مزایای API Gatewayدروازه API چندین مزیت را برای سازمان‌ها ارائه می‌دهد، از جمله:ترکیب خدمات قابل تنظیم: API Gateway به سازمان‌ها امکان می‌دهد تا چندین سرویس پشتیبان را در یک API ترکیب کنند، فرایند توسعه را ساده‌تر کنند و پیچیدگی را کاهش دهند.ارتباط بین خدمات: API Gateway ارتباط بین میکروسرویس‌ها را فراهم می‌کند و ساختن برنامه‌های پیچیده را آسان‌تر می‌کند.توزیع بار: API Gateway درخواست‌های ورودی را بین چند نمونه از یک سرویس توزیع می‌کند تا مطمئن شود هیچ نمونه ای بیش از حد بار نباشد.مدیریت و ادغام: API Gateway یک مکان متمرکز برای مدیریت و نظارت بر ترافیک API فراهم می‌کند و کمک می‌کند سیستم راحت‌تر نگه داری و مشکلات را رفع کنید.قابلیت مقیاس‌پذیری: API Gateway به سازمان‌ها اجازه می‌دهد سرویس‌های خود را به صورت افقی مقیاس‌پذیر کنند و تعداد نمونه‌ها را بر اساس تغییرات حجم ترافیک تنظیم کنند.امنیت: API Gateway لایه‌ای از امنیت بین سرویس‌های پشتیبان و مشتریان خارجی فراهم می‌کند و در برابر حملات و دسترسی‌های غیرمجاز محافظت می‌کند.با استفاده از API Gateway، سازمان‌ها می‌توانند فرایند توسعه و مدیریت خدمات خود را ساده‌تر کنند، امنیت و قابلیت دسترسی را بهبود بخشند و تجربه کاربری بهتری به مشتریان خود ارائه دهند.سناریوهای متداول در استفاده از API Gatewayدروازه APIها به طور متداول در معماری میکروسرویس ها استفاده می‌شوند و خدمات پشتیبان چندگانه را به مشتریان خارجی ارائه می‌دهند. همچنین، مکان متمرکزی برای مدیریت و نظارت بر تمام ترافیک API فراهم می‌کنند.برخی از موارد استفاده رایج API Gateway عبارتند از:برنامه‌های تلفن همراه: API Gateway می‌تواند برای ارائه خدمات پشتیبان به برنامه‌های تلفن همراه استفاده شود و رابطی یکپارچه و امن برای دسترسی به داده‌ها و خدمات فراهم کند.ادغام با شرکا: API Gateway می‌تواند برای ادغام با API های شرکا استفاده شود و رابط استانداردی برای تبادل داده‌ها و خدمات فراهم کند.ادغام با سیستم های قدیمی: API Gateway می‌تواند برای ارائه سیستم های قدیمی به صورت API استفاده شود و آن‌ها را با برنامه‌ها و خدمات مدرن ادغام کند.مدیریت API: API Gateway می‌تواند برای مدیریت و نظارت بر تمام ترافیک API استفاده شود و بینشی در الگوهای استفاده و معیارهای عملکرد فراهم کند.به طور کلی، API Gatewayها ابزار قدرتمندی برای سازمان‌ها هستند که می‌خواهند معماری میکروسرویس های مقیاس‌پذیر، قابل تنظیم و امن ایجاد کنند. با فراهم کردن یک نقطه ورودی تکی برای خدمات چندگانه، فرآیند توسعه را ساده می‌کنند و عملکرد شبکه را بهبود می‌بخشند، همچنین امکانات مهم امنیتی و نظارتی را فراهم می‌کنند.انتخاب راه‌حل مناسب برای نیازهای شمادرباره مدیریت ترافیک وب، چندین فناوری موجود است که بهبود عملکرد و قابلیت مقیاس‌پذیری را تسهیل می‌کنند. باربندگان، پروکسی‌های معکوس و دروازه‌های API از این دست فناوری‌ها هستند که می‌توانند تفاوت قابل توجهی در عملکرد وبسایت یا برنامه شما ایجاد کنند.با این حال، انتخاب فناوری مناسب نیاز به ملاحظه دقیق نیازها و زیرساخت‌های کسب‌وکار شما دارد. شما باید قوت‌ها و ضعف‌های هر فناوری را ارزیابی کرده و تشخیص دهید کدام یک برای مورد کاربرد خاص شما بهترین است.مقایسه توزیع‌کننده بار، پروکسی‌های معکوس و دروازه‌های APIهر سه فناوری می‌توانند ترافیک را مدیریت کرده و عملکرد وب را بهبود بخشند، اما هر یک وظیفه خاصی دارند. درک تفاوت بین آن‌ها برای انتخاب راه‌حل مناسب بسیار ضروری است.توزیع‌کننده بار، دستگاه‌هایی هستند که ترافیک شبکه ورودی را بین چندین سرور توزیع می‌کنند. هدف این است که هیچ سروری به طور غیرمعمول با ترافیک بیش‌ازحد بار نشود که ممکن است باعث کندی در زمان پاسخ یا حتی قطعی شود. توزیع‌کننده بار برای وبسایت‌ها یا برنامه‌هایی با ترافیک بالا که نیازمند پردازش حجم بزرگی از درخواست‌ها هستند، ایده‌آل هستند.پروکسی‌های معکوس، سرورهایی هستند که بین مشتری و وبسرور قرار می‌گیرند. پروکسی‌های معکوس درخواست‌ها را از مشتریان دریافت کرده و آن‌ها را به سرور مناسب ارسال می‌کنند. پروکسی‌های معکوس همچنین محتواهایی که به طور متداول درخواست می‌شوند را در حافظه نهان ذخیره کرده و می‌توانند به بهبود عملکرد و کاهش بار سرور کمک کنند. پروکسی‌های معکوس برای وبسایت‌ها یا برنامه‌هایی که نیازمند پردازش همزمان تعداد زیادی اتصال هستند، ایده‌آل هستند.دروازه‌های API سرورهایی هستند که به عنوان واسطه‌ای بین مشتریان و سرورهای پشتیبان قرار می‌گیرند. دروازه‌های API مسئول مدیریت درخواست‌های API، اعمال سیاست‌های امنیتی و رسیدگی به احراز هویت و اجازه‌دهی هستند. دروازه‌های API برای معماری میکروسرویس‌ها مناسب هستند، جایی که نیاز به دسترسی به چندین سرویس از طریق یک API وجود دارد.عواملی که باید در انتخاب مورد توجه قرار گیرنددر هنگام انتخاب یک راه‌حل، چندین عامل باید در نظر گرفته شوند. مقیاس‌پذیری بسیار حائز اهمیت است، زیرا شما نیاز به یک راه‌حل دارید که بتواند حجم ترافیک کنونی شما را مدیریت کند و همچنین با رشد کسب‌وکارتان قابلیت مقیاس‌پذیری داشته باشد. عملکرد نیز حیاتی است، زیرا شما نیاز به یک راه‌حل دارید که بتواند حجم بالایی از درخواست‌ها را بدون کاهش سرعت پردازش کند.هزینه نیز یک عامل دیگری است که باید در نظر گرفته شود، زیرا برخی راه‌حل‌ها ممکن است گران‌تر از دیگران باشند. امنیت نیز مهم است، زیرا شما نیاز به یک راه‌حل دارید که بتواند وبسایت یا برنامه شما را در برابر تهدیدهای سایبری حفاظت کند. آسانی مدیریت نیز باید در نظر گرفته شود، زیرا شما نیاز به یک راه‌حل دارید که نصب و نگهداری آن آسان باشد.تطابق با استانداردها نیز یک عامل دیگر است که باید در نظر گرفته شود. شما نیاز به یک راه‌حل دارید که با استانداردها و شیوه‌های بهترین عمل‌های صنعتی همخوانی داشته باشد و اطمینان حاصل کند که وبسایت یا برنامه شما امن و قابل اعتماد است.راه‌حل‌ها و ترکیب‌های ترکیبیراهکارهای ترکیبی که این فناوری‌ها را ترکیب می‌کنند، مزایای اضافی ارائه می‌دهند. به عنوان مثال، استفاده از پروکسی معکوس با توزیع‌کننده بار می‌تواند امنیت و عملکرد را ارتقا دهد. به طریق مشابه، ترکیب یک دروازه API با پروکسی معکوس می‌تواند عملکرد و امنیت کلی شبکه را بهبود بخشد.به طور نهایی، انتخاب راهکار مناسب نیازمند ملاحظه دقیق نیازها و زیرساخت‌های کسب‌وکار شما است. با ارزیابی قوت‌ها و ضعف‌های هر فناوری و در نظر گرفتن عوامل ذکر شده بالا، می‌توانید یک راهکار انتخاب کنید که به بهترین نحو به وبسایت یا برنامه شما کمک کند تا به عملکرد برتری دست یابد.پیاده‌سازی و شیوه‌های بهترنکات پیاده‌سازی توزیع‌کننده باردر هنگام پیاده‌سازی یک باربندگان، مطمئن شوید که آن را در سطح شبکه پیاده‌سازی کنید و اطمینان حاصل کنید که تمام سرورها سالم و قابل پاسخ باشند.نکات پیاده‌سازی پروکسی معکوسهنگام پیاده‌سازی یک پروکسی معکوس، تنظیمات آن را برای SSL offloading و حافظه نهان (کش) پیکربندی کنید، سیاست‌های امنیتی را تنظیم کنید و لیستهای کنترل دسترسی را پیکربندی کنید.نکات پیاده‌سازی دروازه APIدر هنگام پیاده‌سازی یک دروازه API، مطمئن شوید که سرور دروازه دسترسی به تمام سرویس‌های پشتیبانی دارد و تنظیمات امنیتی مانند محدودیت نرخ، احراز هویت و اجازه‌دهی را پیکربندی کنید.نتیجه‌گیریانتخاب فناوری مناسب برای بهبود عملکرد و مدیریت وب بسیار مهم است. توزیع‌کننده بار، پروکسی‌های معکوس و دروازه‌های API همگی اجزای حیاتی در دستیابی به این هدف هستند. درک تفاوت‌های بین آن‌ها به شما کمک خواهد کرد تا راهکار مناسبی برای نیازهای خود انتخاب کنید.نکات کلیدیتوزیع‌کننده بار ترافیک را بین چندین سرور توزیع می‌کنند و عملکرد و قابلیت مقیاس‌پذیری را بهبود می‌بخشند.پروکسی‌های معکوس در جلوی خوشه‌های سرور قرار می‌گیرند و قابلیت باربندی، حافظه نهان (کش) و ویژگی‌های امنیتی را فراهم می‌کنند.دروازه‌های API به عنوان نقطه ورودی برای معماری میکروسرویس عمل می‌کنند و ارتباط را استاندارد می‌کنند و ویژگی‌های امنیتی و نظارت را اضافه می‌کنند.انتخاب فناوری مناسب نیازمند ملاحظه دقیق نیازها و زیرساخت‌های کسب‌وکار شماست. https://www.coffeete.ir/yaserf2000 </description>
                <category>Yaser Fashami</category>
                <author>Yaser Fashami</author>
                <pubDate>Mon, 29 May 2023 18:33:16 +0330</pubDate>
            </item>
            </channel>
</rss>