Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Afinitas adalah kendali yang disediakan terutama untuk membantu memudahkan transisi aplikasi monolitik yang lebih besar ke cloud dan lingkup layanan mikro. Ini juga digunakan sebagai pengoptimalan untuk meningkatkan performa layanan, meskipun melakukannya dapat memiliki efek samping.
Katakanlah 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 umum. Anda mulai dengan mengangkat seluruh aplikasi ke lingkungan, mengemasnya, dan memastikannya berjalan dengan lancar. Kemudian Anda mulai memecahnya menjadi berbagai layanan 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:
- Beberapa komponen X dalam aplikasi monolitik memiliki dependensi yang tidak terdokumentasi pada komponen Y, dan Anda hanya mengubah komponen tersebut menjadi layanan terpisah. Karena layanan ini sekarang berjalan pada node yang berbeda di kluster, layanan tersebut rusak.
- Komponen ini berkomunikasi melalui (pipa bernama lokal, memori bersama, file pada disk) dan harus dapat menulis ke sumber daya lokal bersama demi alasan kinerja saat ini. Dependensi keras itu akan dihapus nanti, mungkin.
- Semuanya baik-baik saja, tetapi ternyata kedua komponen ini sebenarnya sensitif terhadap obrolan/performa. Ketika mereka memindahkannya ke layanan terpisah, performa keseluruhan aplikasi menurun drastis atau latensi meningkat. Akibatnya, aplikasi keseluruhan tidak memenuhi harapan.
Dalam kasus ini, kita tidak ingin kehilangan pekerjaan pemfaktoran ulang kita, dan tidak ingin kembali ke monolit. Kondisi terakhir bahkan mungkin diinginkan sebagai pengoptimalan biasa. Namun, sampai kita dapat mendesain ulang komponen untuk bekerja secara alami sebagai layanan (atau sampai kita dapat menyelesaikan ekspektasi performa dengan cara lain) kita akan membutuhkan rasa lokalitas.
Apa yang harus dilakukan? Nah, Anda bisa mencoba menyalakan afinitas.
Cara mengonfigurasi afinitas
Untuk menyiapkan afinitas, Anda menentukan hubungan afinitas antara dua layanan yang berbeda. Anda dapat menganggap afinitas sebagai "menghubungkan" satu layanan ke layanan lainnya dan mengatakan "Layanan ini hanya dapat berjalan di lokasi yang sama dengan layanan tersebut." Terkadang kami menyebut afinitas sebagai hubungan induk/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);
Nota
Layanan yang berkaitan dengan anak-anak hanya dapat berpartisipasi dalam satu hubungan kedekatan. Jika Anda ingin anak dihubungkan ke dua layanan induk sekaligus, Anda dapat memilih beberapa opsi:
- Mengubah hubungan (agar parentService1 dan parentService2 mengarah ke layanan anak saat ini), atau
- Menunjuk salah satu orang tua sebagai hub secara konvensional dan menghubungkan semua layanan ke layanan tersebut.
Perilaku penempatan yang dihasilkan dalam kluster harus sama.
Opsi afinitas yang berbeda
Afinitas diwakili melalui salah satu dari beberapa skema korelasi, dan memiliki dua mode yang berbeda. Mode afinitas yang paling umum adalah apa yang kita sebut NonAlignedAffinity. Di NonAlignedAffinity, replika atau instans layanan yang berbeda ditempatkan pada simpul yang sama. Mode lainnya adalah AlignedAffinity. Afinitas Selaras hanya berguna pada layanan stateful. Mengonfigurasi dua layanan bernilai tetap agar memiliki afinitas yang selaras memastikan bahwa layanan utama tersebut ditempatkan pada node yang sama satu dengan yang 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. Dalam NonAlignedAffinity, replika yang berbeda dari dua layanan stateful akan berjalan pada node yang sama, tetapi replica primernya dapat berakhir pada node yang berbeda.
Keadaan diinginkan dengan upaya terbaik
Hubungan afinitas adalah upaya terbaik. Ini tidak memberikan jaminan yang sama tentang kolokasi atau keandalan seperti apabila dijalankan dalam proses eksekusi yang sama. Layanan dalam hubungan afinitas pada dasarnya adalah entitas yang berbeda yang dapat gagal dan dipindahkan secara independen. Hubungan afinitas juga dapat putus, meskipun jeda ini bersifat sementara. Misalnya, batasan kapasitas dapat berarti bahwa hanya beberapa objek layanan dalam hubungan afinitas yang dapat cocok pada simpul tertentu. Dalam kasus ini meskipun ada hubungan afinitas di tempat, itu tidak dapat diberlakukan karena kendala lain. Jika dimungkinkan untuk melakukannya, pelanggaran secara otomatis diperbaik nanti.
Rantai vs. bintang
Saat ini Cluster Resource Manager tidak dapat memodelkan rantai hubungan afinitas. Artinya, layanan yang merupakan anak dalam satu hubungan afinitas tidak dapat menjadi orang tua 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, anak paling bawah akan diasuh oleh induk anak pertama sebagai gantinya. Tergantung pada pengaturan layanan Anda, Anda mungkin harus melakukan ini beberapa kali. Jika tidak ada layanan induk yang sifatnya natural, Anda mungkin harus membuat satu yang berfungsi sebagai penampung. Tergantung pada kebutuhan Anda, Anda mungkin juga ingin memeriksa Grup Aplikasi.
Hal lain yang perlu diperhatikan tentang hubungan afinitas saat ini adalah bahwa hubungan tersebut terarah secara default. Ini berarti bahwa aturan afinitas hanya memberlakukan bahwa anak ditempatkan dengan induk. Ini tidak memastikan bahwa orangtua berada bersama anak. Oleh karena itu, jika ada pelanggaran afinitas dan untuk memperbaiki pelanggaran tersebut tidak memungkinkan untuk memindahkan anak ke node induk karena suatu alasan, maka -- bahkan jika memindahkan induk ke node anak akan memperbaiki pelanggaran itu -- induk tidak akan dipindahkan ke node anak. Mengatur konfigurasi MoveParentToFixAffinityViolation ke true akan menghapus arah. Penting juga untuk dicatat bahwa hubungan afinitas tidak dapat sempurna atau langsung diberlakukan karena layanan yang berbeda memiliki siklus hidup yang berbeda dan dapat gagal dan bergerak secara independen. Misalnya, katakanlah node induk tiba-tiba beralih ke node lain karena mengalami kerusakan. Cluster Resource Manager dan Failover Manager menangani failover terlebih dahulu, karena menjaga layanan tetap aktif, konsisten, dan tersedia adalah prioritasnya. Setelah failover selesai, hubungan kedekatan terganggu, namun Pengelola Sumber Daya Kluster menganggap semuanya baik-baik saja sampai menyadari bahwa anak tidak berada bersama induknya. Pemeriksaan semacam ini dilakukan secara berkala. Informasi selengkapnya tentang bagaimana Cluster Resource Manager mengevaluasi batasan tersedia dalam artikel ini, dan yang ini berbicara 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 mana induk dipartisi. Layanan induk yang dipartisi mungkin akan didukung pada akhirnya, tetapi saat ini tidak diizinkan.
Langkah selanjutnya
- Untuk informasi selengkapnya tentang mengonfigurasi layanan, Pelajari tentang mengonfigurasi Layanan
- Untuk membatasi layanan ke sekumpulan kecil komputer atau menggabungkan beban layanan, gunakan Grup Aplikasi