Pola Penyimpanan Konfigurasi Eksternal

Azure App Configuration
Azure Blob Storage

Pindahkan informasi konfigurasi dari paket penyebaran aplikasi ke lokasi terpusat. Ini dapat memberikan peluang untuk manajemen dan kontrol data konfigurasi yang lebih mudah, dan untuk berbagi data konfigurasi di seluruh aplikasi dan instans aplikasi.

Konteks dan masalah

Sebagian besar lingkungan runtime aplikasi mencakup informasi konfigurasi yang disimpan dalam file yang disebarkan dengan aplikasi. Dalam beberapa kasus, file ini dapat diedit untuk mengubah perilaku aplikasi setelah disebarkan. Namun, perubahan konfigurasi mengharuskan aplikasi disebarkan ulang, sering mengakibatkan waktu henti yang tidak dapat diterima dan overhead administratif lainnya.

File konfigurasi lokal juga membatasi konfigurasi ke satu aplikasi, tetapi kadang-kadang akan berguna untuk berbagi pengaturan konfigurasi di beberapa aplikasi. Contohnya meliputi string koneksi database, informasi tema UI, atau URL antrean dan penyimpanan yang digunakan oleh kumpulan aplikasi terkait.

Mengelola perubahan konfigurasi lokal di beberapa instans aplikasi yang sedang berjalan sangatlah sulit dilakukan, terutama dalam skenario dihosting cloud. Hal ini dapat mengakibatkan instans menggunakan pengaturan konfigurasi yang berbeda saat pembaruan sedang disebarkan.

Selain itu, pembaruan aplikasi dan komponen mungkin memerlukan perubahan pada skema konfigurasi. Banyak sistem konfigurasi tidak mendukung versi informasi konfigurasi yang berbeda.

Solusi

Simpan informasi konfigurasi dalam penyimpanan eksternal, dan sediakan antarmuka yang dapat digunakan untuk membaca dan memperbarui pengaturan konfigurasi dengan cepat dan efisien. Jenis penyimpanan eksternal bergantung pada lingkungan hosting dan runtime aplikasi. Dalam skenario yang di-hosting cloud biasanya layanan penyimpanan berbasis cloud atau layanan konfigurasi khusus, tetapi bisa berupa database yang di-hosting atau sistem kustom lainnya.

Penyimpanan dukungan yang Anda pilih untuk informasi konfigurasi harus memiliki antarmuka yang menyediakan akses yang konsisten dan mudah digunakan. Penyimpanan ini harus mengekspos informasi dalam format yang diketik dan terstruktur dengan benar. Penerapan mungkin juga perlu mengotorisasi akses pengguna untuk melindungi data konfigurasi, dan cukup fleksibel untuk memungkinkan penyimpanan beberapa versi konfigurasi (seperti pengembangan, penahapan, atau produksi, termasuk beberapa versi rilis masing-masing).

Banyak sistem konfigurasi bawaan membaca data ketika aplikasi dimulai, dan menyimpan data dalam memori untuk memberikan akses cepat dan meminimalkan dampak pada performa aplikasi. Berdasarkan jenis penyimpanan pendukung yang digunakan, dan latensi penyimpanan ini, mungkin akan sangat membantu untuk menerapkan mekanisme pembuatan cache di dalam penyimpanan konfigurasi eksternal. Untuk informasi selengkapnya, lihat Panduan Pembuatan Cache. Gambar ini mengilustrasikan ringkasan pola Penyimpanan Konfigurasi Eksternal dengan cache lokal opsional.

Ringkasan pola Penyimpanan Konfigurasi Eksternal dengan cache lokal opsional

Masalah dan pertimbangan

Pertimbangkan poin-poin berikut saat memutuskan cara menerapkan pola ini:

Pilih penyimpanan pendukung yang menawarkan performa yang dapat diterima, ketersediaan tinggi, ketahanan, dan dapat dicadangkan sebagai bagian dari pemeliharaan aplikasi dan proses administrasi. Dalam aplikasi yang di-hosting cloud, menggunakan mekanisme penyimpanan cloud atau layanan platform konfigurasi khusus biasanya merupakan pilihan yang tepat untuk memenuhi persyaratan ini.

Desain skema penyimpanan pendukung untuk memungkinkan fleksibilitas dalam jenis informasi yang dapat disimpannya. Pastikan menyediakan semua persyaratan konfigurasi seperti data yang diketik, kumpulan pengaturan, beberapa versi pengaturan, dan fitur lain yang dibutuhkan aplikasi yang menggunakannya. Skema harus mudah diperluas untuk mendukung pengaturan tambahan saat persyaratan berubah.

Pertimbangkan kemampuan fisik penyimpanan pendukung, bagaimana kaitannya dengan cara informasi konfigurasi disimpan, dan efeknya pada performa. Misalnya, menyimpan dokumen XML yang berisi informasi konfigurasi akan memerlukan antarmuka konfigurasi atau aplikasi guna mengurai dokumen untuk membaca pengaturan individual. Ini akan membuat pembaruan pengaturan lebih rumit, meskipun pembuatan cache pengaturan dapat membantu mengimbangi performa baca yang lebih lambat.

Pertimbangkan bagaimana antarmuka konfigurasi akan mengizinkan kontrol cakupan dan pewarisan pengaturan konfigurasi. Misalnya, ini mungkin persyaratan untuk cakupan pengaturan konfigurasi di organisasi, aplikasi, dan tingkat komputer. Ini mungkin perlu mendukung delegasi kontrol atas akses ke cakupan yang berbeda, dan untuk mencegah atau mengizinkan aplikasi individual untuk menimpa pengaturan.

Pastikan antarmuka konfigurasi dapat mengekspos data konfigurasi dalam format yang diperlukan seperti nilai yang diketik, kumpulan, pasangan kunci/nilai, atau tas properti.

Pertimbangkan bagaimana antarmuka penyimpanan konfigurasi akan berperilaku jika pengaturan berisi kesalahan, atau tidak ada di penyimpanan pendukung. Mungkin tepat untuk menampilkan pengaturan default dan kesalahan log. Juga pertimbangkan aspek-aspek seperti sensitivitas kasus kunci pengaturan konfigurasi atau nama, penyimpanan dan penanganan data biner, dan cara-cara yang ditangani nilai null atau kosong.

Pertimbangkan cara melindungi data konfigurasi untuk mengizinkan akses hanya ke pengguna dan aplikasi yang sesuai. Ini mungkin fitur antarmuka penyimpanan konfigurasi, tetapi juga perlu memastikan bahwa data di penyimpanan pendukung tidak dapat diakses secara langsung tanpa izin yang sesuai. Pastikan pemisahan yang ketat antara izin yang diperlukan untuk membaca dan menulis data konfigurasi. Juga pertimbangkan apakah Anda perlu mengenkripsi beberapa atau semua pengaturan konfigurasi, dan penerapannya di antarmuka penyimpanan konfigurasi.

Konfigurasi yang disimpan secara terpusat, yang mengubah perilaku aplikasi selama runtime, sangat penting dan harus disebarkan, diperbarui, dan dikelola menggunakan mekanisme yang sama dengan menyebarkan kode aplikasi. Misalnya, perubahan yang dapat memengaruhi lebih dari satu aplikasi harus dilakukan dengan menggunakan uji penuh dan pendekatan penyebaran bertahap untuk memastikan bahwa perubahan tersebut sesuai untuk semua aplikasi yang menggunakan konfigurasi ini. Jika administrator mengedit pengaturan untuk memperbarui satu aplikasi, hal itu dapat berdampak buruk pada aplikasi lain yang menggunakan pengaturan yang sama.

Jika aplikasi meng-cache informasi konfigurasi, aplikasi perlu diberi tahu jika konfigurasi berubah. Kebijakan kedaluwarsa dapat diterapkan atas data konfigurasi yang di-cache sehingga informasi ini secara otomatis di-refresh secara berkala dan setiap perubahan diambil (dan ditindaklanjuti).

Sementara meng-cache data konfigurasi dapat membantu mengatasi masalah konektivitas sementara dengan penyimpanan konfigurasi eksternal saat runtime aplikasi, ini biasanya tidak menyelesaikan masalah jika penyimpanan eksternal tidak berfungsi saat aplikasi pertama kali dimulai. Pastikan alur penyebaran aplikasi Anda dapat memberikan kumpulan nilai konfigurasi terakhir yang diketahui dalam file konfigurasi sebagai fallback jika aplikasi Anda tidak dapat mengambil nilai langsung saat dimulai.

Kapan menggunakan pola ini

Pola ini berguna untuk:

  • Pengaturan konfigurasi yang dibagikan antara beberapa aplikasi dan instans aplikasi, atau di mana konfigurasi standar harus diberlakukan di beberapa aplikasi dan instans aplikasi.

  • Sistem konfigurasi standar yang tidak mendukung semua pengaturan konfigurasi yang diperlukan, seperti menyimpan gambar atau tipe data yang kompleks.

  • Sebagai penyimpanan pelengkap untuk beberapa pengaturan aplikasi, mungkin mengizinkan aplikasi menimpa beberapa atau semua pengaturan yang disimpan secara terpusat.

  • Sebagai cara untuk menyederhanakan administrasi beberapa aplikasi, dan secara opsional untuk memantau penggunaan pengaturan konfigurasi dengan mencatat beberapa atau semua jenis akses ke penyimpanan konfigurasi.

Desain beban kerja

Arsitek harus mengevaluasi bagaimana pola Penyimpanan Konfigurasi Eksternal dapat digunakan dalam desain beban kerja mereka untuk mengatasi tujuan dan prinsip yang tercakup dalam pilar Azure Well-Architected Framework. Contohnya:

Pilar Bagaimana pola ini mendukung tujuan pilar
Keunggulan Operasional membantu memberikan kualitas beban kerja melalui proses standar dan kohesi tim. Pemisahan konfigurasi aplikasi dari kode aplikasi ini mendukung konfigurasi khusus lingkungan dan menerapkan penerapan versi ke nilai konfigurasi. Penyimpanan konfigurasi eksternal juga merupakan tempat umum untuk mengelola bendera fitur untuk memungkinkan praktik penyebaran yang aman.

- Desain OE:10 Automation
- Praktik penyebaran Brankas OE:11

Seperti halnya keputusan desain apa pun, pertimbangkan tradeoff terhadap tujuan pilar lain yang mungkin diperkenalkan dengan pola ini.

Contoh penyimpanan pendukung kustom

Dalam aplikasi yang di-hosting Microsoft Azure, pilihan yang mungkin untuk menyimpan informasi konfigurasi secara eksternal adalah dengan menggunakan Azure Storage. Pilihan ini tangguh, menawarkan performa tinggi, dan direplikasi tiga kali dengan failover otomatis untuk menawarkan ketersediaan tinggi. Penyimpanan Tabel Azure menyediakan penyimpanan kunci/nilai dengan kemampuan untuk menggunakan skema fleksibel untuk nilai. Penyimpanan Azure Blob menyediakan penyimpanan berbasis kontainer hierarkis yang dapat menyimpan semua jenis data dalam blob yang dinamai secara individual.

Saat menerapkan pola ini, Anda akan bertanggung jawab untuk mengabstraksi penyimpanan Azure Blob dan mengekspos pengaturan Anda dalam aplikasi Anda, termasuk memeriksa pembaruan saat runtime dan menangani cara meresponsnya.

Contoh berikut menunjukkan bagaimana penyimpanan konfigurasi sederhana dapat dibayangkan melalui penyimpanan Blob untuk menyimpan dan mengekspos informasi konfigurasi. Kelas BlobSettingsStore dapat mengabstraksi penyimpanan Blob untuk menyimpan informasi konfigurasi, dan menerapkan antarmuka ISettingsStore yang sederhana.

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

Antarmuka ini menentukan metode untuk mengambil pengaturan konfigurasi yang disimpan di penyimpanan konfigurasi dan menyertakan nomor versi yang dapat digunakan untuk mendeteksi apakah ada pengaturan konfigurasi yang telah dimodifikasi baru-baru ini. Kelas BlobSettingsStore dapat menggunakan properti ETag blob untuk menerapkan versi. Properti ETag diperbarui secara otomatis setiap kali blob ditulis.

Dengan desain, ilustrasi sederhana ini mengekspos semua pengaturan konfigurasi sebagai nilai string, bukan nilai yang diketik.

Kelas ExternalConfigurationManager lalu dapat memberikan pembungkus di sekitar instans BlobSettingsStore. Aplikasi dapat menggunakan kelas ini untuk mengambil informasi konfigurasi. Kelas ini mungkin menggunakan sesuatu seperti Ekstensi Reaktif Microsoft untuk menerbitkan perubahan yang dibuat pada konfigurasi saat sistem berjalan. Ini juga akan bertanggung jawab untuk menerapkan Pola Cache-Aside untuk pengaturan guna memberikan ketahanan dan performa tambahan.

Penggunaan mungkin akan terlihat seperti berikut.

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

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

Menggunakan Azure App Configuration

Saat membuat penyimpanan konfigurasi kustom mungkin diperlukan dalam beberapa situasi, banyak aplikasi dapat menggunakan Azure App Configuration. Azure App Configuration mendukung pasangan kunci-nilai yang dapat diberi namespace. Kunci diketik dan diberi versi individual. Azure App Configuration juga mendukung konfigurasi snapshot titik waktu sehingga Anda dapat dengan mudah memeriksa atau bahkan mengembalikan ke nilai konfigurasi sebelumnya. Nilai konfigurasi dapat diekspor sedemikian rupa sehingga salinan konfigurasi dapat dikirimkan dengan aplikasi Anda jika layanan tidak dapat dijangkau saat aplikasi dimulai.

Pustaka klien

Banyak dari fitur ini diekspos melalui pustaka klien yang terintegrasi dengan runtime aplikasi untuk memfasilitasi nilai pengambilan dan pembuatan cache, me-refresh nilai pada perubahan, dan bahkan menangani pemadaman sementara Layanan App Configuration.

Runtime Pustaka Klien Catatan Mulai Cepat
.NET Microsoft.Extensions.Configuration.AzureAppConfiguration Penyedia untuk Microsoft.Extensions.Configuration Mulai Cepat
ASP.NET Microsoft.Azure.AppConfiguration.AspNetCore Penyedia untuk Microsoft.Extensions.Configuration Mulai Cepat
Azure Functions di .NET Microsoft.Extensions.Configuration.AzureAppConfiguration Digunakan dengan ekstensi Fungsi Azure untuk mendukung konfigurasi di Startup.cs Mulai Cepat
.NET Framework Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration Pembuat konfigurasi untuk System.Configuration Mulai Cepat
Java Spring com.azure.spring > azure-spring-cloud-appconfiguration-config Mendukung akses Kerangka Kerja Spring melalui ConfigurationProperties Mulai Cepat
Python azure.appconfiguration Menyediakan AzureAppConfigurationClient Mulai Cepat
JavaScript/Node.js @azure/app-configuration Menyediakan AppConfigurationClient Mulai Cepat

Selain pustaka klien, ada juga tugas Azure App Configuration Sync GitHub Action dan Azure App Configuration Pull & Azure App Configuration Push Azure DevOps untuk mengintegrasikan langkah-langkah konfigurasi ke dalam proses build Anda.

Langkah berikutnya