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:

  1. Layanan ini dibangun.
  2. StatelessService.CreateServiceInstanceListeners() dipanggil dan setiap listener yang ditampilkan akan dibuka. ICommunicationListener.OpenAsync() dipanggil pada setiap listener.
  3. 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.

Penonaktifan layanan stateless

Untuk mematikan layanan stateless, pola yang sama akan diikuti, cukup secara terbalik:

  1. Setiap listener terbuka apa pun akan ditutup. ICommunicationListener.CloseAsync() dipanggil pada setiap listener.
  2. Token pembatalan yang diteruskan ke RunAsync() akan dibatalkan. Pemeriksaan properti IsCancellationRequested token pembatalan mengembalikan nilai true, dan jika dipanggil, metode ThrowIfCancellationRequested token akan menampilkan OperationCanceledException. Service Fabric menunggu RunAsync() selesai.
  3. Setelah RunAsync() selesai, metode StatelessService.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 alih StatelessService.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.
  4. 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:

  1. Layanan ini dibangun.

  2. StatefulServiceBase.OnOpenAsync() dipanggil. Panggilan ini tidak umumnya diambil alih dalam layanan.

  3. 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.
  4. 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.

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:

  1. Setiap listener terbuka apa pun akan ditutup. ICommunicationListener.CloseAsync() dipanggil pada setiap listener.

  2. metode StatefulServiceBase.OnCloseAsync() dipanggil. Panggilan ini adalah pengambil-alihan yang tidak biasa, namun tersedia.

  3. Token pembatalan yang diteruskan ke RunAsync() akan dibatalkan. Pemeriksaan properti IsCancellationRequested token pembatalan mengembalikan nilai true, dan jika dipanggil, metode ThrowIfCancellationRequested token akan menampilkan OperationCanceledException. Service Fabric menunggu RunAsync() selesai.

    Catatan

    Kebutuhan untuk menunggu RunAsync selesai hanya diperlukan jika replika ini adalah replika Utama.

  4. 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:

  1. Setiap listener terbuka apa pun akan ditutup. ICommunicationListener.CloseAsync() dipanggil pada setiap listener.
  2. Token pembatalan yang diteruskan ke RunAsync() akan dibatalkan. Pemeriksaan properti IsCancellationRequested token pembatalan mengembalikan nilai true, dan jika dipanggil, metode ThrowIfCancellationRequested token akan menampilkan OperationCanceledException. Service Fabric menunggu RunAsync() selesai.
  3. Listener yang ditandai sebagai ListenOnSecondary = true terbuka.
  4. 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:

  1. ICommunicationListener.CloseAsync() dipanggil untuk semua listener yang terbuka (ditandai dengan ListenOnSecondary = true).
  2. Semua listener komunikasi terbuka. ICommunicationListener.OpenAsync() dipanggil pada setiap listener.
  3. Kemudian, secara paralel:
    • Metode StatefulServiceBase.RunAsync() layanan dipanggil.
    • StatefulServiceBase.OnChangeRoleAsync() dipanggil. Panggilan ini tidak umumnya diambil alih dalam layanan.

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 panggilan CreateServiceReplicaListeners/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 menerapkan RunAsync(). 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 menerapkan RunAsync().
  • Layanan ini berlaku untuk menyelesaikan dengan RunAsync() secara lancar dan kembali. Penyelesaian bukan kondisi kegagalan. Penyelesaian RunAsync() 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 mengakibatkan OnAbort() 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.

Langkah berikutnya