Skip to content

Latest commit

 

History

History
181 lines (122 loc) · 25.4 KB

External Configuration Store pattern.md

File metadata and controls

181 lines (122 loc) · 25.4 KB

External Configuration Store pattern

اطلاعات مرتبط با پیکربندی یا configuration برنامه را از deployment package به یک مکان متمرکز منتقل کنید. این کار می‌تواند فرصت‌هایی را برای مدیریت و کنترل آسان‌تر داده‌های پیکربندی و برای اشتراک‌گذاری داده‌های پیکربندی در بین برنامه‌ها و نمونه‌های (instance) برنامه فراهم کند.

   

زمینه و مشکل

    اکثر محیط‌های زمان اجرا برنامه شامل اطلاعات پیکربندی است که در فایل‌های مستقر شده با برنامه نگهداری می‌شود. در برخی موارد، امکان ویرایش این فایل‌ها برای تغییر رفتار برنامه پس از استقرار(deployed) آن وجود دارد. بااین‌حال، تغییرات در پیکربندی نیاز به استقرار مجدد برنامه (redeployed) دارد که اغلب منجر به خرابی غیرقابل‌قبول و سایر هزینه‌های اجرایی (administrative overhead) می‌شود.

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

  مدیریت تغییرات در پیکربندی محلی در چندین نمونه در حال اجرا برنامه به‌ویژه در سناریوی میزبانی ابری(cloud-hosted)، چالش‌برانگیز است. این می‌تواند منجر به مواردی شود که از تنظیمات پیکربندی مختلف در حین اجرای به‌روزرسانی استفاده می‌کنند.

  علاوه بر این، به‌روزرسانی برنامه‌ها و اجزای مختلف آن ممکن است به تغییراتی در طرح‌واره‌های پیکربندی(configuration schemas) نیاز داشته باشد. بسیاری از سیستم‌های پیکربندی از نسخه‌‌های مختلف اطلاعات پیکربندی پشتیبانی نمی‌کنند.

 

راه‌حل:

    اطلاعات configuration را در ذخیره‌ساز خارجی یا external storage ذخیره کنید و رابطی(interface) ارائه دهید که می‌تواند برای خواندن سریع و کارآمد تنظیمات پیکربندی و به‌روزرسانی آن استفاده شود. حالت external storage بستگی به محیط میزبانی(hosting) و زمان اجرا برنامه دارد. در یک سناریوی میزبانی ابری، معمولاً یک سرویس cloud-based storage یا سرویس dedicated configuration است، اما می‌تواند یک پایگاه‌داده میزبانی شده یا سایر سیستم‌های سفارشی باشد.

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

       

بسیاری از پیکربندی‌‌های سیستمی که به‌صورت پیش‌فرض هستند، هنگام راه‌اندازی برنامه، داده‌ها را می‌خوانند و داده‌ها را در حافظه cache می‌کنند تا دسترسی سریع را فراهم کنند و تأثیر آن بر عملکرد برنامه به حداقل برسد. بسته به نوع ذخیره پشتیبان مورداستفاده و تأخیر زمانی بین این ذخیره‌سازها، ممکن است پیاده‌سازی مکانیزم cache در حافظه به‌صورت external configuration مناسب باشد. برای اطلاعات بیشتر، Caching Guidance را ببینید. شکل یک نمای کلی از External Configuration Store pattern با حافظه optional local cache را نشان می‌دهد

      external-configuration-store-overview شکل ۱

 

مسائل و ملاحظات:

هنگام تصمیم‌گیری در مورد نحوه اجرای این الگو به نکات زیر توجه کنید:

  یک ذخیره پشتیبان (backing store) را انتخاب کنید که کارایی قابل‌قبول، دسترسی(availability) بالا و استحکام (robustness) بالا را ارائه می‌دهد و می‌تواند به‌عنوان بخشی از فرایند maintenance و administration برنامه از آن به‌صورت دقیق backup تهیه کند. در یک برنامه cloud-hosted، استفاده از مکانیزم ذخیره‌سازی ابری یا سرویس پلتفرم پیکربندی اختصاصی (dedicated configuration) معمولاً انتخاب خوبی برای برآورده‌کردن این الزامات است.

  باید schema backing store را طوری طراحی کنید تا از امکان انعطاف‌پذیری (flexibility) در انواع اطلاعاتی را که می‌تواند نگه دارد را داشته باشد. همین‌طور اطمینان کامل حاصل کنید تمام الزامات پیکربندی مانند typed dataها ، مجموعه‌ای از تنظیمات، نسخه‌‌های چندگانه تنظیمات و هر ویژگی دیگری را که برنامه‌‌هایی که از آن استفاده می‌کنند و به آن نیاز دارد را فراهم می‌کند. schema باید به‌راحتی قابلیت توسعه برای پشتیبانی از تنظیمات اضافی با تغییر نیازمندی‌ها را داشته باشد.

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

  در نظر بگیرید که چگونه رابط پیکربندی (configuration interface) اجازه کنترل محدوده و ارث‌بری(inheritance) بر تنظیمات پیکربندی را می‌دهد. به‌عنوان‌مثال، ممکن است نیاز باشد که تنظیمات پیکربندی در سطح سازمان، برنامه و دستگاه انجام شود. ممکن است نیاز باشد که از تفویض(delegation) کنترل دسترسی به حوزه‌‌های مختلف پشتیبانی کند و از تغییر تنظیمات به اپلیکیشن‌‌های خاصی جلوگیری کند یا اجازه استفاده از آن را دهد.

    اطمینان حاصل کنید که رابط پیکربندی می‌تواند داده‌‌های پیکربندی را در قالب‌‌های موردنیاز مانند مقادیر تایپ‌شده، مجموعه‌ها، جفت‌‌های key/valu یا property bags را نمایش دهد (در واقع property bags نوعی hashTable است که خصوصیت‌های کلید و مقدار آن را ذخیره می‌کند).

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

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

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

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

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

 

چه زمانی از این الگو استفاده کنیم؟

  این الگو برای موارد زیر مفید است:

  تنظیمات پیکربندی که بین چندین برنامه و نمونه برنامه به اشتراک گذاشته شده است یا در جایی که یک پیکربندی استاندارد باید در چندین برنامه و نمونه برنامه اعمال شود.

  *‏ یک سیستم پیکربندی استاندارد که از همه تنظیمات پیکربندی موردنیاز، مانند ذخیره تصاویر یا انواع داده‌‌های پیچیده، پشتیبانی نمی‌کند.

  *‏ به‌عنوان یک ذخیره‌ساز مکمل برای برخی از تنظیمات برنامه‌ها، شاید به برنامه‌ها اجازه می‌دهد تا برخی یا همه تنظیمات ذخیره‌شده در مرکز را لغو کنند.

  *‏ به‌عنوان راهی برای ساده‌سازی مدیریت چندین برنامه و به‌صورت اختیاری برای نظارت بر استفاده از تنظیمات پیکربندی با ثبت برخی یا همه انواع دسترسی به ذخیره‌ساز پیکربندی.

 

مثالی از ذخیره پشتیبان

در یک برنامه میزبانی شده Microsoft Azure، یک انتخاب ممکن برای ذخیره اطلاعات پیکربندی به‌صورت خارجی، استفاده از Azure Storage است. این ابزار بسیار انعطاف‌پذیر است، عملکرد بالایی ارائه می‌دهد و سه بار با failover خودکار تکرار می‌شود (Failover یک اصطلاح شبکه‌ای است که در اصل در زمان‌‌های ازکارافتادگی سرویس را بیان می‌کند) تا دردسترس‌بودن بالا به طرز مناسبی ارائه شود. ذخیره‌سازی Azure Table یک ذخیره key/value باقابلیت استفاده از طرح‌‌های انعطاف‌پذیر برای مقادیر فراهم می‌کند. ذخیره‌سازی Azure Blob یک ذخیره‌ساز سلسله‌مراتبی و مبتنی بر کانتینر را فراهم می‌کند که می‌تواند هر نوع داده‌ای را در حباب‌هایی با نام جداگانه نگهداری کند (به طور خلاصه، حباب یا Blob در رایانش ابری یک روش ذخیره‌سازی داده‌هاست که به‌صورت باینری و مقیاس‌پذیر عمل می‌کند و برای ذخیره‌سازی انواع مختلف داده‌ها مورداستفاده قرار می‌گیرد..

  هنگام پیاده‌سازی این الگو، شما مسئول حذف فضای ذخیره‌سازی Azure Blob و نمایش تنظیمات خود در برنامه‌‌هایتان هستید، از جمله بررسی به‌روزرسانی‌ها در زمان اجرا و رسیدگی به نحوه پاسخگویی به آن‌ها.

  مثال زیر نشان می‌دهد که چگونه می‌توان یک ذخیره‌سازی پیکربندی ساده را روی ذخیره‌سازی Blob برای ذخیره و دسترسی به اطلاعات پیکربندی پیش‌بینی کرد. یک کلاس BlobSettingsStore می‌تواند ذخیره‌سازی Blob را برای نگهداری اطلاعات پیکربندی انتزاعی کند و یک رابط ساده ISettingsStore را پیاده‌سازی کند. (نکته: ذخیره‌ساز حباب یا Blob Storage یک سرویس ذخیره‌سازی ابری است که به کاربران امکان ذخیره‌سازی و مدیریت داده‌‌های بزرگ را ارائه می‌دهد. این سرویس به‌صورت مقیاس‌پذیر عمل می‌کند و می‌تواند باتوجه‌به نیازهای کاربران تنظیم شود.

 

public interface ISettingsStore
{
    Task<ETag> GetVersionAsync();
    Task<Dictionary<string, string>> FindAllAsync();
}

این اینترفیس روش‌‌هایی را برای بازیابی تنظیمات پیکربندی موجود در ذخیره‌ساز پیکربندی تعریف می‌کند و شامل یک شماره ورژن است که می‌تواند برای تشخیص اینکه آیا تنظیمات پیکربندی اخیراً اصلاح شده است یا خیر استفاده شود. یک کلاس BlobSettingsStore می‌تواند از ویژگی ETag blob برای پیاده‌سازی نسخه‌سازی استفاده کند. ویژگی ETag هر بار که یک blob نوشته می‌شود به طور خودکار به‌روز می‌شود.

 

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

سپس یک کلاس ExternalConfigurationManager می‌تواند پوششی در اطراف یک نمونه BlobSettingsStore ارائه دهد. یک برنامه می‌تواند از این کلاس برای بازیابی اطلاعات پیکربندی استفاده کند. این کلاس ممکن است از چیزی مانند Microsoft Reactive Extensions استفاده کند تا تغییرات ایجاد شده در پیکربندی را در حین اجرای سیستم منتشر کند. همچنین مسئول پیاده‌سازی الگوی Cache-Aside برای تنظیماتی است که انعطاف‌پذیری و کارایی بیشتری را ارائه می‌کند.

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

static void Main(string[] args)
{
    // Start monitoring configuration changes.
    ExternalConfiguration.Instance.StartMonitor();

    // Get a setting.
    var setting = ExternalConfiguration.Instance.GetAppSetting("someSettingKey");}

Using Azure App Configuration

درحالی‌که ایجاد یک ذخیره‌گاه پیکربندی سفارشی ممکن است در برخی شرایط ضروری باشد، بسیاری از برنامه‌ها می‌توانند در عوض از پیکربندی برنامه Azure استفاده کنند. پیکربندی برنامه Azure از جفت‌‌های key-value پشتیبانی می‌کند که می‌توانند فضای نامی داشته باشند. کلیدها تایپ می‌شوند و به‌صورت جداگانه ویرایش می‌شوند. Azure App Configuration همچنین از point-in-time snapshots پشتیبانی می‌کند تا بتوانید به‌راحتی مقادیر پیکربندی قبلی را بررسی کنید یا حتی به آن برگردید. مقادیر پیکربندی را می‌توان به‌گونه‌ای صادر کرد که در صورت عدم دسترسی به سرویس هنگام شروع برنامه، یک کپی از پیکربندی می‌تواند با برنامه شما ارسال شود.

   

کتابخانه‌‌های سمت کاربر

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

 

Runtime Client Library Notes Quickstart
.NET Microsoft.Extensions.Configuration.AzureAppConfiguration Provider for Microsoft.Extensions.Configuration Quickstart
ASP.NET Microsoft.Azure.AppConfiguration.AspNetCore Provider for Microsoft.Extensions.Configuration Quickstart
Azure Functions in .NET Microsoft.Extensions.Configuration.AzureAppConfiguration Used with Azure Function extensions to support configuration in Startup.cs Quickstart
.NET Framework Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration Configuration builder for System.Configuration Quickstart
Java Spring com.azure.spring > azure-spring-cloud-appconfiguration-config Supports Spring Framework access via ConfigurationProperties Quickstart
Python azure.appconfiguration Provides an AzureAppConfigurationClient Quickstart
JavaScript/Node.js @azure/app-configuration Provides an AppConfigurationClient Quickstart

علاوه بر کتابخانه‌‌های سرویس گیرنده،  Azure App Configuration Sync و  Azure App Configuration Pull و Azure App Configuration Push نیز برای ادغام مراحل پیکربندی در فرآیند ساخت شما وجود دارد.

مراحل بعدی

  • نمونه‌‌های پیکربندی  App Configuration Samples را ببینید
  •  با نحوه ادغام پیکربندی برنامه integrate Azure با Kubernetes آشنا شوید
  • یاد بگیرید که چگونه پیکربندی برنامه Azure نیز می‌تواند کمک کند (manage feature flags)