Tingkasan siklus hidpu Reliable Services
Saat Anda berpikir tentang siklus hidup Azure Service Fabric Reliable Services, dasar-dasar siklus hidup adalah yang paling penting. Secara umum, siklus hidup meliputi yang berikut:
- Selama pengaktifan:
- Layanan dibangun.
- Layanan memiliki kesempatan untuk membangun dan menampilkan nol atau beberapa listener.
- Setiap listener yang ditampilkan akan dibuka, sehingga memungkinkan komunikasi dengan layanan.
- Metode RunAsync layanan dipanggil, yang memungkinkan layanan untuk melakukan tugas berjangka panjang atau pekerjaan latar belakang.
- Selama penonaktifan:
- Token pembatalan yang diteruskan ke RunAsync dibatalkan, dan listener akan ditutup.
- Setelah listener ditutup, objek layanan tersebut akan dihancurkan.
Terdapat detail seputar urutan yang tepat dari peristiwa ini. Urutan peristiwa dapat sedikit berubah tergantung pada apakah Reliable Service bersifat stateless atau stateful. Selain itu, untuk layanan stateful, kami harus mengatasi skenario penggantian Primer. Selama urutan ini, peran Primer ditransfer ke replika lain (atau kembali) tanpa mengharuskan layanan dimatikan. Akhirnya, kami harus memikirkan kondisi kesalahan atau kegagalan.
Pengaktifan layanan stateless
Siklus hidup layanan stateless cukup mudah. Berikut urutan peristiwanya:
- Layanan ini dibangun.
StatelessService.CreateServiceInstanceListeners()
dipanggil dan setiap listener yang ditampilkan akan dibuka.ICommunicationListener.OpenAsync()
dipanggil pada setiap listener.- Kemudian, secara paralel, dua hal terjadi -
- Metode
StatelessService.RunAsync()
layanan dipanggil. - Jika ada, metode
StatelessService.OnOpenAsync()
layanan itu sendiri dipanggil. Ini adalah pengambil alihan yang tidak biasa, tetapi tersedia. Tugas inisialisasi layanan yang diperpanjang dapat dimulai saat ini.
- Metode
Penonaktifan layanan stateless
Untuk mematikan layanan stateless, pola yang sama akan diikuti, cukup secara terbalik:
- Setiap listener terbuka apa pun akan ditutup.
ICommunicationListener.CloseAsync()
dipanggil pada setiap listener. - Token pembatalan yang diteruskan ke
RunAsync()
akan dibatalkan. Pemeriksaan propertiIsCancellationRequested
token pembatalan mengembalikan nilai true, dan jika dipanggil, metodeThrowIfCancellationRequested
token akan menampilkanOperationCanceledException
. Service Fabric menungguRunAsync()
selesai. - Setelah
RunAsync()
selesai, metodeStatelessService.OnCloseAsync()
layanan akan dipanggil, jika ada. OnCloseAsync akan dipanggil saat instans layanan stateless akan ditutup dengan elegan. Hal ini dapat terjadi ketika kode layanan sedang ditingkatkan, instans layanan sedang dipindahkan karena penyeimbangan beban, atau kesalahan sementara terdeteksi. Mengambil alihStatelessService.OnCloseAsync()
jarang terjadi, tetapi dapat digunakan untuk menutup sumber daya dengan aman, menghentikan pemrosesan latar belakang, menyelesaikan penyimpanan status eksternal, atau menutup koneksi yang ada. - Setelah
StatelessService.OnCloseAsync()
selesai, objek layanan dihancurkan.
Pengaktifan layanan stateful
Layanan stateful memiliki pola yang mirip dengan layanan stateless, dengan beberapa perubahan. Untuk memulai layanan stateful, urutan acara adalah sebagai berikut:
Layanan ini dibangun.
StatefulServiceBase.OnOpenAsync()
dipanggil. Panggilan ini tidak umumnya diambil alih dalam layanan.StatefulServiceBase.CreateServiceReplicaListeners()
dipanggil.- Jika layanan adalah layanan Utama, semua listener yang ditampilkan akan dibuka.
ICommunicationListener.OpenAsync()
dipanggil pada setiap listener. - Jika layanan adalah layanan Sekunder, hanya listener tersebut yang ditandai sebagai
ListenOnSecondary = true
yang dibuka. Memiliki listener yang terbuka pada layanan sekunder bukan hal yang umum.
- Jika layanan adalah layanan Utama, semua listener yang ditampilkan akan dibuka.
Kemudian secara paralel:
- Jika layanan saat ini menjadi Primer, metode
StatefulServiceBase.RunAsync()
layanan akan dipanggil. StatefulServiceBase.OnChangeRoleAsync()
dipanggil. Panggilan ini tidak umumnya diambil alih dalam layanan.
Catatan
Untuk replika sekunder baru,
StatefulServiceBase.OnChangeRoleAsync()
dipanggil dua kali. Sekali setelah langkah 2, saat menjadi Sekunder Diam dan sekali lagi selama langkah 4, saat menjadi Sekunder Aktif. Untuk informasi selengkapnya tentang siklus hidup instans dan replika, baca Siklus Hidup Instans dan Replika.- Jika layanan saat ini menjadi Primer, metode
Penonaktifan layanan stateful
Seperti layanan stateless, peristiwa siklus hidup selama penonaktifan sama dengan selama pengaktifan, tetapi dibalik. Saat layanan stateful sedang dinonaktifkan, peristiwa berikut ini terjadi:
Setiap listener terbuka apa pun akan ditutup.
ICommunicationListener.CloseAsync()
dipanggil pada setiap listener.metode
StatefulServiceBase.OnCloseAsync()
dipanggil. Panggilan ini adalah pengambil-alihan yang tidak biasa, namun tersedia.Token pembatalan yang diteruskan ke
RunAsync()
akan dibatalkan. Pemeriksaan propertiIsCancellationRequested
token pembatalan mengembalikan nilai true, dan jika dipanggil, metodeThrowIfCancellationRequested
token akan menampilkanOperationCanceledException
. Service Fabric menungguRunAsync()
selesai.Catatan
Kebutuhan untuk menunggu RunAsync selesai hanya diperlukan jika replika ini adalah replika Utama.
Setelah
StatefulServiceBase.RunAsync()
selesai, objek layanan dihancurkan.
Penggantian Primer layanan stateful
Sementara layanan stateful berjalan, hanya replika Utama dari layanan stateful yang membuka listener komunikasinya dan metode RunAsync akan disebut. Replika sekunder dibangun, tetapi tidak ada panggilan lebih lanjut. Saat layanan stateful berjalan, replika yang saat ini menjadi Primer dapat berubah sebagai akibat dari kesalahan atau pengoptimalan keseimbangan kluster. Apa maksudnya dalam hal peristiwa siklus hidup yang dapat dilihat replika? Perilaku yang dilihat replika stateful tergantung pada apakah itu replika yang diturunkan atau dipromosikan selama penggantian.
Untuk Primer yang diturunkan
Untuk replika Utama yang diturunkan, Service Fabric membutuhkan replika ini untuk menghentikan pemrosesan pesan dan berhenti dari pekerjaan latar belakang apa pun yang dilakukannya. Akibatnya, langkah ini terlihat seperti yang dilakukan ketika layanan dimatikan. Salah satu perbedaannya adalah bahwa layanan tidak dihancurkan atau ditutup, karena tetap sebagai Sekunder. API berikut dipanggil:
- Setiap listener terbuka apa pun akan ditutup.
ICommunicationListener.CloseAsync()
dipanggil pada setiap listener. - Token pembatalan yang diteruskan ke
RunAsync()
akan dibatalkan. Pemeriksaan propertiIsCancellationRequested
token pembatalan mengembalikan nilai true, dan jika dipanggil, metodeThrowIfCancellationRequested
token akan menampilkanOperationCanceledException
. Service Fabric menungguRunAsync()
selesai. - Listener yang ditandai sebagai ListenOnSecondary = true terbuka.
StatefulServiceBase.OnChangeRoleAsync()
layanan dipanggil. Panggilan ini tidak umumnya diambil alih dalam layanan.
Untuk Sekunder yang dipromosikan
Demikian pula, Service Fabric membutuhkan replika Sekunder yang dipromosikan untuk mulai mendengarkan pesan melalui sambungan, dan untuk memulai tugas latar belakang apa pun yang perlu diselesaikan. Akibatnya, proses ini terlihat seperti ketika layanan dibuat, kecuali bahwa replika tersebut sudah ada. API berikut dipanggil:
ICommunicationListener.CloseAsync()
dipanggil untuk semua listener yang terbuka (ditandai dengan ListenOnSecondary = true).- Semua listener komunikasi terbuka.
ICommunicationListener.OpenAsync()
dipanggil pada setiap listener. - Kemudian, secara paralel:
- Metode
StatefulServiceBase.RunAsync()
layanan dipanggil. StatefulServiceBase.OnChangeRoleAsync()
dipanggil. Panggilan ini tidak umumnya diambil alih dalam layanan.
- Metode
Catatan
CreateServiceReplicaListeners
hanya dipanggil sekali dan tidak dipanggil lagi selama proses promosi atau demosi replika; instans ServiceReplicaListener
yang sama digunakan tetapi instans ICommunicationListener
baru dibuat (dengan memanggil metode ServiceReplicaListener.CreateCommunicationListener
) setelah instans sebelumnya ditutup.
Masalah umum selama penonaktifan layanan stateful dan penurunan Primer
Service Fabric mengubah status Primer layanan stateful karena berbagai alasan. Alasan paling umum adalah penyeimbangan ulang kluster dan peningkatan aplikasi. Selama operasi ini (serta selama penonaktifan layanan normal, seperti yang Anda lihat apakah layanan dihapus), penting bahwa layanan mematuhi CancellationToken
.
Layanan yang tidak menangani pembatalan dengan bersih dapat mengalami beberapa masalah. Operasi ini lambat karena Service Fabric menunggu layanan berhenti tanpa paksaan. Ini pada akhirnya dapat menyebabkan peningkatan yang gagal dengan waktu habis dan penggulungan balik. Kegagalan untuk menghormati token pembatalan juga dapat menyebabkan kluster yang tidak seimbang. Kluster menjadi tidak seimbang karena simpul sering digunakan, tetapi layanan tidak dapat diseimbangkan kembali karena terlalu lama untuk memindahkannya ke tempat lain.
Karena layanannya stateful, kemungkinan besar layanan menggunakan Reliable Collections. Dalam Service Fabric, ketika Primer diturunkan, salah satu hal pertama yang terjadi adalah bahwa akses tulis ke status yang mendasarinya dicabut. Hal ini menyebabkan set masalah kedua yang mungkin memengaruhi siklus hidup layanan. Kumpulan menampilkan pengecualian berdasarkan waktu dan apakah replika sedang dipindahkan atau dimatikan. Pengecualian ini harus ditangani dengan benar. Pengecualian yang ditampilkan oleh Service Fabric termasuk dalam kategori permanen (FabricException
) dan sementara (FabricTransientException
). Pengecualian permanen harus dicatat dan dilemparkan sementara pengecualian sementara dapat dicoba berdasarkan beberapa logika coba lagi.
Menangani pengecualian yang berasal dari penggunaan ReliableCollections
bersamaan dengan peristiwa siklus hidup layanan adalah bagian penting dari pengujian dan validasi Reliable Service. Sebaiknya selalu jalankan layanan Anda di bawah beban saat melakukan peningkatan dan pengujian kekacauan sebelum menyebarkan ke produksi. Langkah-langkah dasar ini membantu memastikan bahwa layanan Anda diimplementasikan dengan benar dan menangani peristiwa siklus hidup dengan benar.
Catatan tentang siklus hidup layanan
- Baik metode
RunAsync()
maupun panggilanCreateServiceReplicaListeners/CreateServiceInstanceListeners
bersifat opsional. Layanan dapat memiliki salah satunya, keduanya, atau tidak keduanya. Misalnya, jika layanan melakukan semua pekerjaannya sebagai tanggapan terhadap panggilan pengguna, tidak perlu menerapkanRunAsync()
. Hanya listener komunikasi dan kode terkaitnya yang diperlukan. Demikian pula, membuat dan mengembalikan listener komunikasi bersifat opsional, karena layanan hanya dapat memiliki pekerjaan latar belakang yang harus dilakukan, dan jadi hanya perlu menerapkanRunAsync()
. - Layanan ini berlaku untuk menyelesaikan dengan
RunAsync()
secara lancar dan kembali. Penyelesaian bukan kondisi kegagalan. PenyelesaianRunAsync()
menunjukkan bahwa pekerjaan latar belakang layanan telah selesai. Untuk reliable services stateful,RunAsync()
dipanggil lagi jika replika diturunkan dari Primer ke Sekunder, lalu dipromosikan kembali ke Primer. - Jika layanan keluar dari
RunAsync()
dengan menampilkan beberapa pengecualian yang tidak terduga, hal ini akan menghasilkan kegagalan. Objek layanan dimatikan, dan kesalahan kesehatan dilaporkan. - Meskipun tidak ada batas waktu untuk kembali dari metode ini, Anda segera kehilangan kemampuan untuk menulis ke Reliable Collections, sehingga tidak dapat menyelesaikan pekerjaan nyata apa pun. Sebaiknya kembali secepat mungkin setelah menerima permintaan pembatalan. Jika layanan Anda tidak menanggapi panggilan API ini dalam waktu yang wajar, Service Fabric dapat secara paksa menghentikan layanan Anda. Biasanya ini hanya terjadi selama peningkatan aplikasi atau ketika layanan sedang dihapus. Batas waktunya adalah 15 menit secara default.
- Kegagalan di jalur
OnCloseAsync()
tersebut mengakibatkanOnAbort()
dipanggil, yang merupakan kesempatan terakhir untuk melakukan upaya terbaik bagi layanan untuk membersihkan dan melepaskan sumber daya apa pun yang telah diklaim. Ini umumnya dipanggil ketika kesalahan permanen terdeteksi pada simpul, atau ketika Service Fabric tidak dapat mengelola siklus hidup instans layanan karena kegagalan internal. OnChangeRoleAsync()
dipanggil ketika replika layanan stateful berubah peran, misalnya ke primer atau sekunder. Replika utama diberi status tulis (diizinkan untuk membuat dan menulis ke Reliable Collections). Replika sekunder diberi status baca (hanya dapat membaca dari Reliable Collections yang sudah ada). Sebagian besar pekerjaan dalam layanan stateful dilakukan di replika utama. Replika sekunder dapat melakukan validasi baca-saja, pembuatan laporan, penggalian data, atau pekerjaan baca-saja lainnya.