Model hosting Azure Service Fabric
Artikel ini memberikan gambaran umum tentang model hosting aplikasi yang disediakan oleh Azure Service Fabric, dan menjelaskan perbedaan antara model Proses Bersama dan Proses Eksklusif. Ini menjelaskan bagaimana aplikasi yang disebarkan terlihat pada node Service Fabric, dan hubungan antara replika (atau instans) layanan dan proses host layanan.
Sebelum melanjutkan, pastikan Anda memahami berbagai konsep dan hubungan yang dijelaskan dalam Model aplikasi dalam Service Fabric.
Catatan
Dalam artikel ini, kecuali secara eksplisit disebutkan sebagai sesuatu yang berbeda:
- Replika mengacu pada replika layanan yang stateful dan contoh layanan stateless.
- CodePackage diperlakukan setara dengan proses ServiceHost yang mendaftarkan ServiceType, dan menghosting replika layanan ServiceType tersebut.
Untuk memahami model hosting, mari kita lihat contohnya. Katakanlah kita memiliki ApplicationType 'MyAppType', yang memiliki ServiceType 'MyServiceType'. 'MyServiceType' disediakan oleh ServicePackage 'MyServicePackage', yang memiliki CodePackage 'MyCodePackage'. 'MyCodePackage' mendaftarkan ServiceType 'MyServiceType' saat dijalankan.
Katakanlah kita memiliki kluster tiga node, dan membuat aplikasi fabric:/App1 jenis 'MyAppType'. Di dalam aplikasi fabric:/App1 ini, kita membuat layanan fabric:/App1/ServiceA jenis 'MyServiceType'. Layanan ini memiliki dua partisi (misalnya, P1 dan P2), dan tiga replika per partisi. Diagram berikut menunjukkan tampilan aplikasi ini karena akhirnya disebarkan pada node.
Service Fabric mengaktifkan 'MyServicePackage', yang memulai 'MyCodePackage', yang menghosting replika dari kedua partisi. Semua node dalam kluster memiliki tampilan yang sama, karena kami memilih jumlah replika per partisi agar sama dengan jumlah node dalam kluster. Mari kita buat layanan lain, fabric:/App1/ServiceB, dalam aplikasi fabric:/App1. Layanan ini memiliki satu partisi (misalnya, P3), dan tiga replika per partisi. Diagram berikut menunjukkan tampilan baru pada node:
Service Fabric menempatkan replika baru untuk partisi P3 dari layanan fabric:/App1/ServiceB dalam aktivasi yang sudah ada pada 'MyServicePackage'. Sekarang. mari kita buat aplikasi lain fabric:/App2 jenis 'MyAppType'. Di dalam fabric:/App2, buat layanan fabric:/App2/ServiceA. Layanan ini memiliki dua partisi (P4 dan P5) dan tiga replika per partisi. Diagram berikut menunjukkan tampilan node baru:
Service Fabric mengaktifkan salinan baru 'MyServicePackage', yang memulai salinan baru 'MyCodePackage'. Replika dari kedua partisi layanan fabric:/App2/ServiceA (P4 dan P5) ditempatkan dalam salinan baru 'MyCodePackage' ini.
Model Proses Bersama
Bagian sebelumnya menjelaskan model hosting default yang disediakan oleh Service Fabric, yang disebut sebagai model Proses Bersama. Dalam model ini, untuk aplikasi yang ditentukan, hanya satu salinan ServicePackage tertentu yang diaktifkan pada node (yang memulai semua CodePackages yang terkandung di dalamnya). Semua replika dari semua layanan ServiceType tertentu ditempatkan di CodePackage yang mendaftarkan ServiceType tersebut. Dengan kata lain, semua replika dari semua layanan pada node ServiceType terentu memiliki proses yang sama.
Model Proses Eksklusif
Model hosting lain yang disediakan oleh Service Fabric adalah model Proses Eksklusif. Dalam model ini, pada node tertentu, setiap replika berada dalam proses khususnya sendiri. Service Fabric mengaktifkan salinan baru ServicePackage (yang memulai semua CodePackages yang terkandung di dalamnya). Replika ditempatkan di CodePackage yang mendaftarkan ServiceType layanan tempat replika berada.
Jika menggunakan Service Fabric versi 5.6 atau yang lebih baru, Anda dapat memilih model Proses Eksklusif pada saat membuat layanan (dengan menggunakan PowerShell, REST, atau FabricClient). Tentukan ServicePackageActivationMode sebagai 'ExclusiveProcess'.
PS C:\>New-ServiceFabricService -ApplicationName "fabric:/App1" -ServiceName "fabric:/App1/ServiceA" -ServiceTypeName "MyServiceType" -Stateless -PartitionSchemeSingleton -InstanceCount -1 -ServicePackageActivationMode "ExclusiveProcess"
var serviceDescription = new StatelessServiceDescription
{
ApplicationName = new Uri("fabric:/App1"),
ServiceName = new Uri("fabric:/App1/ServiceA"),
ServiceTypeName = "MyServiceType",
PartitionSchemeDescription = new SingletonPartitionSchemeDescription(),
InstanceCount = -1,
ServicePackageActivationMode = ServicePackageActivationMode.ExclusiveProcess
};
var fabricClient = new FabricClient(clusterEndpoints);
await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);
Jika memiliki layanan default dalam manifes aplikasi, Anda dapat memilih model Proses Eksklusif dengan menentukan atribut ServicePackageActivationMode:
<DefaultServices>
<Service Name="MyService" ServicePackageActivationMode="ExclusiveProcess">
<StatelessService ServiceTypeName="MyServiceType" InstanceCount="1">
<SingletonPartition/>
</StatelessService>
</Service>
</DefaultServices>
Sekarang, mari kita buat layanan lain, fabric:/App1/ServiceC, dalam aplikasi fabric:/App1. Layanan ini memiliki dua partisi (misalnya, P6 dan P7), dan tiga replika per partisi. Anda mengatur ServicePackageActivationMode ke 'ExclusiveProcess'. Diagram berikut menunjukkan tampilan baru pada node:
Seperti yang Anda lihat, Service Fabric mengaktifkan dua salinan baru 'MyServicePackage' (satu untuk setiap replika dari partisi P6 dan P7). Service Fabric menempatkan setiap replika dalam salinan khusus CodePackage. Ketika Anda menggunakan model Proses Eksklusif untuk aplikasi tertentu, beberapa salinan ServicePackage tertentu dapat aktif pada node. Dalam contoh sebelumnya, tiga salinan 'MyServicePackage' aktif untuk fabric:/App1. Masing-masing salinan aktif 'MyServicePackage' ini memiliki ServicePackageActivationId yang terkait dengannya. ID ini mengidentifikasi bahwa salinan berada di aplikasi fabric:/App1.
Ketika Anda hanya menggunakan model Proses Bersama untuk aplikasi, hanya ada satu salinan aktif ServicePackage pada node. ServicePackageActivationId untuk aktivasi ServicePackage ini adalah string kosong. Ini adalah kasus, misalnya, dengan fabric:/App2.
Catatan
Model hosting Proses Bersama sesuai dengan ServicePackageActivationMode yang setara dengan SharedProcess. Ini adalah model hosting default, dan ServicePackageActivationMode tidak perlu ditentukan pada saat membuat layanan.
Model hosting Proses Bersama sesuai dengan ServicePackageActivationMode yang setara dengan ExclusiveProcess. Untuk menggunakan pengaturan ini, Anda harus menentukannya secara eksplisit pada saat membuat layanan.
Untuk melihat model hosting layanan, kueri deskripsi layanan, dan lihat nilai ServicePackageActivationMode.
Bekerja dengan paket layanan yang disebarkan
Salinan aktif ServicePackage pada node disebut sebagai paket layanan yang disebarkan. Ketika Anda menggunakan model Proses Eksklusif untuk membuat layanan bagi aplikasi tertentu, mungkin ada beberapa paket layanan yang digunakan untuk ServicePackage yang sama. Jika melakukan operasi khusus untuk paket layanan yang disebarkan, Anda harus menyediakan ServicePackageActivationId untuk mengidentifikasi paket layanan tertentu yang disebarkan. Misalnya, berikan ID jika Anda melaporkan kesehatan paket layanan yang disebarkan atau memulai ulang paket kode pada paket layanan yang disebarkan.
Anda dapat mengetahui ServicePackageActivationId dari paket layanan yang disebarkan dengan mengkueri daftar paket layanan yang disebarkan pada node. Ketika Anda mengkueri jenis layanan yang disebarkan, replika yang disebarkan, dan paket kode yang disebarkan pada node, hasil kueri juga berisi ServicePackageActivationId dari paket layanan induk yang disebarkan.
Catatan
Di bawah model hosting Proses Bersama, pada node tertentu dan untuk aplikasi tertentu, hanya satu salinan ServicePackage yang diaktifkan. Ini memiliki ServicePackageActivationId yang setara dengan string kosong, dan tidak perlu ditentukan saat melakukan operasi yang terkait dengan paket layanan yang disebarkan.
Di bawah model hosting Proses Eksklusif, pada node tertentu dan untuk aplikasi tertentu, satu atau lebih salinan ServicePackage dapat aktif. Setiap aktivasi memiliki ServicePackageActivationId tidak kosong, yang ditentukan saat melakukan operasi yang terkait dengan paket layanan yang disebarkan.
Jika ServicePackageActivationId dihilangkan, defaultnya adalah string kosong. Jika terdapat paket layanan yang disebarkan yang diaktifkan di bawah model Proses Bersama, operasi akan dilakukan di dalamnya. Jika tidak, operasi akan gagal.
Jangan mengkueri sekali dan men-cache ServicePackageActivationId. ID dihasilkan secara dinamis, dan dapat berubah karena berbagai alasan. Sebelum melakukan operasi yang memerlukan ServicePackageActivationId, Anda harus terlebih dahulu meminta daftar paket layanan yang disebarkan pada node. Kemudian, gunakan ServicePackageActivationId dari hasil kueri untuk melakukan operasi asli.
Aplikasi yang dapat dieksekusi tamu dan kontainer
Service Fabric memperlakukan aplikasi yang dapat dieksekusi tamu dan kontainer sebagai layanan stateless mandiri. Tidak ada runtime Service Fabric di ServiceHost (proses atau kontainer). Karena layanan ini mandiri, jumlah replika per ServiceHost tidak berlaku untuk layanan ini. Konfigurasi yang paling umum digunakan dengan layanan ini adalah partisi tunggal, dengan InstanceCount setara dengan -1 (satu salinan kode layanan yang berjalan pada setiap node kluster).
ServicePackageActivationMode default untuk layanan ini adalah SharedProcess, dalam hal ini Service Fabric hanya mengaktifkan satu salinan ServicePackage pada node untuk aplikasi tertentu. Ini berarti hanya satu salinan kode layanan yang akan menjalankan node. Jika Anda ingin beberapa salinan kode layanan berjalan pada node, tentukan ServicePackageActivationMode sebagai ExclusiveProcess saat membuat layanan. Misalnya, Anda dapat melakukan ini saat membuat beberapa layanan (Service1 hingga ServiceN) serviceType (yang ditentukan dalam ServiceManifest), atau saat layanan Anda dipartisi banyak.
Mengubah model hosting dari layanan yang sudah ada
Saat ini, Anda tidak dapat mengubah model hosting dari layanan yang sudah ada dari Proses Bersama ke Proses Eksklusif (atau sebaliknya).
Memilih antara beberapa model hosting
Anda harus mengevaluasi model hosting mana yang paling sesuai dengan kebutuhan Anda. Model Proses Bersama menggunakan sumber daya sistem operasi dengan lebih baik, karena lebih sedikit proses yang diperlukan, dan beberapa replika dalam proses yang sama dapat menggunakan port yang sama. Namun, jika salah satu replika memiliki kesalahan sehingga perlu menghentikan host layanan, itu akan berdampak pada semua replika lain dalam proses yang sama.
Model Proses Eksklusif memberikan isolasi yang lebih baik, dengan setiap replika dalam prosesnya sendiri. Jika salah satu replika memiliki kesalahan, itu tidak akan berdampak pada replika lain. Model ini berguna untuk kasus ketik berbagi port tidak didukung oleh protokol komunikasi. Ini memfasilitasi kemampuan untuk menerapkan tata kelola sumber daya pada tingkat replika. Namun, Proses Eksklusif menggunakan lebih banyak sumber daya sistem operasi, karena memerlukan satu proses untuk setiap replika pada node.
Pertimbangan model Proses Eksklusif dan model aplikasi
Untuk sebagian besar aplikasi, Anda dapat memodelkan aplikasi Anda di Service Fabric dengan menyimpan satu ServiceType per ServicePackage.
Untuk kasus tertentu, Service Fabric juga memungkinkan lebih dari satu ServiceType per ServicePackage (dan satu CodePackage dapat mendaftarkan lebih dari satu ServiceType). Berikut ini adalah beberapa skenario ketika konfigurasi ini dapat berguna:
- Anda ingin mengoptimalkan pemanfaatan sumber daya dengan lebih sedikit proses dan memiliki kepadatan replika yang lebih tinggi per proses.
- Replika dari berbagai ServiceTypes perlu berbagi beberapa data umum yang memiliki biaya memori atau inisialisasi yang tinggi.
- Anda memiliki penawaran layanan gratis, dan ingin membatasi pemanfaatan sumber daya dengan menempatkan semua replika layanan dalam proses yang sama.
Model hosting Proses Eksklusif tidak koheren dengan model aplikasi yang memiliki beberapa ServiceTypes per ServicePackage. Ini karena beberapa ServiceTypes per ServicePackage dirancang untuk mencapai berbagi sumber daya yang lebih tinggi di antara replika, dan memungkinkan kepadatan replika yang lebih tinggi per proses. Model Proses Eksklusif dirancang untuk mencapai hasil yang berbeda.
Pertimbangkan kasus beberapa ServiceTypes per ServicePackage, dengan CodePackage yang berbeda mendaftarkan setiap ServiceType. Katakanlah kita memiliki ServicePackage 'MultiTypeServicePackage', yang memiliki dua CodePackages:
- 'MyCodePackageA', yang mendaftarkan ServiceType 'MyServiceTypeA'.
- 'MyCodePackageA', yang mendaftarkan ServiceType 'MyServiceTypeA'.
Sekarang, katakanlah kita membuat aplikasi, fabric:/SpecialApp. Di dalam fabric:/SpecialApp, kita membuat dua layanan berikut dengan model Proses Eksklusif:
- Layanan fabric:/SpecialApp/ServiceA jenis 'MyServiceTypeA', dengan dua partisi (misalnya, P1 dan P2), dan tiga replika per partisi.
- Layanan fabric:/SpecialApp/ServiceB jenis 'MyServiceTypeB', dengan dua partisi (P3 dan P4), dan tiga replika per partisi.
Pada node tertentu, kedua layanan memiliki masing-masing dua replika. Karena kami menggunakan model Proses Eksklusif untuk membuat layanan, Service Fabric mengaktifkan salinan baru 'MyServicePackage' untuk setiap replika. Setiap aktivasi 'MultiTypeServicePackage' memulai salinan 'MyCodePackageA' dan 'MyCodePackageB'. Namun, hanya salah satu dari 'MyCodePackageA' atau 'MyCodePackageB' yang menghosting replika tempat 'MultiTypeServicePackage' diaktifkan. Diagram berikut menunjukkan tampilan node baru:
Dalam aktivasi 'MultiTypeServicePackage' untuk replika partisi P1 layanan fabric:/SpecialApp/ServiceA, 'MyCodePackageA' menghosting replika. 'MyCodePackageB' sedang berjalan. Dalam aktivasi 'MultiTypeServicePackage' untuk replika partisi P3 dari layanan fabric:/SpecialApp/ServiceA, 'MyCodePackageA' menghosting replika. 'MyCodePackageA' sedang berjalan. Oleh karena itu, semakin besar jumlah CodePackages (mendaftarkan ServiceTypes yang berbeda) per ServicePackage, semakin tinggi penggunaan sumber daya yang berlebihan.
Namun, jika kita membuat layanan fabric:/SpecialApp/ServiceA dan fabric:/SpecialApp/ServiceB dengan model Proses Bersama, Service Fabric hanya mengaktifkan satu salinan 'MultiTypeServicePackage' untuk aplikasi fabric:/SpecialApp. 'MyCodePackageA' menghosting semua replika untuk layanan fabric:/SpecialApp/ServiceA. 'MyCodePackageB' menghosting semua replika untuk layanan fabric:/SpecialApp/ServiceB. Diagram berikut menampilkan tampilan node dalam pengaturan ini:
Dalam contoh sebelumnya, Anda mungkin berpikir bahwa jika 'MyCodePackageA' mendaftarkan 'MyServiceTypeA' dan 'MyServiceTypeB', dan tidak ada 'MyCodePackageB', artinya tidak ada CodePackage berlebihan yang berjalan. Meskipun ini benar, model aplikasi ini tidak sejalan dengan model hosting Proses Eksklusif. Jika tujuannya adalah menempatkan setiap replika dalam proses khususnya sendiri, Anda tidak perlu mendaftarkan kedua ServiceTypes dari CodePackage yang sama. Sebaliknya, Anda cukup menempatkan setiap ServiceType di ServicePackage sendiri.
Layanan Andal dan Subproses forking Aktor
Service Fabric tidak mendukung layanan andal dan kemudian subproses forking aktor andal. Contoh mengapa ini tidak didukung adalah karena CodePackageActivationContext tidak dapat digunakan untuk mendaftarkan subproses yang tidak didukung, dan token pembatalan hanya dikirim ke proses terdaftar; sehingga menyebabkan segala macam masalah, seperti kegagalan peningkatan, ketika subproses tidak ditutup setelah proses induk menerima token pembatalan.
Langkah berikutnya
Ke paket aplikasi dan siapkan untuk diterapkan.
Sebarkan dan hapus aplikasi. Artikel ini menjelaskan cara menggunakan PowerShell untuk mengelola instans aplikasi.