Praktik terbaik Pub/Sub ke BigQuery

Halaman ini menguraikan praktik terbaik untuk mengoptimalkan pipeline Dataflow yang membaca dari Pub/Sub dan menulis ke BigQuery. Bergantung pada kasus penggunaan, saran berikut dapat menghasilkan performa yang lebih baik.

Solusi awal untuk backlog pipeline

Jika pipeline Pub/Sub ke BigQuery mengalami backlog yang terus bertambah dan tidak dapat menangani pesan yang masuk, Anda dapat melakukan langkah-langkah langsung berikut:

  • Perpanjang batas waktu konfirmasi Pub/Sub: Untuk langganan Pub/Sub terkait, perpanjang batas waktu konfirmasi ke nilai yang sedikit lebih lama dari waktu pemrosesan pesan maksimum yang diharapkan. Hal ini mencegah pesan dikirim ulang sebelum waktunya saat masih diproses.
  • Menskalakan pekerja: Jika jumlah pesan yang belum dikonfirmasi dan backlog langganan meningkat dengan cepat, kapasitas pemrosesan pipeline kemungkinan tidak memadai. Tingkatkan jumlah worker Dataflow untuk menangani volume pesan.
  • Aktifkan backoff eksponensial: Aktifkan backoff eksponensial untuk meningkatkan cara pipeline menangani percobaan ulang untuk masalah sementara, sehingga lebih tangguh.

Pengoptimalan kode dan pipeline jangka panjang

Untuk performa dan stabilitas yang berkelanjutan, sebaiknya lakukan perubahan arsitektur dan kode berikut:

  • Mengurangi panggilan getTable ke BigQuery: Panggilan metode getTable yang berlebihan dapat menyebabkan pembatasan kecepatan dan bottleneck performa. Untuk memitigasi hal ini:
    • Simpan informasi keberadaan tabel dalam memori pekerja untuk menghindari panggilan berulang untuk tabel yang sama.
    • Panggilan batch getTable berdasarkan per paket, bukan untuk setiap elemen individual.
    • Refaktorkan kode pipeline untuk menghilangkan kebutuhan memeriksa keberadaan tabel untuk setiap pesan.
  • Gunakan BigQuery Storage Write API: Untuk pipeline streaming yang menulis ke BigQuery, lakukan migrasi dari penyisipan streaming standar ke Storage Write API. Storage Write API menawarkan performa yang lebih baik dan kuota yang jauh lebih tinggi.
  • Gunakan runner Dataflow lama untuk tugas dengan kardinalitas tinggi: Untuk tugas yang memproses sejumlah besar kunci unik (kardinalitas tinggi), runner Dataflow lama mungkin menawarkan performa yang lebih baik daripada Runner v2, kecuali jika diperlukan transformasi lintas bahasa.
  • Mengoptimalkan ruang kunci: Performa dapat menurun saat pipeline beroperasi pada jutaan kunci aktif. Sesuaikan logika pipeline untuk melakukan pekerjaan pada ruang kunci yang lebih kecil dan lebih mudah dikelola.

Pengelolaan resource, kuota, dan konfigurasi

Alokasi dan konfigurasi resource yang tepat sangat penting untuk kesehatan pipeline:

  • Mengelola kuota secara proaktif: Pantau kuota dan minta penambahan untuk kuota apa pun yang mungkin tercapai selama peristiwa penskalaan. Misalnya, pertimbangkan peristiwa penskalaan berikut:
    • Tingkat panggilan yang tinggi ke metode TableService.getTable atau tabledata.insertAll dapat melebihi kueri maksimum per detik (QPS). Untuk mengetahui informasi selengkapnya tentang batas dan cara meminta kuota yang lebih besar, lihat Kuota dan batas BigQuery.
    • Kuota Compute Engine untuk alamat IP dan CPU yang sedang digunakan mungkin melebihi batas maksimum. Untuk mengetahui informasi selengkapnya tentang batas dan cara meminta kuota tambahan, lihat ringkasan kuota dan batas Compute Engine.
  • Mengoptimalkan konfigurasi pekerja: Untuk mencegah error kehabisan memori (OOM) dan meningkatkan stabilitas:
    • Gunakan jenis mesin pekerja dengan memori yang lebih besar.
    • Kurangi jumlah thread per pekerja.
    • Tetapkan jumlah pekerja yang lebih tinggi untuk mendistribusikan workload secara lebih merata dan mengurangi dampak performa dari peristiwa penskalaan otomatis yang sering terjadi.

Langkah berikutnya