Menggunakan gRPC dengan library klien Java

Klien Java untuk mode Datastore menawarkan gRPC sebagai opsi lapisan transport. Penggunaan penggabungan koneksi gRPC memungkinkan pendistribusian RPC melalui beberapa koneksi, yang dapat meningkatkan performa.

Sebelum memulai

Instal library google-cloud-datastore versi terbaru.

Cara mengaktifkan perilaku transportasi gRPC

Untuk mengaktifkan perilaku transportasi gRPC, tambahkan setTransportOptions ke instansiasi klien Anda:

Java
DatastoreOptions datastoreOptions =
       DatastoreOptions.newBuilder()
               .setProjectId("my-project")
               .setDatabaseId("my-database")
               .setTransportOptions(GrpcTransportOptions.newBuilder().build())
               .build();

Menetapkan opsi transport secara eksplisit ke GrpcTransportOptions akan mengonfigurasi klien untuk menggunakan gRPC, bukan HTTP, saat melakukan panggilan ke server.

Menonaktifkan perilaku transport gRPC

Anda dapat menonaktifkan perilaku transport gRPC dengan kembali ke perilaku transport HTTP. Untuk melakukannya, hapus baris kode .setTransportOptions atau ganti GrpcTransportOptions dengan HttpTransportOptions. Anda juga harus membangun ulang dan memulai ulang aplikasi.

Java
// Use this code to deactivate the gRPC transport behavior
// by reverting to the HTTP transport behavior.
DatastoreOptions datastoreOptions = DatastoreOptions.newBuilder()
            .setProjectId("my-project")
            .setDatabaseId("my-database")
            .build();

// You can also use this code to revert to the HTTP transport behavior
DatastoreOptions datastoreOptions =
            DatastoreOptions.newBuilder()
                    .setProjectId("my-project")
                    .setDatabaseId("my-database")
                    .setTransportOptions(HttpTransportOptions.newBuilder()
                            .setConnectTimeout(1000)
                            .build())
                    .build();

Memverifikasi opsi transportasi

Untuk memverifikasi jenis TransportOptions yang digunakan klien, periksa jenis opsi transportasi:

Java
// Compares datastore transport options type

boolean isGRPC = datastore.getOptions().getTransportOptions() instanceof GrpcTransportOptions;

boolean isHTTP = datastore.getOptions().getTransportOptions() instanceof HTTPTransportOptions;

Konfigurasi kumpulan koneksi

Kumpulan koneksi, yang juga dikenal sebagai kumpulan saluran, adalah cache koneksi database yang dibagikan dan digunakan kembali oleh klien untuk meningkatkan latensi dan performa koneksi. Untuk meningkatkan performa aplikasi, konfigurasi pool koneksi.

Bagian ini membantu Anda menentukan ukuran kumpulan koneksi yang optimal dan menunjukkan cara mengonfigurasinya dalam library klien Java.

Menentukan ukuran kumpulan koneksi terbaik

Ukuran pool koneksi default sudah tepat untuk sebagian besar aplikasi, dan dalam sebagian besar kasus, tidak perlu diubah. Namun, Anda mungkin ingin mengubah ukuran kumpulan koneksi karena throughput yang tinggi atau permintaan yang di-buffer.

Idealnya, untuk memberikan ruang bagi fluktuasi traffic, kumpulan koneksi memiliki sekitar dua kali jumlah koneksi yang diperlukan untuk saturasi maksimum. Karena koneksi dapat menangani maksimum 100 permintaan serentak, sebaiknya Anda memiliki antara 10 hingga 50 permintaan yang belum selesai per koneksi. Lapisan middleware menerapkan batas 100 streaming serentak per koneksi gRPC, dan batas ini tidak dapat dikonfigurasi. Untuk menghitung jumlah koneksi yang optimal di kumpulan koneksi Anda, menggunakan perkiraan QPS per klien dan angka latensi rata-rata, lakukan hal berikut:

Dari metrik sisi klien, kumpulkan informasi berikut dan lakukan penghitungan berikut:

  1. Tentukan jumlah maksimum kueri per detik (QPS) per klien saat aplikasi Anda menjalankan workload.
  2. Tentukan latensi rata-rata (waktu respons untuk satu permintaan) dalam md.
  3. Tentukan jumlah permintaan yang dapat Anda kirim secara serial per detik dengan membagi 1.000 dengan nilai latensi rata-rata.
  4. Bagilah QPS dalam detik dengan jumlah permintaan serial per detik.
  5. Bagi hasilnya dengan 50 permintaan per channel untuk menentukan ukuran kumpulan koneksi optimal minimum. (Jika perhitungan Anda kurang dari 2, tetap gunakan minimal 2 channel untuk memastikan redundansi.)
  6. Bagilah hasil yang sama dengan 10 permintaan per saluran untuk menentukan ukuran kumpulan koneksi optimal maksimum.

Untuk melakukan langkah-langkah ini, gunakan persamaan berikut:

(QPS sec ÷ (1,000 ÷ latency ms)) ÷ 50 streams = Minimum optimal number of
connections

(QPS sec ÷ (1,000 ÷ latency ms)) ÷ 10 streams = Maximum optimal number of
connections

Misalnya, jika aplikasi Anda biasanya mengirim 50.000 permintaan per detik, dan latensi rata-ratanya adalah 10 md. Bagi 1.000 dengan 10 md untuk menentukan bahwa Anda dapat mengirim 100 permintaan secara serial per detik. Bagi angka tersebut dengan 50.000 untuk mendapatkan paralelisme yang diperlukan untuk mengirim 50.000 QPS: 500.

Setiap saluran dapat memiliki paling banyak 100 permintaan yang dikeluarkan secara serentak, dan target penggunaan saluran Anda adalah antara 10 dan 50 streaming serentak. Oleh karena itu, untuk menghitung ukuran pool koneksi minimum, bagi 500 dengan 50 untuk mendapatkan 10. Untuk menemukan ukuran pool koneksi maksimum, bagi 500 dengan 10 untuk mendapatkan 50.

Artinya, ukuran kumpulan koneksi untuk contoh ini adalah antara 10 dan 50 koneksi. Anda juga perlu memantau traffic setelah melakukan perubahan ini dan menyesuaikan jumlah koneksi di kumpulan Anda, sesuai kebutuhan.

Menetapkan ukuran kumpulan

Contoh kode berikut menunjukkan cara mengonfigurasi kumpulan koneksi di library klien menggunakan DatastoreOptions.

Java
InstantiatingGrpcChannelProvider channelProvider =
        DatastoreSettings.defaultGrpcTransportProviderBuilder()
                .setChannelPoolSettings(
                       ChannelPoolSettings.builder()
                                .setInitialChannelCount(MIN_VAL)
                                .setMaxChannelCount(MAX_VAL)
                                .build())
                .build();

DatastoreOptions options = DatastoreOptions.newBuilder()
         .setProjectId("my-project")
         .setChannelProvider(channelProvider)
         .setTransportOptions(GrpcTransportOptions.newBuilder().build())
         .build();

Langkah berikutnya

Untuk mengetahui informasi selengkapnya tentang kumpulan koneksi dan praktik terbaik untuk performa, lihat: