Siklus hidup actor, pengumpulan sampah otomatis, dan penghapusan manual

Actor diaktifkan pertama kali panggilan dilakukan untuk salah satu metodenya. Actor dinonaktifkan (sampah yang dikumpulkan oleh runtime Actor) jika tidak digunakan untuk jangka waktu yang dapat dikonfigurasi. Actor dan statusnya juga dapat dihapus secara manual kapan saja.

Aktivasi actor

Saat actor diaktifkan, hal berikut ini terjadi:

  • Ketika panggilan datang untuk actor dan satu belum aktif, actor baru dibuat.
  • Status actor dimuat jika mempertahankan status.
  • Metode OnActivateAsync (C#) atau onActivateAsync (Java) (yang dapat ditimpa dalam implementasi actor) dipanggil.
  • Actor tersebut kini dianggap aktif.

Penonaktifan actor

Saat actor dinonaktifkan, hal berikut ini terjadi:

  • Ketika suatu actor tidak digunakan untuk beberapa periode waktu, itu dihapus dari tabel Actor Aktif.
  • Metode OnDeactivateAsync (C#) atau onDeactivateAsync (Java) (yang dapat ditimpa dalam implementasi actor) disebut. Ini membersihkan semua timer untuk actor. Operasi actor seperti perubahan status tidak boleh dipanggil dari metode ini.

Tip

Runtime Fabric Actor memancarkan beberapa peristiwa yang berkaitan dengan aktivasi dan deaktivasi actor. Ini berguna dalam diagnostik dan pemantauan kinerja.

Actor pengumpulan sampah

Ketika pelaku dinonaktifkan, referensi ke objek pelaku dilepaskan dan bisa menjadi sampah yang dikumpulkan secara normal oleh runtime bahasa umum (CLR) atau pengumpul sampah mesin virtual Java (JVM). Pengumpulan sampah hanya membersihkan objek actor; tidak menghapus status yang disimpan di State Manager actor. Saat nantinya actor diaktifkan, objek actor baru dibuat dan statusnya dipulihkan.

Apa yang dianggap sebagai "digunakan" untuk tujuan penonaktifan dan pengumpulan sampah?

  • Menerima panggilan
  • Metode IRemindable.ReceiveReminderAsync yang dipanggil (hanya berlaku jika actor menggunakan pengingat)

Catatan

jika actor menggunakan timer dan timer callback-nya dipanggil, maka tidak dihitung sebagai "digunakan".

Sebelum kita masuk ke detail penonaktifan, penting untuk mendefinisikan istilah-istilah berikut:

  • Interval pemindaian. Ini adalah interval saat runtime Actor memindai tabel Actor Aktif untuk actor yang dapat dinonaktifkan dan sampah dikumpulkan. Nilai default untuk ini adalah 1 menit.
  • Waktu diam habis. Ini adalah jumlah waktu yang dibutuhkan suatu actor untuk tetap tidak digunakan (idle) sebelum dapat dinonaktifkan dan sampah dikumpulkan. Nilai defaultnya adalah 60 menit.

Biasanya, Anda tidak perlu mengubah default ini. Namun, jika perlu, interval ini dapat diubah melalui ActorServiceSettings saat mendaftarkan Layanan Actor Anda:

public class Program
{
    public static void Main(string[] args)
    {
        ActorRuntime.RegisterActorAsync<MyActor>((context, actorType) =>
                new ActorService(context, actorType,
                    settings:
                        new ActorServiceSettings()
                        {
                            ActorGarbageCollectionSettings =
                                new ActorGarbageCollectionSettings(10, 2)
                        }))
            .GetAwaiter()
            .GetResult();
    }
}
public class Program
{
    public static void main(String[] args)
    {
        ActorRuntime.registerActorAsync(
                MyActor.class,
                (context, actorTypeInfo) -> new FabricActorService(context, actorTypeInfo),
                timeout);
    }
}

Untuk setiap actor aktif, runtime actor melacak jumlah waktu yang telah menganggur (yaitu tidak digunakan). Actor runtime memeriksa tiap-tiap actor setiap ScanIntervalInSeconds untuk melihat apakah itu bisa berupa sampah yang dikumpulkan dan menandainya jika telah menganggur untuk IdleTimeoutInSeconds.

Setiap kali suatu actor digunakan, waktu menganggurnya diatur ulang ke 0. Setelah ini, actor bisa menjadi sampah yang dikumpulkan hanya jika kembali menganggur selama IdleTimeoutInSeconds. Ingat bahwa actor dianggap telah digunakan jika metode antarmuka actor atau callback pengingat actor dijalankan. Suatu actor tidak dianggap telah digunakan jika timer callback-nya dijalankan.

Diagram berikut menunjukkan siklus hidup actor tunggal untuk mengilustrasikan konsep-konsep ini.

Contoh waktu menganggur

Contohnya menunjukkan dampak panggilan metode actor, pengingat, dan timer pada masa pakai actor ini. Poin-poin berikut tentang contoh yang penting untuk disebutkan:

  • ScanInterval dan IdleTimeout masing-masing diatur ke 5 dan 10. (Unit tidak masalah di sini, karena tujuan kami hanya untuk mengilustrasikan konsep.)
  • Pemindaian untuk actor menjadi sampah yang dikumpulkan terjadi pada T = 0,5,10,15,20,25, sebagaimana didefinisikan oleh interval pemindaian 5.
  • Timer berkala menembak pada T=4,8,12,16,20,24, dan callback-nya mengeksekusi. Itu tidak berdampak pada waktu menganggur actor.
  • Panggilan metode actor pada T=7 mengatur ulang waktu menganggur ke 0 dan menunda pengumpulan sampah actor.
  • Suatu actor pengingat callback mengeksekusi di T=14 dan lebih lanjut menunda pengumpulan sampah actor.
  • Selama pemindaian pengumpulan sampah di T=25, waktu menganggur suatu actor akhirnya melebihi batas waktu menganggur 10, dan actornya adalah sampah yang dikumpulkan.

Suatu actor tidak akan pernah menjadi sampah yang dikumpulkan saat mengeksekusi salah satu metodenya, tidak peduli berapa banyak waktu yang dihabiskan dalam mengeksekusi metode itu. Seperti disebutkan sebelumnya, eksekusi metode antarmuka actor dan callback pengingat mencegah pengumpulan sampah dengan mengatur ulang waktu menganggur actor menjadi 0. Eksekusi timer callback tidak mengatur ulang waktu menganggur ke 0. Namun, pengumpulan sampah actor ditangguhkan sampai timer callback selesai dieksekusi.

Menghapus actor dan statusnya secara manual

Pengumpulan sampah actor yang dinonaktifkan hanya membersihkan objek actor, tetapi tidak menghapus data yang disimpan di State Manager actor. Ketika actor diaktifkan kembali, datanya kembali tersedia untuk itu melalui State Manager. Dalam kasus di mana actor menyimpan data di State Manager dan dinonaktifkan tetapi tidak pernah diaktifkan kembali, mungkin perlu untuk membersihkan data mereka. Untuk contoh cara menghapus actor, baca menghapus actor dan statusnya.

Langkah berikutnya