Melakukan migrasi dari App Engine Datastore ke Firestore dalam mode Datastore

Panduan ini menunjukkan cara melakukan migrasi dari App Engine Datastore ke Firestore dalam mode Datastore (juga disebut sebagai Datastore).

Firestore dalam mode Datastore mirip dengan App Engine Datastore karena keduanya merujuk pada layanan Datastore dasar yang sama. Meskipun App Engine Datastore hanya dapat diakses melalui layanan paket lama App Engine, Firestore dalam mode Datastore adalah produk Google Cloud mandiri yang diakses melalui Library Klien Cloud.

Firestore dalam mode Datastore juga menawarkan paket gratis dan memungkinkan Anda mengelola database dokumen NoSQL yang sangat skalabel dan memberi Anda fleksibilitas di masa mendatang untuk bermigrasi ke Cloud Run atau platform hosting aplikasi Google Cloud lainnya.

Sebelum memulai

  1. Tinjau berbagai mode database Firestore untuk memastikan Anda memahami kasus penggunaan terbaik untuk aplikasi Anda. Perhatikan bahwa panduan ini membahas cara bermigrasi ke mode Datastore.

  2. Tinjau dan pahami pricing dan quotas Firestore dalam mode Datastore.

    Firestore dalam mode Datastore menawarkan penggunaan gratis dengan batas harian, serta penyimpanan, operasi baca, dan tulis tanpa batas untuk akun berbayar. Meskipun dinonaktifkan, aplikasi App Engine tidak akan mendapatkan traffic yang menimbulkan biaya. Namun, penggunaan Datastore dapat ditagih jika melebihi batas kuota gratis.

  3. Aktifkan API berikut dalam project yang berisi aplikasi Anda:

    • Artifact Registry API untuk menyimpan dan mengelola artefak build Anda
    • Cloud Build API untuk terus membangun, menguji, dan men-deploy aplikasi Anda.
    • Cloud Datastore API untuk bermigrasi dari Datastore yang dipaketkan di App Engine ke Firestore dalam mode Datastore.

      Aktifkan API

  4. Pastikan ada aplikasi App Engine yang menjalankan Java 8 atau 11 yang terhubung ke layanan App Engine Datastore.

Ringkasan proses

Pada tingkat tinggi, proses migrasi ke Firestore dalam mode Datastore dari App Engine Datastore terdiri dari langkah-langkah berikut:

  1. Update file konfigurasi
  2. Update aplikasi Java Anda
    1. Update pernyataan impor
    2. Ubah cara aplikasi mengakses layanan Datastore
    3. Dapatkan kunci yang dihasilkan Datastore
    4. Ubah pembuatan entity
  3. Commit transaksi Anda
  4. Hasil kueri

Update file konfigurasi

Update file konfigurasi Anda untuk menggunakan library klien mode Datastore.

Update file pom.xml aplikasi Java dasar pengukuran Anda:

  1. Hapus impor appengine-api-1.0-sdk App Engine SDK, seperti berikut:

    <dependency>
      <groupId>com.google.appengine</groupId>
      <artifactId>appengine-api-1.0-sdk</artifactId>
      <version>2.0.4</version>
    </dependency>
    
  2. Tambahkan klien Datastore, seperti berikut:

    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-datastore</artifactId>
      <!-- Use latest version -->
      <version>2.2.9</version>
    </dependency>
    

Update aplikasi Java Anda

Update pernyataan impor

Ubah file aplikasi Anda dengan mengupdate baris impor dan inisialisasi:

  1. Hapus pernyataan impor App Engine berikut untuk com.google.appengine.api.datastore.* App Engine Datastore:

      import com.google.appengine.api.datastore.DatastoreService;
      import com.google.appengine.api.datastore.DatastoreServiceFactory;
      import com.google.appengine.api.datastore.Entity;
      import com.google.appengine.api.datastore.FetchOptions;
      import com.google.appengine.api.datastore.Query;
    
  2. Tambahkan impor com.google.cloud.datastore.* Firestore dalam mode Datastore berikut:

      import com.google.cloud.Timestamp;
      import com.google.cloud.datastore.Datastore;
      import com.google.cloud.datastore.DatastoreOptions;
      import com.google.cloud.datastore.Entity;
      import com.google.cloud.datastore.Key;
      import com.google.cloud.datastore.FullEntity;
      import com.google.cloud.datastore.KeyFactory;
      import com.google.cloud.datastore.Query;
      import com.google.cloud.datastore.QueryResults;
      import com.google.cloud.datastore.StructuredQuery;
    

Ubah cara aplikasi Anda mengakses layanan Datastore

Firestore dalam mode Datastore menggunakan class Datastore, bukan DatastoreService. Untuk mengubah cara aplikasi Anda mengakses layanan Datastore:

  1. Temukan baris yang menggunakan metode DatastoreServiceFactory.getDatastoreService(), seperti berikut:

    // Initialize a client
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    
  2. Ganti DatastoreServiceFactory.getDatastoreService() dengan metode DatastoreOptions.getDefaultInstance().getService(), seperti berikut:

    // Initialize a client
    Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
    

Dapatkan kunci yang dihasilkan Datastore

Setelah menginisialisasi klien, dapatkan kunci dengan membuat KeyFactory baru dari Kind yang sesuai, lalu minta Datastore untuk membuatkannya untuk Anda. Untuk mendapatkan kunci yang dihasilkan Datastore:

  1. Buat newKeyFactory.

  2. Panggil metode setKind() untuk menentukan kind entity yang digunakan untuk kategorisasi kueri.

  3. Tambahkan metode newKey() untuk menghasilkan kunci Datastore:

    //Prepare a new entity
    String kind = "visit";
    Key key = datastore.allocateId(datastore.newKeyFactory().setKind(kind).newKey());
    

Ubah pembuatan entity

Setelah mendapatkan kunci Datastore, buat entity menggunakan metode berikut:

  1. Gunakan Entity.newBuilder, dan teruskan kunci yang dihasilkan oleh Datastore.

    Temukan baris yang menggunakan panggilan konstruktor Entity, seperti berikut:

    Entity visit = new Entity(kind);
    

    Ganti panggilan konstruktor Entity dengan panggilan konstruktor Entity.newBuilder, seperti berikut:

    Entity visit = Entity.newBuilder(key);
    
  2. Gunakan metode set untuk menetapkan properti pada entity.

    Parameter pertama adalah properti yang dimaksud, dan yang kedua adalah nilai. Dalam kasus properti timestamp, nilainya adalah Timestamp, bukan Instant.toString().

    Temukan baris yang menggunakan metode setProperty, seperti berikut:

    visit.setProperty("user_ip", userIp);
    visit.setProperty("timestamp", Instant.now().toString());
    

    Ganti metode setProperty dengan metode set, seperti berikut:

    Entity visit = Entity.newBuilder(key).set("user_ip", userIp).set("timestamp", Timestamp.now()).build();
    

Commit transaksi Anda

Library klien Firestore dalam mode Datastore menggunakan metode add() untuk meng-commit transaksi. Untuk meng-commit transaksi Anda:

  1. Temukan baris yang menggunakan metode put(), seperti berikut:

    // Save the entity
    datastore.put(visit);
    
  2. Ganti metode put() dengan metode add(), seperti berikut:

    // Save the entity
    datastore.add(visit);
    

Hasil Kueri

Kueri mengambil entities yang memenuhi serangkaian kondisi tertentu. Anda dapat menggunakan metode berikut untuk menampilkan hasil:

  • Metode OrderBy menampilkan hasil dalam urutan naik atau menurun.

  • Metode Limit membatasi jumlah maksimum hasil yang diambil dalam builder yang sama.

Kueri menggunakan metode pola builder dengan variabel kind. Variabel kind disetel ke Visit dari langkah Dapatkan kunci yang dihasilkan Datastore.

Untuk mengambil 10 hasil pertama:

  1. Temukan baris yang menggunakan metode addSort(), seperti berikut:

      // Retrieve the last 10 visits from the datastore, ordered by timestamp.
      Query query = new Query(kind).addSort("timestamp", Query.SortDirection.DESCENDING);
      List<Entity> results = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(10));
    
  2. Ganti metode addSort() dengan metode setOrderBy() dan tambahkan metode setLimit(), seperti berikut:

    // Retrieve the last 10 visits from the datastore, ordered by timestamp.
    Query<Entity> query = Query.newEntityQueryBuilder()
                            .setKind(kind)
                            .setOrderBy(StructuredQuery.OrderBy.desc("timestamp"))
                            .setLimit(10)
                            .build();
    
  3. Setelah kueri siap, jalankan kode menggunakan datastore.run(), dan kumpulkan hasilnya dalam koleksi QueryResultsEntity.

    Objek QueryResults yang dihasilkan adalah iterator dengan fungsi hasNext().

  4. Periksa apakah kumpulan hasil memiliki objek next untuk diproses, bukan melakukan loop pada daftar hasil. Contoh:

    QueryResults<Entity> results = datastore.run(query);
    
          resp.setContentType("text/plain");
          PrintWriter out = resp.getWriter();
          out.print("Last 10 visits:\n");
          while (results.hasNext()) {
              Entity entity = results.next();
              out.format(
                      "Time: %s Addr: %s\n", entity.getTimestamp("timestamp"), entity.getString("user_ip"));
          }
    

Contoh

Untuk melihat contoh cara memigrasikan aplikasi Java 8 ke Firestore dalam mode Datastore, bandingkan Contoh kode App Engine Datastore untuk Java 8 dan Contoh kode Firestore dalam mode Datastore di GitHub.

Langkah selanjutnya