برنامه نویسی

ورودی-9: کنترل کش، داستان کوتاه.

کش HTTP شامل ذخیره پیام های پاسخ به صورت محلی برای کاهش زمان پاسخ و مصرف پهنای باند شبکه برای درخواست های مشابه در آینده است. یک “کش” HTTP به عنوان یک فروشگاه محلی که توسط یک زیرسیستم مدیریت می شود عمل می کند که ذخیره سازی، بازیابی و حذف پیام ها را در آن کنترل می کند. این سیستم با ذخیره پاسخ‌های قابل ذخیره، عملکرد را با به حداقل رساندن نیاز به واکشی مکرر منابع از سرور مبدا (منبع: RFC 9111) و کاهش بار سرور بهینه می‌کند.

برای پیاده سازی حافظه پنهان HTTP موثر، ضروری است که هدرهای کنترل کش را در پاسخ ها لحاظ کنید. این سربرگ‌ها دستورالعمل‌هایی را به مشتریان و واسطه‌ها (یا پروکسی‌ها به عنوان مثال CDN) ارائه می‌کنند و آنها را در مورد نحوه ذخیره پاسخ‌ها راهنمایی می‌کند. در اینجا برخی از گزینه‌ها و دستورالعمل‌های مهم کنترل حافظه پنهان آورده شده است:

  1. سن: این دستورالعمل سن پاسخ را از زمان ایجاد آن نشان می دهد و به تعیین تازگی یا کهنگی کمک می کند.
  2. حداکثر سن: حداکثر زمانی را بر حسب ثانیه مشخص می کند که یک پاسخ می تواند تازه در نظر گرفته شود و کارایی ذخیره سازی را افزایش می دهد.
  3. باید تجدید اعتبار شود: تأیید مجدد یک پاسخ ذخیره شده در حافظه پنهان با سرور مبدا را قبل از استفاده الزامی می کند و اطمینان حاصل می کند که مشتریان محتوای به روز شده را دریافت می کنند.
  4. خصوصی یا عمومی: تعیین کنید که آیا یک پاسخ می تواند توسط حافظه پنهان مشتری خصوصی یا حافظه پنهان مشترک ذخیره شود، که انعطاف پذیری در استراتژی های ذخیره سازی را فراهم می کند.

به این ترتیب، دستورالعمل های مهم دیگری وجود دارد که می توان از آنها استفاده کرد. می توانیم به مستندات Mozilla Cache Control مراجعه کنیم.

علاوه بر این، استفاده از ویژگی Etag می تواند به مشتریان سیگنال دهد که یک منبع تغییر نکرده است، بنابراین با 304 اصلاح نشده برمی گردد.

سناریوهای نمونه

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

  1. جزئیات سفارش: تنظیم هدرهای کنترل کش با a max-age دستورالعمل برای جزئیات سفارش، امکان ذخیره سازی را برای بهبود عملکرد، به ویژه با توجه به تغییرات نادر در این داده ها، فراهم می کند.
  2. محتوای ثابت: اعمال هدرهای کنترل حافظه پنهان برای محتوای ثابت مانند تصاویر و شیوه نامه ها بار سرور را کاهش می دهد و زمان بارگذاری صفحه را برای بازدیدهای بعدی افزایش می دهد. پیاده‌سازی تکنیک‌های پنهان‌سازی می‌تواند مدیریت کش را برای دارایی‌های استاتیک بیشتر اصلاح کند.
  3. پاسخ های API عمومی: برای پاسخ‌های API عمومی که اغلب قابل دسترسی هستند، پیکربندی هدرهای کنترل حافظه پنهان می‌تواند بار سرور را کاهش داده و زمان پاسخ را افزایش دهد.

دلیل انتخاب این نمونه‌ها به دلیل ملاحظات امنیتی است که می‌توان به آن‌ها متمایل بود و نمی‌توان مراقب آن‌ها نبود، از این رو، اطلاعاتی را که شما، تیم یا سازمانتان به‌عنوان اطلاعات حساس نمی‌دانید، ذخیره کنید.

برخی از راه هایی که می توان این خطرات را کاهش داد استفاده از آنها است

  1. توکن های CSRF
  2. حافظه نهان ذخیره نمی شود، و اگر برخی از آیتم ها در نهایت به تنظیمات کش ختم شوند، no store و max-age فوراً آن را به عنوان قدیمی علامت گذاری می کنند.

    Cache-Control: no-store, max-age=0
    

نمونه قطعه

cache-control: max-age=3600, private, must-revalidate
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

(C#)

از آنجایی که من یک مرد csharp هستم، در یک محیط C#، از آن استفاده می کنم ICache یا ResponseCacheAttribute در سطح کنترلر به کنترل کش کمک می کند. برای Icache زیر را ببینید.

private readonly HttpClient client;
private readonly ICache cache;

public ProductCatalogClient(HttpClient client, ICache cache)
{
    client.BaseAddress = new Uri(productCatalogueBaseUrl);
    this.client = client;
    this.cache = cache;
}

private async Task<HttpResponseMessage> RequestProductFromProductCatalog(int[] productCatalogIds)
{
    var productsResource = "myProductResource";
    var response = this.cache.Get(productsResource) as HttpResponseMessage;
    if (response is null)
    {
        response = await this.client.GetAsync(productsResource);
        AddToCache(productsResource, response);
    }
    return response;
}

private void AddToCache(string resource, HttpResponseMessage response)
{
    var cacheHeader = response.Headers.FirstOrDefault(h => h.Key == "cache-control");
    if (!string.IsNullOrEmpty(cacheHeader.Key) &&
        CacheControlHeaderValue.TryParse(cacheHeader.Value.ToString(), out var cacheControl) &&
        cacheControl.MaxAge.HasValue)
    {
        this.cache.Add(resource, response, cacheControl.MaxAge.Value);
    }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خیلی ساده به نظر می رسد؟، اگر نه، در اینجا توضیحی وجود دارد.

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

برخی از راه‌های دیگری که می‌توانیم این کار را انجام دهیم این است که از Redis یا Valkey (موضوع برای یک روز دیگر) توسط سرور استفاده کنیم و پاسخ‌های ذخیره‌سازی شده را از آنجا ذخیره/برگردانیم!.

نتیجه

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

ممنون از ملاحظه تان.

پیوندها و منابع اضافی

اجتماعی

نوشته های مشابه

دکمه بازگشت به بالا