Mulai menggunakan Reliable Service di Java

Aplikasi Azure Service Fabric berisi satu atau beberapa layanan yang menjalankan kode Anda. Panduan ini menunjukkan kepada Anda cara membuat aplikasi Service Fabric stateless dan stateful dengan Reliable Services.

Periksa halaman ini untuk video pelatihan yang juga akan menunjukkan kepada Anda cara membuat layanan Andal tanpa status.

Konsep dasar

Untuk memulai dengan Reliable Services, Anda hanya perlu memahami beberapa konsep dasar:

  • Jenis layanan: Ini adalah implementasi layanan Anda. Ini ditentukan oleh kelas yang Anda tulis yang meluas StatelessService dan kode lain atau dependensi yang digunakan di dalamnya, bersama dengan nama dan nomor versi.
  • Instans layanan bernama: Untuk menjalankan layanan Anda, Anda membuat instans bernama jenis layanan Anda, sama seperti Anda membuat instans objek dari jenis kelas. Instans layanan memiliki nama dalam bentuk URI menggunakan "fabric:/" seperti "fabric:/MyApp/MyService".
  • Host layanan: Instans layanan bernama yang Anda buat perlu dijalankan di dalam host. Host layanan hanyalah proses di mana instans layanan Anda dapat berjalan.
  • Pendaftaran layanan: Pendaftaran menyatukan semuanya. Jenis layanan harus didaftarkan dengan runtime Service Fabric di host layanan untuk memungkinkan Service Fabric membuat instans untuk dijalankan.

Membuat layanan stateless

Layanan stateless adalah jenis layanan yang saat ini menjadi norma dalam aplikasi cloud. Hal ini dianggap stateless karena layanan itu sendiri tidak berisi data yang perlu disimpan dengan andal atau dibuat sangat tersedia. Jika instans layanan stateless ditutup, semua keadaan internalnya hilang. Dalam jenis layanan ini, status harus disimpan ke toko eksternal, seperti Azure Tables atau SQL Database, agar layanan dibuat sangat tersedia dan dapat diandalkan.

Luncurkan Visual Studio 2017 atau Visual Studio 2019 sebagai administrator, dan buat proyek aplikasi Service Fabric baru bernama HelloWorld:

Gunakan kotak dialog Proyek Baru untuk membuat aplikasi Service Fabric baru

Kemudian, buat proyek layanan stateless menggunakan .NET Core 2.0 bernama HelloWorldStateless:

Dalam kotak dialog kedua, buat proyek layanan tanpa status

Solusi Anda sekarang berisi dua proyek:

  • HelloWorld. Ini adalah proyek aplikasi yang berisi layanan Anda. Ini juga berisi manifes aplikasi yang menjelaskan aplikasi, serta sejumlah skrip PowerShell yang membantu Anda untuk menyebarkan aplikasi Anda.
  • HaloWorldStateless. Ini adalah proyek layanan. Ini berisi implementasi layanan stateless.

Menerapkan layanan

Buka file HelloWorldStateless.cs dalam proyek layanan. Dalam Service Fabric, layanan dapat menjalankan logika bisnis apa pun. API layanan menyediakan dua titik entri untuk kode Anda:

  • Metode titik masuk terbuka, yang disebut RunAsync, di mana Anda dapat mulai mengeksekusi beban kerja apa pun, termasuk beban kerja komputasi yang berjalan lama.
protected override async Task RunAsync(CancellationToken cancellationToken)
{
    ...
}
  • Titik entri komunikasi di mana Anda dapat menyambungkan tumpukan komunikasi pilihan Anda, seperti ASP.NET Core. Di sinilah Anda dapat mulai menerima permintaan dari pengguna dan layanan lainnya.
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    ...
}

Dalam tutorial ini, kita akan fokus pada metode entri poin RunAsync(). Di sinilah Anda dapat segera mulai menjalankan kode Anda. Templat proyek mencakup implementasi sampel RunAsync() tahapan jumlah bergulir tersebut.

Catatan

Untuk detail tentang cara bekerja dengan tumpukan komunikasi, lihat Komunikasi layanan dengan ASP.NET Core

RunAsync

protected override async Task RunAsync(CancellationToken cancellationToken)
{
    // TODO: Replace the following sample code with your own logic
    //       or remove this RunAsync override if it's not needed in your service.

    long iterations = 0;

    while (true)
    {
        cancellationToken.ThrowIfCancellationRequested();

        ServiceEventSource.Current.ServiceMessage(this.Context, "Working-{0}", ++iterations);

        await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
    }
}

Platform menyebut metode ini ketika instans layanan ditempatkan dan siap untuk dijalankan. Untuk layanan stateless, itu berarti ketika instans layanan dibuka. Token pembatalan disediakan untuk dikoordinasikan saat instans layanan Anda perlu ditutup. Dalam Service Fabric, siklus buka/tutup instans layanan ini dapat terjadi berkali-kali selama masa pakai layanan secara keseluruhan. Ini dapat terjadi karena berbagai alasan, termasuk:

  • Sistem memindahkan instans layanan Anda untuk penyeimbangan sumber daya.
  • Kesalahan terjadi dalam kode Anda.
  • Aplikasi atau sistem ditingkatkan.
  • Perangkat keras yang mendasarinya mengalami pemadaman.

Orkestrasi ini dikelola oleh sistem untuk menjaga layanan Anda sangat tersedia dan seimbang.

RunAsync() tidak boleh memblokir secara sinkron. Implementasi RunAsync Anda harus mengembalikan Tugas atau menunggu operasi jangka panjang atau pemblokiran untuk memungkinkan runtime dilanjutkan. Catatan dalam perulangan while(true) di contoh sebelumnya, pengembalian Tugas await Task.Delay() digunakan. Jika beban kerja Anda harus memblokir secara sinkron, Anda harus menjadwalkan Tugas baru dengan Task.Run() di implementasi RunAsync.

Pembatalan beban kerja Anda adalah upaya kooperatif yang diorkestrasi oleh token pembatalan yang disediakan. Sistem akan menunggu tugas Anda selesai (dengan penyelesaian yang berhasil, pembatalan, atau kesalahan) sebelum dilanjutkan. Penting untuk memenuhi token pembatalan, menyelesaikan pekerjaan apa pun, dan keluar RunAsync() secepat mungkin ketika sistem meminta pembatalan.

Dalam contoh layanan stateless ini, hitungan disimpan dalam variabel lokal. Tetapi karena ini adalah layanan stateless, nilai yang disimpan hanya ada untuk siklus hidup instans layanannya saat ini. Saat layanan bergerak atau dimulai ulang, nilai akan hilang.

Membuat layanan stateful

Service Fabric memperkenalkan jenis layanan baru yaitu stateful. Layanan stateful dapat mempertahankan status dengan andal dalam layanan itu sendiri, berlokasi bersama dengan kode yang menggunakannya. Status dibuat sangat tersedia oleh Service Fabric tanpa perlu mempertahankan status ke penyimpanan eksternal.

Untuk mengonversi nilai penghitung dari stateless ke sangat tersedia dan persisten, bahkan ketika layanan bergerak atau dimulai ulang, Anda memerlukan layanan stateful.

Dalam aplikasi HelloWorld yang sama, Anda dapat menambahkan layanan baru dengan mengeklik kanan pada referensi Layanan dalam proyek aplikasi dan memilih Tambahkan -> Layanan Service Fabric Baru.

Menambahkan layanan ke aplikasi Service Fabric Anda

Pilih .NET Core 2.0 -> Layanan Berstatus dan beri nama HelloWorldStateful. Klik OK.

Gunakan kotak dialog Proyek Baru untuk membuat layanan stateful Service Fabric baru

Aplikasi Anda sekarang harus memiliki dua layanan: layanan stateless HelloWorldStateless dan layanan stateful HelloWorldStateful.

Layanan stateful memiliki titik entri yang sama dengan layanan stateless. Perbedaan utamanya adalah ketersediaan penyedia status yang dapat menyimpan status dengan andal. Service Fabric hadir dengan implementasi penyedia negara bernama Reliable Collections, yang memungkinkan Anda membuat struktur data yang direplikasi melalui Reliable State Manager. Reliable Service yang stateful menggunakan penyedia status ini secara default.

Buka HelloWorldStateful.cs di HelloWorldStateful, yang berisi metode RunAsync berikut:

protected override async Task RunAsync(CancellationToken cancellationToken)
{
    // TODO: Replace the following sample code with your own logic
    //       or remove this RunAsync override if it's not needed in your service.

    var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<string, long>>("myDictionary");

    while (true)
    {
        cancellationToken.ThrowIfCancellationRequested();

        using (var tx = this.StateManager.CreateTransaction())
        {
            var result = await myDictionary.TryGetValueAsync(tx, "Counter");

            ServiceEventSource.Current.ServiceMessage(this.Context, "Current Counter Value: {0}",
                result.HasValue ? result.Value.ToString() : "Value does not exist.");

            await myDictionary.AddOrUpdateAsync(tx, "Counter", 0, (key, value) => ++value);

            // If an exception is thrown before calling CommitAsync, the transaction aborts, all changes are
            // discarded, and nothing is saved to the secondary replicas.
            await tx.CommitAsync();
        }

        await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
    }

RunAsync

RunAsync() beroperasi dengan cara yang sama dalam layanan stateful dan stateless. Namun, dalam layanan stateful, platform melakukan pekerjaan tambahan atas nama Anda sebelum dijalankan RunAsync(). Pekerjaan ini dapat mencakup pemastian bahwa Reliable State Manager dan Reliable Collections siap digunakan.

Reliable Collections dan Reliable State Manager

var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<string, long>>("myDictionary");

IReliableDictionary adalah implementasi kamus yang dapat Anda gunakan untuk menyimpan status dalam layanan dengan andal. Dengan Service Fabric dan Reliable Collections, Anda dapat menyimpan data langsung di layanan Anda tanpa perlu toko persisten eksternal. Reliable Collections membuat data Anda memiliki ketersediaan tinggi. Service Fabric menyelesaikan ini dengan membuat dan mengelola beberapa replika layanan Anda untuk Anda. Ini juga menyediakan API yang mengabstraksi kompleksitas pengelolaan replika tersebut dan transisi statusnya.

Reliable Collections dapat menyimpan jenis .NET apa pun, termasuk jenis kustom Anda, dengan beberapa peringatan:

  • Service Fabric membuat status Anda sangat tersedia dengan mereplikasi status di seluruh simpul, dan Reliable Collections menyimpan data Anda ke disk lokal pada setiap replika. Ini berarti bahwa semua yang disimpan dalam Reliable Collections harus dapat diserialisasikan. Secara default, Reliable Collections menggunakan DataContract untuk serialisasi, jadi penting untuk memastikan bahwa jenis Anda didukung oleh Pembuat Serialisasi Kontrak Data saat Anda menggunakan pembuat serialisasi default.

  • Objek direplikasi untuk ketersediaan tinggi saat Anda melakukan transaksi pada Reliable Collections. Objek yang disimpan dalam Reliable Collections disimpan dalam memori lokal dalam layanan Anda. Ini berarti Bahwa Anda memiliki referensi lokal untuk objek.

    Penting bagi Anda untuk tidak mengubah instans lokal objek tersebut tanpa melakukan operasi pembaruan pada pengumpulan yang dapat diandalkan dalam transaksi. Ini karena perubahan pada instansi lokal objek tidak akan direplikasi secara otomatis. Anda harus memasukkan kembali objek ke dalam kamus atau menggunakan salah satu metode pembaruan pada kamus.

Reliable State Manager mengelola Reliable Collections untuk Anda. Anda dapat meminta Reliable State Manager untuk reliable collection berdasarkan nama kapan saja dan di mana saja dalam layanan Anda. Reliable State Manager memastikan bahwa Anda mendapatkan referensi kembali. Jangan menyimpan referensi ke instans reliable collection di variabel atau properti anggota kelas. Perawatan khusus harus dilakukan untuk memastikan bahwa referensi diatur ke instans setiap saat dalam siklus hidup layanan. Reliable State Manager menangani pekerjaan ini untuk Anda, dan dioptimalkan untuk kunjungan berulang.

Operasi transaksional dan asinkron

using (ITransaction tx = this.StateManager.CreateTransaction())
{
    var result = await myDictionary.TryGetValueAsync(tx, "Counter-1");

    await myDictionary.AddOrUpdateAsync(tx, "Counter-1", 0, (k, v) => ++v);

    await tx.CommitAsync();
}

Reliable Collections memiliki banyak operasi yang sama dengan pasangan System.Collections.Generic dan System.Collections.Concurrent, kecuali untuk Kueri Terpadu Bahasa (LINQ). Operasi pada Reliable Collections bersifat asinkron. Ini karena operasi tulis dengan Reliable Collections melakukan operasi I/O untuk mereplikasi dan menyimpan data ke disk.

Operasi Reliable Collection bersifat transaksionalsehingga Anda dapat menjaga kondisi tetap konsisten di berbagai operasi dan Reliable Collections. Misalnya, Anda dapat menghapus antrean item kerja dari Reliable Queue, melakukan operasi di atasnya, dan menyimpan hasilnya dalam Kamus yang Dapat Diandalkan, semuanya dalam satu transaksi. Ini diperlakukan sebagai operasi atomik, dan ini menjamin bahwa seluruh operasi akan berhasil atau seluruh operasi akan digulung balik. Jika terjadi kesalahan setelah Anda menghapus antrean item tetapi sebelum Anda menyimpan hasilnya, seluruh transaksi akan digulirkan kembali dan item tetap dalam antrean untuk diproses.

Jalankan aplikasi

Kami sekarang kembali ke aplikasi HelloWorld. Anda sekarang dapat membangun dan menyebarkan layanan Anda. Ketika Anda menekan F5, aplikasi Anda akan dibangun dan disebarkan ke kluster lokal Anda.

Setelah layanan mulai berjalan, Anda dapat melihat kejadian Event Tracing for Windows (ETW) yang dihasilkan di jendela Peristiwa Diagnostik. Perhatikan bahwa peristiwa yang ditampilkan berasal dari layanan stateless dan layanan stateful dalam aplikasi. Anda dapat menjeda streaming dengan mengklik tombol Jeda. Anda kemudian dapat memeriksa detail pesan dengan memperluas pesan tersebut.

Catatan

Sebelum menjalankan aplikasi, pastikan Anda memiliki kluster pengembangan lokal yang berjalan. Lihat panduan memulai untuk informasi tentang penyiapan lingkungan lokal Anda.

Lihat Peristiwa Diagnostik di Visual Studio

Langkah berikutnya

Debug aplikasi Service Fabric Anda di Visual Studio

Memulai: Layanan Service Fabric Web API dengan hosting mandiri OWIN

Pelajari selengkapnya tentang Reliable Collections

Menyebarkan aplikasi

Peningkatan Aplikasi

Referensi pengembang untuk Reliable Services