Arka Uç Geliştiriciler için En İyi 6 Kuyruk Sistemi
Yayınlanan: 2019-08-09Bir kuyruk sistemi mi arıyorsunuz? Ya da belki daha iyisini mi arıyorsunuz? İşte ihtiyacınız olan tüm bilgiler!
Kuyruk sistemleri, arka uç geliştirmenin en iyi saklanan sırrıdır.
Kuyruk sistemlerini öven bir şiir yazmaya çalışmadan, genç bir arka uç geliştiricisinin, sıraları sisteme entegre etmeyi öğrendikten sonra orta düzey bir arka uç geliştiricisi olduğunu söyleyebilirim. Kuyruklar müşteri deneyimini iyileştirir (nasıl olduğunu göreceğiz), karmaşıklığı azaltır ve bir sistemdeki güvenilirliği artırır.
Elbette, sıfıra yakın trafiğe sahip çok basit web uygulamaları ve broşür web siteleri için, sıralar genel olabilir (veya tipik bir paylaşılan barındırma ortamındaysanız yüklemesi imkansız olabilir), ancak önemsiz olmayan uygulamaların tümü sıraya girmekten kazançlı çıkacaktır. sistemler ve büyük uygulamalar, sıraya girmeden imkansızdır.
Başlamadan önce, bir sorumluluk reddi: Kuyruk sistemleri konusunda zaten rahatsanız ve çeşitli seçenekleri karşılaştırmak istiyorsanız, sonraki birkaç giriş bölümü büyük uykuya neden olacaktır. Bu yüzden hemen ileri atlamaktan çekinmeyin. Giriş bölümleri, yalnızca kuyruk sistemleri hakkında puslu bir fikri olan veya adını geçerken duyanlar içindir.
Kuyruk sistemi nedir?
Kuyruğun ne olduğunu anlayarak başlayalım.
Kuyruk, bilgisayar bilimlerinde çevremizde gördüğümüz gerçek dünya kuyruklarını taklit eden bir veri yapısıdır. Örneğin, bir bilet gişesine giderseniz, kuyruğun sonunda beklemeniz gerektiğini, kuyruğun başındaki kişinin bileti önce alacağını fark edeceksiniz. Bu aynı zamanda “ilk gelen alır” fenomeni dediğimiz şeydir. Bilgisayar biliminde, bunun gibi görevlerini bir sıraya kaydeden ve aynı ilk gelen ilk hizmet esasına göre birer birer işleyen programlar yazmak mümkündür.
Kuyruğun herhangi bir gerçek işlem yapmadığını unutmayın. Bu, görevlerin bir şey tarafından alınana kadar beklediği türden geçici depolamadır. Bunların hepsi biraz fazla soyut geliyorsa, endişelenmeyin. Bu soyut bir kavramdır, ancak bir sonraki bölümde net örnekler göreceğiz.
Neden kuyruk sistemlerine ihtiyacınız var?
Çok uzun bir açıklamaya girmeden, kuyruk sistemlerine olan temel ihtiyacın arka planda işleme, paralel yürütme ve arızadan kurtarma nedeniyle olduğunu söyleyebilirim. Bunları örnekler yardımıyla inceleyelim:
Arka planda işleme
Zamanın çok önemli olduğu bir e-ticaret pazarlama kampanyası yürüttüğünüzü ve uygulamanızın, müşteri ödemeyi tamamlamadan ve "teşekkür ederim" sayfası gösterilmeden hemen önce bir onay e-postası gönderecek şekilde oluşturulduğunu varsayalım. Bağlandığınız posta sunucusu kapalıysa, web sayfası ölür ve kullanıcı deneyimini bozar.
Alacağınız çok sayıda destek talebini hayal edin! Bu durumda, bu e-posta gönderme görevini bir iş kuyruğuna göndermek ve müşteriye başarı sayfasını göstermek daha iyidir.
paralel yürütme
Çoğu geliştirici, özellikle de çoğunlukla daha basit, düşük trafikli uygulamaları kodlayanlar, arka planda işleme için cron işlerini kullanma alışkanlığına sahiptir. Bu, girdinin boyutu temizlenemeyecek kadar büyüyene kadar iyidir. Örneğin, analitik raporları derleyen ve bunları kullanıcılara e-postayla gönderen bir cron işiniz olduğunu ve sisteminizin dakikada 100 rapor işleyebildiğini varsayalım.
Uygulamanız büyüdükçe ve dakikada ortalama 100'den fazla istek almaya başlar başlamaz, giderek daha fazla gerilemeye başlayacak ve hiçbir zaman tüm işleri tamamlayamayacaktır.
Bir kuyruk sisteminde, her biri bir iş seçebilen (her biri yapılacak 100 rapor içeren) ve görevi çok daha erken bitirmek için paralel olarak çalışan birden fazla işçi ayarlanarak bu durum önlenebilir.
Başarısızlıktan kurtarma
Web geliştiricileri olarak genellikle başarısızlığı düşünmüyoruz. Sunucularımızın ve kullandığımız API'lerin her zaman çevrimiçi olacağını kabul ediyoruz. Ancak gerçek farklıdır - ağ kesintileri çok yaygındır ve güvendiğiniz mükemmel API'ler altyapı sorunları nedeniyle çalışmıyor olabilir ("ben değil!" demeden önce, büyük Amazon S3 kesintisini unutmayın). Raporlama örneğine geri dönersek, rapor oluşturma işleminizin bir kısmı ödemeler API'sine bağlanmanızı gerektiriyorsa ve bu bağlantı 2 dakikalığına kapalıysa, başarısız olan 200 rapora ne olur?
Kuyruk sistemleri yine de önemli miktarda ek yük içerir. Yepyeni bir alana adım atarken öğrenme eğrisi oldukça diktir, uygulamanızın ve dağıtımınızın karmaşıklığı artar ve kuyruğa alınan işler her zaman %100 hassasiyetle kontrol edilemez. Bununla birlikte, kuyruklar olmadan bir uygulama oluşturmanın mümkün olmadığı durumlar vardır.
Bunun dışında, bugün kuyruklama arka uçları/sistemleri arasındaki bazı yaygın seçeneklere bir göz atalım.
redis
Redis, veri yapısı hakkında hiçbir bilgisi olmadan yalnızca veri dizilerini depolayan, güncelleyen ve alan bir anahtar/değer deposu olarak bilinir. Bu daha önce doğru olabilirken, bugün Redis, listeler, sıralanmış kümeler ve hatta bir Pub-Sub sistemi gibi verimli ve oldukça kullanışlı veri yapılarına sahiptir ve bu da onu kuyruk uygulamaları için oldukça arzu edilir hale getirir.
Redis'in avantajları şunlardır:
- Tamamen bellek içi veritabanı, daha hızlı okuma/yazma sağlar.
- Yüksek verimli: Saniyede 100.000'den fazla okuma/yazma işlemini kolayca destekleyebilir.
- Son derece esnek kalıcılık şeması. Arıza durumunda olası veri kaybı pahasına maksimum performans elde edebilir veya tutarlılık için performansı feda etmek için tamamen muhafazakar modda kurabilirsiniz.
- Kutunun dışında desteklenen kümeler
Lütfen Redis'in herhangi bir mesajlaşma/kuyruğa alma/kurtarma soyutlaması olmadığını unutmayın, bu nedenle bir paket kullanmanız veya kendiniz hafif bir sistem oluşturmanız gerekir. Bir örnek, Redis'in, çerçeve yazarları tarafından bir zamanlayıcının uygulandığı Laravel PHP çerçevesi için varsayılan kuyruk arka ucu olmasıdır.
Redis'i öğrenmek kolaydır.
TavşanMQ
Redis ve RabbitMQ arasında birkaç ince fark vardır, o yüzden önce onları aradan çıkaralım.
Her şeyden önce, RabbitMQ'nun daha uzmanlaşmış, iyi tanımlanmış bir rolü vardır ve bu nedenle bunu yansıtmak için oluşturulmuştur - mesajlaşma. Diğer bir deyişle, tatlı noktası, iki sistem arasında bir aracı görevi görmesidir; bu, bir veritabanı görevi gören Redis için geçerli değildir. Sonuç olarak, RabbitMQ, Redis'te eksik olan birkaç olanak daha sağlar: mesaj yönlendirme, yeniden denemeler, yük dağıtımı vb.
Bunu düşünürseniz, görev kuyrukları aynı zamanda zamanlayıcının, çalışanların ve işi "göndericilerin" mesaj iletmeye katılan varlıklar olarak düşünülebileceği bir mesajlaşma sistemi olarak da düşünülebilir.

RabbitMQ aşağıdaki avantajlara sahiptir:
- Mesaj geçişi için daha iyi soyutlamalar, ihtiyacınız olan şey mesajlaşma geçişiyse uygulama düzeyindeki çalışmayı azaltır.
- Güç kesintilerine ve kesintilere karşı daha dayanıklı (en azından varsayılan olarak Redis'ten).
- Dağıtılmış dağıtımlar için küme ve federasyon desteği.
- Dağıtımlarınızı yönetmek ve izlemek için faydalı araçlar.
- Orada neredeyse tüm önemsiz olmayan programlama dilleri için destek.
- Seçtiğiniz araçla devreye alma (Docker, Chef, Puppet, vb.).
RabbitMQ ne zaman kullanılır? Eşzamansız mesaj iletimini kullanmanız gerektiğini bildiğinizde ancak bu listedeki diğer sıraya alma seçeneklerinin bazılarının artan karmaşıklığının üstesinden gelmeye hazır olmadığınızda bunun harika bir seçim olduğunu söyleyebilirim (aşağıya bakın).
ActiveMQ
Kurumsal alana giriyorsanız (veya yüksek oranda dağıtılmış ve büyük ölçekli bir uygulama oluşturuyorsanız) ve tekerleği her zaman yeniden icat etmek (ve yol boyunca hatalar yapmak) istemiyorsanız, ActiveMQ bir göz atmaya değer. .
ActiveMQ'nun öne çıktığı yer:
- Java'da uygulanmaktadır ve bu nedenle gerçekten temiz Java entegrasyonuna sahiptir (JMS standardını takip eder).
- Desteklenen çoklu protokoller: AMQP, MQTT, STOMP, OpenWire, vb.
- Güvenlik, yönlendirme, mesaj süresinin dolması, analitik vb.
- Popüler dağıtılmış mesajlaşma kalıpları için hazır destek, zamandan ve maliyetli hatalardan tasarruf etmenizi sağlar.
Bu, ActiveMQ'nun yalnızca Java için kullanılabilir olduğu anlamına gelmez. Python, C/C++, Node, .Net ve diğer ekosistemler için istemcileri vardır, bu nedenle gelecekte olası bir çöküş endişesi olmamalıdır. Ayrıca, ActiveMQ tamamen açık standartlar üzerine kurulmuştur ve kendi hafif istemcilerinizi oluşturmak kolay olmalıdır.
Tüm söylenenler ve yapılanlar, ActiveMQ'nun yalnızca bir aracı olduğunu ve bir arka uç içermediğini lütfen unutmayın. Mesajları depolamak için yine de desteklenen arka uçlardan birini kullanmanız gerekir. Belirli bir programlama diline bağlı olmadığı için buraya ekledim (Kereviz, Sidekiq, vb. gibi diğer popüler çözümler gibi)
Amazon MQ
Amazon MQ burada hızlı ama önemli bir sözü hak ediyor. ActiveMQ'nun ihtiyaçlarınız için ideal çözüm olduğunu düşünüyorsanız, ancak altyapıyı kendiniz oluşturmak ve sürdürmekle uğraşmak istemiyorsanız, Amazon MQ bunun için yönetilen bir hizmet sunar. ActiveMQ'nun yaptığı tüm protokolleri destekler - özelliklerde hiçbir fark yoktur - çünkü ActiveMQ'nun kendisini yüzeyin altında kullanır.

Avantajı, yönetilen bir hizmet olmasıdır, bu nedenle onu kullanmaktan başka bir şey için endişelenmenize gerek yoktur. Diğer hizmetlerden ve tekliflerden doğrudan dağıtımınızın içinden yararlanabileceğiniz için (örneğin daha hızlı veri aktarımları) AWS'deki dağıtımlar için daha da anlamlıdır.
Amazon SQS
Amazon'un kritik altyapı parçaları söz konusu olduğunda sessizce oturmasını bekleyemeyiz, değil mi?
Ve böylece, iyi bilinen dev AWS tarafından tamamen barındırılan, basit bir kuyruk hizmeti (tam anlamıyla) olan Amazon SQS'ye sahibiz. Bir kez daha, ince farklar önemlidir, bu nedenle lütfen SQS'nin mesaj iletme kavramına sahip olmadığını unutmayın. Redis gibi, kuyruklardaki işleri kabul etmek ve dağıtmak için basit bir arka uçtur.
Peki, Amazon SQS'yi ne zaman kullanmak istersiniz? İşte bazı nedenler:
- Bir AWS hayranısınız ve başka hiçbir şeye dokunmayacaksınız (dürüst olmak gerekirse, bunun gibi birçok insan var ve bence bunda yanlış bir şey yok).
- Barındırılan bir çözüme ihtiyacınız var, bu nedenle hata oranının sıfır olduğundan ve işlerin hiçbirinin kaybolmadığından emin olun.
- Bir küme oluşturmak istemezsiniz ve bunu kendiniz izlemek zorunda kalırsınız. Ya da daha kötüsü, o zamanı üretken geliştirme yapmak için kullanabilecekken izleme araçları oluşturmanız gerekir.
- AWS platformuna zaten önemli yatırımlarınız var ve kilitli kalmanız iş açısından mantıklı.
- Mesaj geçişi, protokoller ve diğer şeylerle ilgili herhangi bir tüyün olmadığı, odaklanmış, basit bir kuyruk sistemi istiyorsunuz.
Sonuç olarak, Amazon SQS, iş kuyruklarını sistemlerine dahil etmek isteyen ve bir şeyleri kendi başlarına yükleme/izleme konusunda endişelenmek zorunda olmayan herkes için sağlam bir seçimdir.
fasulye sapı
Beanstalkd uzun süredir piyasada ve iş kuyruğu için savaşta test edilmiş, hızlı ve kolay bir arka uç. Beanstalkd'ı Redis'ten önemli ölçüde farklı kılan birkaç özelliği vardır:
- Bu kesinlikle bir iş kuyruğu sistemi ve başka bir şey değil. Daha sonra iş çalışanları tarafından çekilen işleri ona itiyorsunuz. Bu nedenle, uygulamanızın mesaj iletmeye çok az ihtiyacı varsa, Beanstalkd'dan kaçınmak istersiniz.
- Kümeler, öncelik sıraları vb. gibi gelişmiş veri yapıları yoktur.
- Beanstalkd, İlk Giren İlk Çıkar (FIFO) kuyruğu olarak adlandırılan şeydir. İşleri önceliğe göre düzenlemenin bir yolu yok.
- Kümeleme için herhangi bir seçenek yoktur.
Bütün bunlar, Beanstalkd'ın tek bir sunucuda yaşayan basit projeler için kaygan ve hızlı bir kuyruk sistemi oluşturduğunu söyledi. Birçoğu için Redis'ten daha hızlı ve daha kararlı. Dolayısıyla, Redis ile ne olursa olsun çözemediğiniz sorunlar yaşıyorsanız ve ihtiyaçlarınız basitse, Beanstalkd denemeye değer.
Çözüm
Buraya kadar okuduysanız (veya buraya skim-reading'e ulaştıysanız), kuyruğa alma sistemleriyle ilgilenmeniz veya bir sisteme ihtiyacınız olma ihtimali oldukça yüksektir. Öyleyse, dile/çerçeveye özgü bir kuyruk sistemi aramıyorsanız, bu sayfadaki liste size iyi hizmet edecektir.
Keşke kuyruğa almanın basit ve %100 güvenilir olduğunu söyleyebilseydim, ama değil. Dağınıktır ve her şey arka planda olduğundan ve çok hızlı gerçekleştiğinden (hatalar fark edilmeden gidebilir ve çok maliyetli olabilir). Yine de, sıralar bir noktadan sonra çok gereklidir ve cephaneliğinizde güçlü bir silah (belki de en güçlüsü) olduklarını göreceksiniz. İyi şanlar!