Manage Queue dengan Celery dan RabbitMQ

Subscribe Dengan Account Google Untuk Membaca Artikel Tanpa Iklan
Manage Queue dengan Celery dan RabbitMQ

Celery adalah system penggelola antrian (task-queue) yang menangani distribusi task pada workers. Celery membuat menajemen task asinkron menjadi mudah, aplikasi anda hanya perlu mendorong pesan ke broker seperti RabbitMQ.

Celery dapat digunakan dalam berbagai konfigurasi. Salah satunya yang sering digunakan adalah mengelola task asinkron yang panjang pada aplikasi web, contohnya seperti pembuatan thumbnail saat pengguna memposting gambar.

Di artikel sebelumnya kita telah membahas tentang message broker dengan RabbitMQ. sebelum mengikuti tutorial ini pastikan bahwa kamu telah bekerja di lingkungan environment, kalau belum pelajari terlebih dahulu bagaimana cara membuat virtual environment untuk project python anda ?.

Install Celery



  • buat sebuat virtual environment dengan nama sample_celery

  • install celery dengan menggunakan pip


perhatikan gambar di bawah ini

install celery dan python

 

Task Queue Dengan Celery


Celery terdiri dari 2 bagian yaitu workers dan client

  • workers adalah yang menunggu pesan dari RabbitMQ dan menjalankan tugas

  • client  dalah yang mengirim pesan ke RabbitMQ untuk memicu pelaksanaan tugas, dan akhirnya mengambil hasilnya di lain waktu


Tasks didefinisikan dalam modul yang akan digunakan baik oleh workers dan client. Workers akan menjalankan kode untuk menjalankan tasks, dan client hanya akan menggunakan definisi fungsi untuk mengeksposnya dan menyembunyikan kompleksitas penerbitan RabbitMQ.
Buat sebuah file dengan nama downloaderApp.py

from celery import Celery
import urllib.request
import os

# Where the downloaded files will be stored
BASEDIR="/home/pyton_project/alfin/samplecelery"

# Create the app and set the broker location (RabbitMQ)
app = Celery('downloaderApp',
backend='rpc://',
broker='pyamqp://guest@localhost//')

@app.task
def download(url, filename):
"""
Download a page and save it to the BASEDIR directory
url: the url to download
filename: the filename used to save the url in BASEDIR
"""
response = urllib.request.urlopen(url)
data = response.read()
with open(BASEDIR+"/"+filename,'wb') as file:
file.write(data)
file.close()

@app.task
def list():
""" Return an array of all downloaded files """
return os.listdir(BASEDIR)

Semua keajaiban terjadi di anotasi @app.task. Ini memberitahu celery bahwa fungsi ini tidak akan berjalan pada client, tetapi dikirim ke workers melalui RabbitMQ. Semua konfigurasi celery terjadi di baris berikut:

app = Celery('downloaderApp', backend='rpc://', broker='pyamqp://guest@localhost//')


Catatan:


  • donwloaderApp akan di jadikan sebagai celery aplication name dengan inisial A

  • broker, alamat host yang akan menerima pesan via * Advanced Message Queuing Protocol (AMQP), merupakan protokol yang digunakan oleh RabbitMQ.

  • response,  workers akan menyimpan nilai pengembalian task sehingga klien dapat mengambilnya nanti (ingat bahwa pelaksanaan task tidak sinkron). Jika Anda menghilangkan backend, tasks akan tetap berjalan, tetapi nilai kembali akan hilang. rpc berarti response akan dikirim ke antrian RabbitMQ dalam pola Panggilan Prosedur Jarak Jauh.


Start Workers



  • buat sebuh file untuk melakukan testing dengan nama test.py

  • buka tab baru pada terminal anda pastikan dan aktifkan environment

  • jalankan perintah ini pada terminal anda ( celery -A downloaderApp worker --loglevel=debug )


Perhatikan gambar dan code dibawah ini

test.py

from downloaderApp import download,list
r = download.delay('https://property145.com/media/documents/agent/property_10/tanah-kavling.png', 'property145.png')
r.ready()

running celery

test celeryDemo:

Baca artikel lainya :


link : download full source code