Mengonfigurasi dan menggunakan afinitas layanan dalam Service Fabric

Afinitas adalah kontrol yang disediakan terutama untuk membantu meringankan transisi aplikasi monolitik yang lebih besar ke dunia cloud dan microservices. Ini juga digunakan sebagai optimasi untuk meningkatkan kinerja layanan, meskipun melakukannya dapat memiliki efek samping.

Misalnya Anda membawa aplikasi yang lebih besar, atau aplikasi yang tidak dirancang dengan mempertimbangkan layanan mikro, ke Service Fabric (atau lingkungan terdistribusi apa pun). Jenis transisi ini adalah umum. Anda mulai dengan mengangkat seluruh aplikasi ke lingkungan, mengemasnya, dan memastikannya berjalan dengan lancar. Kemudian Anda mulai memecahnya menjadi layanan berbeda yang lebih kecil yang semuanya berbicara satu sama lain.

Akhirnya Anda mungkin menemukan bahwa aplikasi mengalami beberapa masalah. Masalah biasanya termasuk dalam salah satu kategori ini:

  1. Beberapa komponen X di aplikasi monolitik memiliki dependensi tak terdokumentasi pada komponen Y, dan Anda baru saja mengubah komponen tersebut menjadi layanan terpisah. Karena layanan ini sekarang berjalan pada node yang berbeda di klaster, mereka rusak.
  2. Komponen-komponen ini berkomunikasi melalui (pipa bernama lokal | memori bersama | file pada disk) dan mereka benar-benar harus dapat menulis ke sumber daya lokal bersama untuk alasan kinerja saat ini. Ketergantungan berat itu akan dihapus nanti, mungkin.
  3. Semuanya baik-baik saja, tetapi ternyata kedua komponen ini sebenarnya aktif/sensitif kinerja. Ketika mereka memindahkannya ke layanan terpisah, kinerja aplikasi secara keseluruhan menurun atau latensi meningkat. Akibatnya, aplikasi keseluruhan tidak memenuhi harapan.

Dalam kasus ini, kita tidak ingin kehilangan pekerjaan refactoring kita, dan tidak ingin kembali ke monolit. Kondisi terakhir bahkan mungkin diinginkan sebagai optimasi biasa. Namun, sampai kami dapat mendesain ulang komponen untuk bekerja secara alami sebagai layanan (atau sampai kita dapat menyelesaikan harapan kinerja dengan cara lain) kami akan membutuhkan beberapa rasa lokalitas.

Apa yang harus dilakukan Nah, Anda bisa mencoba menyalakan afinitas.

Cara mengonfigurasi afinitas

Untuk mengatur afinitas, Anda menentukan hubungan afinitas antara dua layanan yang berbeda. Anda dapat menganggap afinitas sebagai "pengarahan" satu layanan di layanan lain dan mengatakan "Layanan ini hanya dapat berjalan di mana layanan itu sedang berjalan." Terkadang kami menyebut afinitas sebagai hubungan orang tua/anak (di mana Anda mengarahkan anak ke induk). Afinitas memastikan bahwa replika atau instans dari satu layanan ditempatkan pada node yang sama dengan yang ada di layanan lain.

ServiceCorrelationDescription affinityDescription = new ServiceCorrelationDescription();
affinityDescription.Scheme = ServiceCorrelationScheme.Affinity;
affinityDescription.ServiceName = new Uri("fabric:/otherApplication/parentService");
serviceDescription.Correlations.Add(affinityDescription);
await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);

Catatan

Layanan anak hanya dapat berpartisipasi dalam satu hubungan afinitas. Jika Anda ingin anak tersebut terikat dengan dua layanan induk sekaligus, Anda memiliki beberapa opsi:

  • Membalik hubungan (memiliki titik parentService1 dan parentService2 pada layanan anak saat ini), atau
  • Menunjuk salah satu induk sebagai penghubung menurut konvensi dan minta semua titik layanan di layanan itu.

Perilaku penempatan yang dihasilkan dalam klaster harus sama.

Opsi afinitas yang berbeda

Afinitas direpresentasikan melalui salah satu dari beberapa skema korelasi, dan memiliki dua mode berbeda. Mode afinitas yang paling umum adalah apa yang kita sebut NonAlignedAffinity. Dalam NonAlignedAffinity, replika atau instans dari berbagai layanan ditempatkan pada node yang sama. Mode lainnya adalah AlignedAffinity. Aligned Affinity hanya berguna dengan layanan stateful. Mengonfigurasi dua layanan stateful agar memiliki afinitas yang selaras memastikan bahwa layanan utama tersebut ditempatkan pada node yang sama satu sama lain. Ini juga menyebabkan setiap pasangan sekunder untuk layanan tersebut ditempatkan pada node yang sama. Dimungkinkan juga (meskipun kurang umum) untuk mengonfigurasi NonAlignedAffinity untuk layanan stateful. Untuk NonAlignedAffinity, replika yang berbeda dari dua layanan stateful akan berjalan pada node yang sama, tetapi primari mereka bisa berakhir pada node yang berbeda.

Mode Afinitas dan Efeknya

Upaya terbaik yang diinginkan

Hubungan afinitas adalah upaya terbaik. Ini tidak memberikan jaminan kolokasi atau keandalan yang sama seperti yang dijalankan dalam proses yang dapat dieksekusi yang sama. Layanan dalam hubungan afinitas pada dasarnya adalah entitas berbeda yang dapat gagal dan dipindahkan secara independen. Hubungan afinitas juga bisa putus, meskipun pemutusan ini bersifat sementara. Misalnya, batasan kapasitas dapat berarti bahwa hanya beberapa objek layanan dalam hubungan afinitas yang dapat ditampung pada node tertentu. Dalam kasus ini, meskipun ada hubungan afinitas, itu tidak dapat diterapkan karena batasan lainnya. Jika memungkinkan, pelanggaran secara otomatis diperbaiki nanti.

Rantai vs. bintang

Saat ini, Cluster Resource Manager tidak dapat membuat model rantai hubungan afinitas. Artinya, layanan yang merupakan anak dalam satu hubungan afinitas tidak boleh menjadi induk dalam hubungan afinitas lain. Jika Anda ingin memodelkan jenis hubungan ini, Anda secara efektif harus memodelkannya sebagai bintang, bukan rantai. Untuk berpindah dari rantai ke bintang, induk anak pertama akan menjadi induk bagi anak terakhir sebagai gantinya. Tergantung pada pengaturan layanan Anda, Anda mungkin harus melakukannya beberapa kali. Jika tidak ada layanan induk alami, Anda mungkin harus membuat layanan yang berfungsi sebagai tempat penampung. Tergantung pada kebutuhan Anda, Anda mungkin juga ingin melihat ke dalam Grup Aplikasi.

Rantai vs. Bintang dalam Konteks Hubungan Afinitas

Hal lain yang perlu diperhatikan tentang hubungan afinitas saat ini adalah bahwa hubungan tersebut terarah secara default. Ini berarti bahwa aturan afinitas hanya berlaku bahwa anak ditempatkan dengan induk. Itu tidak memastikan bahwa induk terletak bersama anak. Oleh karena itu, jika ada pelanggaran afinitas dan untuk memperbaiki pelanggaran karena alasan tertentu, tidak mungkin untuk memindahkan anak ke node induk, maka - bahkan jika memindahkan induk ke node anak akan memperbaiki pelanggaran - induk tidak akan dipindahkan ke node anak. Mengatur konfigurasi MoveParentToFixAffinityViolation ke true akan menghapus arah. Penting juga untuk diperhatikan bahwa hubungan afinitas tidak dapat sempurna atau langsung diberlakukan karena layanan yang berbeda memiliki siklus proses yang berbeda dan dapat gagal serta bergerak secara independen. Misalnya, induk tiba-tiba gagal ke node lain karena macet. Cluster Resource Manager dan Failover Manager menangani failover terlebih dahulu, karena menjaga layanan tetap aktif, konsisten, dan tersedia adalah prioritasnya. Setelah failover selesai, hubungan afinitas diputus, tetapi Cluster Resource Manager menganggap semuanya baik-baik saja sampai mengetahui bahwa anak tersebut tidak berada dengan induknya. Pemeriksaan semacam ini dilakukan secara berkala. Informasi selengkapnya tentang bagaimana Cluster Resource Manager mengevaluasi batasan tersedia di artikel ini, dan artikel ini membahas lebih lanjut tentang cara mengonfigurasi irama di mana batasan ini dievaluasi.

Dukungan partisi

Hal terakhir yang perlu diperhatikan tentang afinitas adalah bahwa hubungan afinitas tidak didukung di tempat induk dipartisi. Layanan induk yang dipartisi mungkin pada akhirnya akan didukung, tetapi hari ini tidak diizinkan.

Langkah berikutnya