Pada tutorial Implementasi Microservices dengan Laravel Events Queues (part 1) kita sudah membahas bagaimana cara untuk membuat events listeners pada laravel, pada kesempatan ini kita akan mencoba untuk menjalankan listener yang sudah kita buat tadi secara background dengan laravel queues. yuk disimak…
Introduction
Laravel Queues merupakan fitur queue yang ada pada laravel, saat ini laravel queues telah mensupport berbagai jenis queue system mulai dari database, redis, hingga AmazonSQS. dengan laravel queues ini kita bisa mengurangi proses yang memakan waktu proses lama pada aplikasi kita, dengan memasukkan proses itu dalam queue dan menjalankanya pada background system atau dijalankan oleh modul lain pada server lain. contoh proses yang biasanya dimasukkan ke queue diantaranya mengirim email register, re-kalkulasi inventory dan lainnya.
Goal
Pada tutorial ini tujuan kita adalah menjalankan listener yang kita buat tadi secara terpisah dengan aplikasi utama melalui queue. driver queue yang akan kita gunakan sekarang adalah driver database.
Menjalankan Laravel Events Listeners pada Queues
berikut adalah langkah-langkah untuk membuat aplikasi microservices menggunakan laravel events listeners dan queues:
Konfigurasi Driver Queues
Sebelum bisa menggunakan laravel queues kita harus melakukan setup driver yang akan kita gunakan, konfigurasi driver bisa kita temukan pada ‘config/queue.php’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
<?php return [ /* |-------------------------------------------------------------------------- | Default Queue Driver |-------------------------------------------------------------------------- | | The Laravel queue API supports a variety of back-ends via an unified | API, giving you convenient access to each back-end using the same | syntax for each one. Here you may set the default queue driver. | | Supported: "null", "sync", "database", "beanstalkd", | "sqs", "iron", "redis" | */ 'default' => env('QUEUE_DRIVER', 'sync'), /* |-------------------------------------------------------------------------- | Queue Connections |-------------------------------------------------------------------------- | | Here you may configure the connection information for each server that | is used by your application. A default configuration has been added | for each back-end shipped with Laravel. You are free to add more. | */ 'connections' => [ 'sync' => [ 'driver' => 'sync', ], 'database' => [ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'default', 'expire' => 60, ], 'beanstalkd' => [ 'driver' => 'beanstalkd', 'host' => 'localhost', 'queue' => 'default', 'ttr' => 60, ], 'sqs' => [ 'driver' => 'sqs', 'key' => 'your-public-key', 'secret' => 'your-secret-key', 'queue' => 'your-queue-url', 'region' => 'us-east-1', ], 'iron' => [ 'driver' => 'iron', 'host' => 'mq-aws-us-east-1.iron.io', 'token' => 'your-token', 'project' => 'your-project-id', 'queue' => 'your-queue-name', 'encrypt' => true, ], 'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'expire' => 60, ], ], /* |-------------------------------------------------------------------------- | Failed Queue Jobs |-------------------------------------------------------------------------- | | These options configure the behavior of failed queue job logging so you | can control which database and table are used to store the jobs that | have failed. You may change them to any database / table you wish. | */ 'failed' => [ 'database' => env('DB_CONNECTION', 'mysql'), 'table' => 'failed_jobs', ], ]; |
kita juga bisa memilih driver yang kita gunakan melalui file environmnet ‘.env‘ kita sebagai berikut :
1 2 3 4 5 6 7 8 9 10 11 |
PP_ENV=local APP_DEBUG=true APP_KEY=NgrP1cHjdntgkjhsn2JDAuTWiwEq81Gx DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_DATABASE=test_job DB_USERNAME=root DB_PASSWORD= QUEUE_DRIVER=database |
setelah seting configurasi, selanjutnya kita akan membuat table queue pada database kita dengan bantuan php artisan sebagai berikut :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ php artisan queue:table Migration created successfully! $ php artisan migrate ************************************** * Application In Production! * ************************************** Do you really wish to run this command? (yes/no) [no]: > yes Migration table created successfully. Migrated: 2017_06_01_230908_create_jobs_table $ php artisan queue:failed-table Migration created successfully! $ php artisan migrate ************************************** * Application In Production! * ************************************** Do you really wish to run this command? (yes/no) [no]: > yes Migrated: 2017_06_01_232101_create_failed_jobs_table |
kutipan diatas akan menjalankan perintah untuk membuat 2 table untuk queue yaitu table jobs untuk queue active dan failed_jobs untuk jobs yang gagal dijalankan sejumlah max retry, sebagai berikut :
Konfigurasi class Listeners dengan Queues
Selanjutnya kita akan membuat sebuah class listeners dapat dijalankan dalam queues. agar listeners dapat dijalankan dalam queues kita harus meng-implement contracts ‘ShouldQueue’ pada class listener, dan jika ingin menggunakan fitur2 lainnya kita bisa menggunakan ‘use InteractsWithQueue’ didalan class, sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<?php namespace App\Listeners; use App\Events\NewUserRegistered; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class EmailRegisteredUser implements ShouldQueue { use InteractsWithQueue; /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param NewUserRegistered $event * @return void */ public function handle(NewUserRegistered $event) { //job echo "kirim email ke : ".$event->email; // untuk release proses ketika gagal $this->release(30); // jika gagal 3x apa yang dilakukan if ($this->attempts() > 3) { //code } } } |
Test Menjalankan Queues
Kita dapat melakukan testing apakah events listeners kita bisa masuk ke dalam queues dengan cara menjalankan aplikasi dan melihat isi table pada jobs, sebagai berikut :
terlihat handle pada listener tidak dijalankan langsung ketika kita melakukan request, hal ini terjadi karena handle listener sudah dimasukkan ke dalam queues, kita dapat melihat queues pada table jobs, sebagai berikut:
untuk menjalankan job pada queues kita harus menjalankan laravel queue listener pada server yang akan menjalankan job tersebut, sebagai berikut:
Bisa kita bayangkan jika jobs yang dijalankan adalah job berat misal mengirim email ke banyak user, atau copresi video/gambar akan membuat pengguna aplikasi jengkel akan aplikasi kita.
Troubleshoot Queues
Anda bisa mengecek job yang gagal dijalankan pada table failed_jobs yang telah dibuat tadi, jobs gagal akan secara otomatis dimasukkan ke table failed_jobs sesuai dengan setingan ‘–tries=[max retries]‘ ketika anda menjalankan queue listener.
Kesimpulan
Mengimplementasikan Microservices dengan laravel events listeners dan queues sangatlah membantu mempercepat aplikasi kita. kita bisa memecah proses – proses dari aplikasi menjadi blok-blok kecil, terpisah, dan fokus pada tugas-tugas ringan pada sistem, dan bisa dijalankan secara terdistribusi pada sistem yang berbeda.
Programmer juga nyambi di bidang system dan infrastuktur. Berpengalaman sebagai System Engineer sejak tahun 2013. Selama beberapa tahun terakhir bekerja di salah satu Bank BUMN.