Contoh Task Queue Go

Contoh ini membuat aplikasi yang menampilkan formulir HTML. Anda memasukkan string ke dalam kotak dialog dan mengklik Add. Aplikasi akan menghitung berapa kali Anda memasukkan string dengan cara ini.

Aplikasi melakukan hal berikut:

  • Saat Anda mengklik Add, formulir akan menggunakan permintaan POST HTTP untuk mengirim string ke aplikasi yang sedang berjalan di App Engine. Di sana, aplikasi akan memaketkan string tersebut ke dalam tugas dan mengirimkannya ke antrean default.
  • Antrean meneruskan tugas ke pengendali tugas yang disertakan, lalu dipetakan ke /worker URL, yang secara asinkron menulis string ke datastore.
  • Mengirim permintaan GET HTTP akan menampilkan daftar string yang dimasukkan dan berapa kali setiap string di-Add, baik dengan mengetiknya maupun dengan mengkliknya di kotak.

Untuk men-deploy aplikasi ini ke App Engine:

  1. Salin kode berikut ke dalam file bernama queue.yaml. Tindakan ini mengubah tingkat pemrosesan tugas dari default 5 per detik menjadi 3 per detik.

    queue:
    - name: default
      rate: 3/s
    
  2. Di direktori yang sama, salin kode berikut ke file bernama sesuai keinginan Anda (diakhiri dengan .go). Ini adalah kode aplikasi, termasuk pengendali tugas.

    
    package counter
    
    import (
    	"html/template"
    	"net/http"
    
    	"google.golang.org/appengine"
    	"google.golang.org/appengine/datastore"
    	"google.golang.org/appengine/log"
    	"google.golang.org/appengine/taskqueue"
    )
    
    func init() {
    	http.HandleFunc("/", handler)
    	http.HandleFunc("/worker", worker)
    }
    
    type Counter struct {
    	Name  string
    	Count int
    }
    
    func handler(w http.ResponseWriter, r *http.Request) {
    	ctx := appengine.NewContext(r)
    	if name := r.FormValue("name"); name != "" {
    		t := taskqueue.NewPOSTTask("/worker", map[string][]string{"name": {name}})
    		if _, err := taskqueue.Add(ctx, t, ""); err != nil {
    			http.Error(w, err.Error(), http.StatusInternalServerError)
    			return
    		}
    	}
    	q := datastore.NewQuery("Counter")
    	var counters []Counter
    	if _, err := q.GetAll(ctx, &counters); err != nil {
    		http.Error(w, err.Error(), http.StatusInternalServerError)
    		return
    	}
    	if err := handlerTemplate.Execute(w, counters); err != nil {
    		http.Error(w, err.Error(), http.StatusInternalServerError)
    		return
    	}
    	// OK
    }
    
    func worker(w http.ResponseWriter, r *http.Request) {
    	ctx := appengine.NewContext(r)
    	name := r.FormValue("name")
    	key := datastore.NewKey(ctx, "Counter", name, 0, nil)
    	var counter Counter
    	if err := datastore.Get(ctx, key, &counter); err == datastore.ErrNoSuchEntity {
    		counter.Name = name
    	} else if err != nil {
    		log.Errorf(ctx, "%v", err)
    		return
    	}
    	counter.Count++
    	if _, err := datastore.Put(ctx, key, &counter); err != nil {
    		log.Errorf(ctx, "%v", err)
    	}
    }
    
    var handlerTemplate = template.Must(template.New("handler").Parse(handlerHTML))
    
    const handlerHTML = `
    {{range .}}
    <p>{{.Name}}: {{.Count}}</p>
    {{end}}
    <p>Start a new counter:</p>
    <form action="/" method="POST">
    <input type="text" name="name">
    <input type="submit" value="Add">
    </form>
    `
    
  3. Di direktori yang sama, salin kode berikut ke file bernama app.yaml. Tindakan ini akan mengonfigurasi aplikasi Anda untuk App Engine:

    runtime: go
    api_version: go1
    
    handlers:
    - url: /worker/.*
      script: _go_app
      login: admin
    - url: /.*
      script: _go_app
  4. Pastikan Anda telah menyiapkan project Google Cloud Platform dengan aplikasi App Engine dan telah melakukan inisialisasi serta mengonfigurasi perintah gcloud untuk project tersebut.

  5. Gunakan perintah gcloud app deploy untuk men-deploy aplikasi ke App Engine.

  6. Lihat cara kerja aplikasi dengan menggunakan perintah gcloud app browse.