6 Sistem Antrian Teratas untuk Pengembang Backend

Diterbitkan: 2019-08-09

Apakah Anda mencari sistem antrian? Atau mungkin Anda sedang mencari yang lebih baik? Inilah semua info yang Anda butuhkan!

Sistem antrian adalah rahasia terbaik dari pengembangan backend.

Tanpa mencoba menulis puisi untuk memuji sistem antrian, saya akan mengatakan bahwa pengembang backend junior menjadi pengembang backend tingkat menengah setelah dia belajar mengintegrasikan antrian ke dalam sistem. Antrian meningkatkan pengalaman pelanggan (kita akan lihat caranya), mengurangi kompleksitas, dan meningkatkan keandalan dalam suatu sistem.

Tentu, untuk aplikasi web yang sangat sederhana dengan lalu lintas hampir nol dan situs web brosur, antrean bisa menjadi keseluruhan (atau bahkan tidak mungkin dipasang jika Anda menggunakan lingkungan shared-hosting yang umum), tetapi aplikasi non-sepele semua akan mendapatkan keuntungan dari antrian sistem, dan aplikasi besar tidak mungkin tanpa melibatkan antrian.

Sebelum kita mulai, penafian: jika Anda sudah nyaman dengan sistem antrian dan ingin membandingkan berbagai opsi, beberapa bagian pengantar berikutnya akan menyebabkan tidur nyenyak. Jadi jangan ragu untuk melompat ke depan. Bagian pengantar ditujukan bagi mereka yang hanya memiliki gagasan kabur tentang sistem antrian atau hanya mendengar namanya secara sepintas.

Apa itu sistem antrian?

Mari kita mulai dengan memahami apa itu antrian.

Antrian adalah struktur data dalam ilmu komputer yang meniru, yah, antrian dunia nyata yang kita lihat di sekitar kita. Jika Anda pergi ke loket tiket, misalnya, Anda akan melihat bahwa Anda harus berdiri di akhir antrian, sedangkan orang di awal antrian akan mendapatkan tiket terlebih dahulu. Inilah yang juga kami sebut sebagai fenomena “yang pertama datang, yang pertama dilayani”. Dalam ilmu komputer, dimungkinkan untuk menulis program yang menyimpan tugas-tugasnya seperti ini dalam antrian, memprosesnya satu per satu dengan basis yang sama siapa cepat dia dapat.

Perhatikan bahwa antrian tidak melakukan pemrosesan aktual itu sendiri. Ini hanya semacam penyimpanan sementara di mana tugas menunggu sampai diambil oleh sesuatu. Jika ini semua terdengar agak terlalu abstrak, jangan khawatir. Ini adalah konsep abstrak, tetapi kita akan melihat contoh yang jelas di bagian selanjutnya.

Mengapa Anda membutuhkan sistem antrian?

Tanpa masuk ke deskripsi yang sangat panjang, saya akan mengatakan kebutuhan utama untuk sistem antrian adalah karena pemrosesan latar belakang, eksekusi paralel, dan pemulihan dari kegagalan. Mari kita lihat ini dengan bantuan contoh:

Pemrosesan latar belakang

Misalkan Anda menjalankan kampanye pemasaran e-niaga di mana waktu sangat penting, dan aplikasi Anda dibuat sehingga mengirimkan email konfirmasi tepat sebelum pelanggan menyelesaikan pembayaran dan halaman "terima kasih" ditampilkan. Jika server email yang Anda sambungkan sedang down, halaman web akan mati begitu saja, mengganggu pengalaman pengguna.

Bayangkan tingginya jumlah permintaan dukungan yang akan Anda dapatkan! Dalam hal ini, lebih baik untuk mendorong tugas pengiriman email ini ke antrean pekerjaan dan menunjukkan kepada pelanggan halaman sukses.

Eksekusi paralel

Banyak pengembang, terutama mereka yang kebanyakan mengkodekan aplikasi dengan lalu lintas rendah yang lebih sederhana, memiliki kebiasaan menggunakan pekerjaan cron untuk pemrosesan latar belakang. Ini baik-baik saja sampai ukuran input tumbuh begitu besar sehingga tidak dapat dihapus. Misalnya, Anda memiliki tugas cron yang mengkompilasi laporan analitik dan mengirimkannya melalui email kepada pengguna dan sistem Anda dapat memproses 100 laporan per menit.

Segera setelah aplikasi Anda tumbuh dan mulai mendapatkan rata-rata lebih dari 100 permintaan per menit, aplikasi itu akan semakin tertinggal dan tidak akan pernah bisa menyelesaikan semua pekerjaan.

Dalam sistem antrian, situasi ini dapat dihindari dengan menyiapkan beberapa pekerja, yang masing-masing dapat memilih pekerjaan (masing-masing berisi 100 laporan yang harus diselesaikan) dan bekerja secara paralel untuk menyelesaikan tugas lebih cepat.

Pemulihan dari kegagalan

Kami umumnya tidak menganggap kegagalan sebagai pengembang web. Kami menerima begitu saja bahwa server kami dan API yang kami gunakan akan selalu online. Tetapi kenyataannya berbeda — pemadaman jaringan terlalu umum, dan API luar biasa yang Anda andalkan mungkin sedang down karena masalah infrastruktur (sebelum Anda mengatakan "bukan saya!", Jangan lupakan pemadaman Amazon S3 besar-besaran). Jadi, kembali ke contoh pelaporan, jika bagian dari pembuatan laporan mengharuskan Anda terhubung ke API pembayaran dan koneksi tersebut terputus selama 2 menit, apa yang terjadi dengan 200 laporan yang gagal?

Sistem antrian memang melibatkan overhead yang cukup besar. Kurva pembelajaran cukup curam saat Anda memasuki domain yang sama sekali baru, kompleksitas aplikasi dan penerapan Anda meningkat dan pekerjaan yang antri tidak selalu dapat dikontrol dengan presisi 100%. Yang mengatakan, ada situasi ketika membangun aplikasi tanpa antrian tidak mungkin.

Dengan itu, mari kita lihat beberapa opsi umum di antara backend/sistem antrian hari ini.

Redis

Redis dikenal sebagai penyimpanan nilai kunci yang hanya menyimpan, memperbarui, dan mengambil string data tanpa pengetahuan tentang struktur data. Sementara itu mungkin benar sebelumnya, hari ini Redis memiliki struktur data yang efisien dan sangat berguna seperti daftar, kumpulan yang diurutkan, dan bahkan sistem Pub-Sub, membuatnya sangat diinginkan untuk implementasi antrian.

Kelebihan Redis adalah:

  • Basis data dalam memori sepenuhnya, menghasilkan pembacaan/penulisan yang lebih cepat.
  • Sangat efisien: Dapat dengan mudah mendukung lebih dari 100.000 operasi baca/tulis per detik.
  • Skema persistensi yang sangat fleksibel. Anda bisa mendapatkan kinerja maksimal dengan mengorbankan kemungkinan kehilangan data jika terjadi kegagalan atau mengatur dalam mode konservatif sepenuhnya untuk mengorbankan kinerja demi konsistensi.
  • Cluster didukung di luar kotak

Harap dicatat bahwa Redis tidak memiliki abstraksi perpesanan/antrian/pemulihan, jadi Anda perlu menggunakan paket atau membangun sistem yang ringan sendiri. Contohnya adalah bahwa Redis adalah backend antrian default untuk kerangka kerja PHP Laravel, di mana penjadwal telah diimplementasikan oleh pembuat kerangka kerja.

Belajar Redis itu mudah.

KelinciMQ

Ada beberapa perbedaan halus antara Redis dan RabbitMQ, jadi mari kita singkirkan dulu.

Pertama-tama, RabbitMQ memiliki peran yang lebih terspesialisasi dan terdefinisi dengan baik, dan karenanya dibangun untuk mencerminkan hal itu — perpesanan. Dengan kata lain, sweet spot-nya adalah bertindak sebagai perantara antara dua sistem, yang tidak berlaku untuk Redis, yang bertindak sebagai database. Akibatnya, RabbitMQ menyediakan beberapa fasilitas lagi yang tidak ada di Redis: perutean pesan, percobaan ulang, distribusi beban, dll.

Jika Anda memikirkannya, antrian tugas juga dapat dianggap sebagai sistem pengiriman pesan, di mana penjadwal, pekerja, dan "pengirim" pekerjaan dapat dianggap sebagai entitas yang berpartisipasi dalam pengiriman pesan.

RabbitMQ memiliki keunggulan sebagai berikut:

  • Abstraksi yang lebih baik untuk pengiriman pesan, mengurangi pekerjaan tingkat aplikasi jika pengiriman pesan adalah yang Anda butuhkan.
  • Lebih tahan terhadap kegagalan daya dan pemadaman listrik (daripada Redis, setidaknya secara default).
  • Dukungan cluster dan federasi untuk penerapan terdistribusi.
  • Alat yang berguna untuk mengelola dan memantau penerapan Anda.
  • Dukungan untuk hampir semua bahasa pemrograman non-sepele di luar sana.
  • Deployment dengan alat pilihan Anda (Docker, Chef, Puppet, dll.).

Kapan menggunakan RabbitMQ? Saya akan mengatakan itu adalah pilihan yang bagus ketika Anda tahu Anda perlu menggunakan pengiriman pesan asinkron tetapi tidak siap untuk mengatasi kompleksitas yang menjulang dari beberapa opsi antrian lain dalam daftar ini (lihat di bawah).

AktifMQ

Jika Anda masuk ke ruang perusahaan (atau membangun aplikasi yang sangat terdistribusi dan berskala besar), dan Anda tidak ingin harus menemukan kembali roda sepanjang waktu (dan membuat kesalahan di sepanjang jalan), ActiveMQ layak untuk dilihat .

Di sinilah ActiveMQ unggul:

  • Ini diimplementasikan di Java dan memiliki integrasi Java yang sangat rapi (mengikuti standar JMS).
  • Beberapa protokol yang didukung: AMQP, MQTT, STOMP, OpenWire, dll.
  • Menangani keamanan, perutean, kedaluwarsa pesan, analitik, dll., di luar kotak.
  • Dukungan terpadu untuk pola perpesanan terdistribusi populer, menghemat waktu Anda dan kesalahan yang mahal.

Itu tidak berarti bahwa ActiveMQ hanya tersedia untuk Java. Ini memiliki klien untuk Python, C/C++, Node, .Net, dan ekosistem lainnya, jadi seharusnya tidak ada kekhawatiran akan kemungkinan keruntuhan di masa mendatang. Selain itu, ActiveMQ dibangun di atas standar yang sepenuhnya terbuka dan membangun klien ringan Anda sendiri seharusnya mudah.

Semua yang dikatakan dan dilakukan, perlu diketahui bahwa ActiveMQ hanyalah broker dan tidak termasuk backend. Anda masih perlu menggunakan salah satu backend yang didukung untuk menyimpan pesan. Saya memasukkannya di sini karena tidak terikat dengan bahasa pemrograman tertentu (seperti solusi populer lainnya seperti Seledri, Sidekiq, dll.)

Amazon MQ

Amazon MQ layak disebutkan dengan cepat tetapi penting di sini. Jika menurut Anda ActiveMQ adalah solusi ideal untuk kebutuhan Anda tetapi tidak ingin berurusan dengan pembangunan dan pemeliharaan infrastruktur sendiri, Amazon MQ menawarkan layanan terkelola untuk melakukannya. Ini mendukung semua protokol yang dilakukan ActiveMQ — tidak ada perbedaan fitur sama sekali — karena ia menggunakan ActiveMQ sendiri di bawah permukaan.

Video Youtube

Keuntungannya adalah layanan terkelola, jadi Anda tidak perlu khawatir tentang apa pun selain menggunakannya. Lebih masuk akal untuk penerapan yang ada di AWS, karena Anda dapat memanfaatkan layanan dan penawaran lain langsung dari dalam penerapan Anda (transfer data yang lebih cepat, misalnya).

Amazon SQS

Kita tidak bisa mengharapkan Amazon untuk duduk diam dalam hal infrastruktur penting, bukan?

Jadi kami memiliki Amazon SQS, yang merupakan layanan antrean sederhana yang dihosting sepenuhnya (secara harfiah) oleh raksasa AWS yang terkenal. Sekali lagi, perbedaan halus itu penting, jadi harap dicatat bahwa SQS tidak memiliki konsep penyampaian pesan. Seperti Redis, ini adalah backend sederhana untuk menerima dan mendistribusikan pekerjaan dalam antrian.

Jadi, kapan Anda ingin menggunakan Amazon SQS? Berikut beberapa alasannya:

  • Anda adalah penggemar AWS dan tidak akan menyentuh apa pun (jujur, ada banyak orang di luar sana yang seperti itu, dan saya pikir tidak ada yang salah dengan itu).
  • Anda memerlukan solusi yang dihosting, jadi pastikan tingkat kegagalannya nol dan tidak ada pekerjaan yang hilang.
  • Anda tidak ingin membangun sebuah cluster dan harus memantaunya sendiri. Atau lebih buruk lagi, harus membangun alat pemantauan ketika Anda dapat menggunakan waktu itu untuk melakukan pengembangan yang produktif.
  • Anda sudah memiliki investasi besar di platform AWS dan tetap terkunci dalam bisnis adalah hal yang masuk akal.
  • Anda menginginkan sistem antrian yang terfokus dan sederhana tanpa masalah apa pun yang terkait dengan pengiriman pesan, protokol, dan yang lainnya.

Secara keseluruhan, Amazon SQS adalah pilihan tepat bagi siapa saja yang ingin memasukkan antrean pekerjaan ke dalam sistem mereka dan tidak perlu khawatir menginstal/memantau sesuatu sendiri.

Pohon kacang

Beanstalkd telah ada sejak lama dan merupakan backend yang teruji pertempuran, cepat, dan mudah untuk antrian pekerjaan. Ada beberapa karakteristik Pohon Kacang yang membuatnya sangat berbeda dari Redis:

  • Ini benar-benar sistem antrian pekerjaan dan tidak ada yang lain. Anda mendorong pekerjaan ke sana, yang kemudian ditarik oleh pekerja pekerjaan. Jadi, jika aplikasi Anda bahkan memiliki sedikit kebutuhan untuk pengiriman pesan, Anda sebaiknya menghindari Beanstalkd.
  • Tidak ada struktur data lanjutan seperti set, antrian prioritas, dll.
  • Pohon Kacang adalah apa yang disebut antrian First In, First Out (FIFO). Tidak ada cara untuk mengatur pekerjaan berdasarkan prioritas.
  • Tidak ada opsi untuk pengelompokan.

Semua ini mengatakan Beanstalkd membuat sistem antrian yang apik dan cepat untuk proyek sederhana yang hidup di satu server. Bagi banyak orang, ini lebih cepat dan lebih stabil daripada Redis. Jadi, jika Anda mengalami masalah dengan Redis yang sepertinya tidak dapat Anda selesaikan, apa pun yang terjadi, dan kebutuhan Anda sederhana, Beanstalkd patut dicoba.

Kesimpulan

Jika Anda telah membaca sejauh ini (atau sampai di sini membaca sekilas), ada kemungkinan Anda tertarik dengan sistem antrian atau membutuhkannya. Jika demikian, daftar di halaman ini akan membantu Anda dengan baik, kecuali jika Anda mencari sistem antrian khusus bahasa/kerangka.

Saya berharap saya dapat memberi tahu Anda bahwa antrian itu sederhana dan 100% dapat diandalkan, tetapi ternyata tidak. Ini berantakan, dan karena semuanya ada di latar belakang dan terjadi dengan sangat cepat (kesalahan dapat luput dari perhatian dan menjadi sangat mahal). Namun, antrian sangat diperlukan di luar titik, dan Anda akan menemukan bahwa itu adalah senjata yang ampuh (bahkan mungkin yang paling kuat) di gudang senjata Anda. Semoga beruntung!