Easy Task Queue on Google Appengine

appengine

Kali ini saya akan ngobrol sedikit tentang python web development di Google Appengine, yaitu tentang memanfaatkan Task Queue.

Apa itu Task Queue?, Task Queue kalau diterjemahkan ke bahasa Indonesia bisa kita sebut sebagai Antrian Tugas/Antrian Prosess, dimana akan sangat berguna ketika kita akan melakukkan proses-proses yang berat dan panjang di dalam satu request.

Saya akan langsung saja kasi kasus penggunaan nya, belakangan ini saya terlibat dalam sebuah Fun project dengan seorang teman dimana membuat sebuah web dengan memanfaatkan API dari Facebook.

PROBLEM

Salah satu fitur yang terdapat di web itu adalah ketika  User memposting foto baru, maka foto itu akan otomatis terposting ke wall Facebook Page website itu. Untuk masalah koneksi dengan FB API itu tidaklah menjadi masalah besar di Python dengan memanfaatkan modul python yang sudah ada.

Masalahnya, ketika user akan memposting Foto, selain menyimpan foto itu ke Database, saat itu juga harus memposting ke Facebook. Yang terjadi adalah proses posting menjadi cukup lama karena terjadi 2 proses sekaligus yaitu menyimpan ke database dan posting ke Facebook.

SOLUSI

Untuk mengatasi masalah diatas, ternyata sangat lah mudah. Thanks to Google Appengine yang membuat semuanya menjadi sederhana dan siap pakai.

Untuk itu saya memanfaatkan layanan Task Queue di Appengine, dengan Task Queue ini proses yang panjang seperti posting ke Facebook bisa kita masukkan ke dalam antrian tugas/task, yang akan di eksekusi secara terpisah sehingga tidak membebani request, alhasil request menjadi lebih cepat.

CODES

Saya tidak akan memberikan code secara detail, hanya ingin menunjukkan bagaimana penggunaan Task Queue di Appengine terutama Push Queue, untuk jenis-jenis Queues di Appengine bisa baca disini.

# file main.py
import webapp2
from google.appengine.api import taskqueue

import facebook
from models import Post

class PostingPhoto(webapp2.RequestHandler):
    def get(self):
        # Render render form posting disini

    def post(self):
        photo = # ....proses upload photo...
        post = Post(title=self.request.get('title'), photo=photo)

        # Tambahkan task ke Task Queue
        taskqueue.add(url='/post_to_facebook',
                      params={'post_key': str(post.key())})

        self.redirect('/')

class PostToFacebook(webapp2.RequestHandler):
    def post(self):
        # ambil param: post_key
        post_key = self.request.get('post_key')
        post = Post.get(post_key)

        # Posting ke Facebook disini
        graph = facebook.GraphAPI('user_access_token_disini...')
        graph.put_wall_post(message=post.msg,
                            attachment={...foto, deskripsi, dll...})

app = webapp2.WSGIApplication([
                ('/posting', PostingPhoto),
                ('/post_to_facebook', PostToFacebook)],
                debug=True)

Yang paling penting dan perlu diperhatikan dari potongan kode diatas adalah pada bagian taskqueue.add(…). Bagian tersebut adalah perintah menambahkan task ke Task Queue supaya dieksekusi Appengine.

taskqueue.add(…) memerlukan 2 buah parameter yaitu url dari worker dan params yang akan dilewatkan ke worker, lebih detail tentang worker akan saya jelaskan berikutnya.

WORKER

Yang menjadi worker pada kode diatas adalah Handler PostToFacebook,  worker disini hanyalah request handler biasa cuman dijalankan dari Task Queue.

Karena worker nya juga request handler, pastinya juga memiliki URL, oleh karena itu URL worker ini juga kita tambahkan ke URL config pada baris code paling bawah.

PERINGATAN

Seperti kita tahu, worker yang kita buat juga memiliki URL seperti biasa, ini artinya kalau ada user yang tahu bahwa URL itu ada, bisa saja si user mengakses URL tersebut dimana tidak kita inginkan.

Untuk itu kita perlu mengamankan setiap URL yang akan di gunakan sebagai Worker dari Task Queue, caranya bisa dilihat disini pada bagian Securing URLs for Tasks.

KESIMPULAN

Penggunaan task Queue sangan berguna untuk menghandle proses-proses yang cukup berat dan memakan waktu, sehingga tidak akan membebani proses request secara langsung.

Google Appengine sebagai cloud platform yang sangat menyenangkan dan banyak fitur dan services yang bisa kita eksplorasi dan manfaatkan secara Gratis.

Untuk penggunaan Task Queue di luar Appengine, misalnnya untuk Django kita bisa manfaatkan Celery + RabbitMQ, mudah-mudahan saya ada kesempatan untuk membahas kedua topik tersebut.

So, keep learning, keep exploring…

One thought on “Easy Task Queue on Google Appengine

  1. Mas, minta tolong. Caranya membuat super user dengan manage.py gimana? Di link web saya sudah saya kasi gambar, nanti mas Eka tolong e-mail saya langkah-langkah nya.

Leave a Reply

Your email address will not be published. Required fields are marked *