Beispiel für eine Go-Aufgabenwarteschlange

In diesem Beispiel wird eine Anwendung erstellt, die ein HTML-Formular ausgibt. Dazu geben Sie einen String in das Dialogfeld ein und klicken auf Add. Die Anwendung zählt, wie oft Sie auf diese Weise einen String eingeben.

Die Anwendung macht Folgendes:

  • Wenn Sie auf Add klicken, verwendet das Formular eine HTTP-POST-Anfrage, um den String an die Anwendung zu senden, die in App Engine ausgeführt wird. Dort bündelt die Anwendung den String zu einer Aufgabe und sendet sie an die Standardwarteschlange.
  • Die Warteschlange leitet die Aufgabe an einen integrierten Aufgaben-Handler weiter, der der URL /worker zugeordnet ist und den String asynchron in einen Datenspeicher schreibt.
  • Wenn Sie eine HTTP-GET-Anfrage senden, wird Ihnen eine Liste der Strings angezeigt, die Sie eingegeben haben. Dabei sehen Sie auch, wie oft Sie die einzelnen Strings per Add verarbeitet haben, entweder durch Eingabe der Anfrage oder durch Klicken im Drop-down-Feld.

So stellen Sie diese Anwendung in App Engine bereit:

  1. Kopieren Sie das Folgende in eine Datei mit dem Namen queue.yaml. Dadurch ändern Sie das Intervall, in dem Aufgaben verarbeitet werden, vom Standardwert "5 pro Sekunde" auf "3 pro Sekunde".

    queue:
    - name: default
      rate: 3/s
    
  2. Kopieren Sie im selben Verzeichnis Folgendes in eine Datei mit einem von Ihnen gewählten Namen (und der Endung .go). Dies ist der Anwendungscode, einschließlich des Aufgaben-Handlers.

    
    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. Kopieren Sie im selben Verzeichnis Folgendes in eine Datei mit dem Namen app.yaml. Damit konfigurieren Sie Ihre Anwendung für App Engine:

    runtime: go
    api_version: go1
    
    handlers:
    - url: /worker/.*
      script: _go_app
      login: admin
    - url: /.*
      script: _go_app
  4. Prüfen Sie, ob ein Google Cloud Platform-Projekt mit einer App Engine-Anwendung vorbereitet und der Befehl gcloud für dieses Projekt initialisiert und konfiguriert wurde.

  5. Verwenden Sie den gcloud app deploy-Befehl, um die Anwendung in App Engine bereitzustellen.

  6. Sehen Sie sich die Anwendung mit dem gcloud app browse-Befehl in Aktion an.