Sizin gibi okuyucular MUO'yu desteklemeye yardımcı oluyor. Sitemizdeki bağlantıları kullanarak bir satın alma işlemi gerçekleştirdiğinizde, bir ortaklık komisyonu kazanabiliriz. Devamını oku.

Bir web geliştiricisi olarak, uygulamalarınızın olabildiğince hızlı çalışması çok önemlidir. İsteklere mümkün olan en hızlı sürede yanıt veren web uygulamaları oluşturmalısınız.

Size yardımcı olabilecek birçok teknolojiden biri görev kuyruğudur.

Peki, görev kuyruğu nedir ve bunu bir Node.js uygulamasını optimize etmek için nasıl kullanabilirsiniz?

Görev Sıralaması Nedir?

Mesaj kuyruğa alma, iki uygulama veya hizmet arasında eşzamansız bir iletişim aracıdır ve genellikle üretici Ve tüketici. Sunucusuz ve mikro hizmet mimarilerinde kullanılan iyi bilinen bir kavramdır.

kavramı görev veya kuyruk uygulama performansını iyileştirmek için mesaj kuyruğundan yararlanır. İletileri yönetmenin karmaşıklığını ortadan kaldırır ve işleri veya görevleri bir sıra kullanarak eşzamansız olarak yönetmek için işlevler tanımlamanıza olanak tanır, böylece ileti gönderme hızını azaltır.

instagram viewer
hafıza kullanımı Bir uygulamanın bazı bölümlerinde.

İleti kuyruğu yazılımının en yaygın örneği RabbitMQ'dur. Görev kuyruğu araçları arasında Kereviz ve Boğa bulunur. RabbitMQ'yu bir görev kuyruğu olarak çalışacak şekilde de yapılandırabilirsiniz. Bull kullanarak Node.js'de görev kuyruğu oluşturma hakkında bilgi edinmek için okumaya devam edin.

BullMQ Nedir?

BullMQ (Bull.js), Node uygulamalarında kuyrukları uygulamak için kullanılan bir Node.js kitaplığıdır. Bull, Redis tabanlı bir sistemdir (bir araç olarak Redis'e daha aşina olabilirsiniz. hızlı veri depolama) ve Node.js'de görev kuyruğa alma için göz önünde bulundurulması gereken hızlı ve güvenilir bir seçenektir.

Gecikmeli işler, planlanmış işler, tekrarlanabilir işler, öncelik sıraları ve daha pek çok görev için Bull'u kullanabilirsiniz.

Peki, Node.js görevlerini eşzamansız olarak çalıştırmak için Bull ve Redis'i nasıl kullanabilirsiniz?

Node.js'de Task Queuing için Bull ve Redis'i Yapılandırma

Node.js'de Bull ile görev kuyruğa almaya başlamak için makinenizde Node.js ve Redis'in yüklü olması gerekir. takip edebilirsiniz Redis'i yüklemek için Redis laboratuvarları kılavuzu yüklü değilse.

Bull'u uygulamanın ilk adımı, onu çalıştırarak projenizin bağımlılıklarına eklemektir. npm yükleme boğa veya iplik eklemek boğa projenizin klasörünün içindeki terminalde. Bull'da bir kuyruğu başlatmanın aşağıda gösterildiği gibi birçok yolu vardır:

sabit sıra = gerekmek('Boğa');

// bir kuyruğu başlatmanın farklı yolları
// - redis URL dizesi kullanılarak
sabit e-posta Sırası = yeni Sıra("E-posta Sırası", 'redis://127.0.0.1:6379');

// - redis bağlantısı ve kuyruk seçenekleri nesnesi ile
sabit video Sırası = yeni Sıra("Video Sırası", 'redis://127.0.0.1:6379', kuyruk Seçenekleri);

// - redis bağlantısı olmadan, ancak tailOption ile
sabit belge Sırası = yeni Sıra("Belge Sırası", kuyruk Seçenekleri);

// - redis bağlantısı veya sıra seçenekleri olmadan
sabit QueueClient = yeni Sıra("Kuyruğum");

Bunların tümü, Node.js'de Bull için minimum yapılandırma kullanır. options nesnesi birçok özelliği destekler ve bunlar hakkında bilgi edinebilirsiniz. Bull's belgelerinin kuyruk seçenekleri bölümü.

BullMQ Kullanarak Bir E-posta Görev Kuyruğu Uygulamak

E-posta göndermek için bir sıra uygulamak üzere, e-postaları e-posta kuyruğuna ekleyen üretici işlevinizi ve e-postaların gönderilmesini işlemek için bir tüketici işlevi tanımlayabilirsiniz.

İlk olarak, aşağıda görüldüğü gibi bir Redis URL'si ve bazı kuyruk seçeneklerini kullanarak bir sınıfta sıranızı başlatabilirsiniz.

// tailHandler.js
sabit sıra = gerekmek('Boğa');

// burada gerçek bir e-posta işleyici modülü kullanın - bu sadece bir örnek
sabit e-postaHandler = gerekmek('./emailHandler.js');

// sabitleri, Redis URL'sini ve sıra seçeneklerini tanımlayın
sabit REDIS_URL = 'redis://127.0.0.1:6379';

sabit sıra Seçenekleri = {
// kuyruğun aşırı yüklenmesini önlemek için hız sınırlayıcı seçenekleri
sınırlayıcı: {
// kuyruğun alabileceği maksimum görev sayısı
maks: 100,

// yeni işleri kabul etmeden önce milisaniye cinsinden beklenecek süre
// sınıra ulaşılıyor
süre: 10000
},
önek: 'E-POSTA GÖREVİ', // tüm kuyruk anahtarlarına eklenecek bir önek
varsayılan İş Seçenekleri: { // kuyruktaki görevler için varsayılan seçenekler
denemeler: 3, // bir görevi yeniden denemek için varsayılan sayı

// tamamlandıktan sonra bir görevi sıradan kaldırmak için
Tamamlandığında kaldır: doğru
}
};

sınıfE-posta Sırası{
inşaatçı() {
Bu.kuyruk = yeni Sıra("E-posta Sırası", REDIS_URL, sıraOpts);
}
};

ihracatvarsayılan E-posta Sırası; // sınıfı dışa aktar

Artık bir sıra başlattığınıza göre, üretici işlevinizi tanımlayabilirsiniz (Bull's eklemek() işlevi) bir yöntem olarak E-posta Sırası görev kuyruğuna e-posta eklemek için sınıf. Aşağıdaki kod bloğu bunu göstermektedir:

// tailHandler.js

sınıfE-posta Sırası{
inşaatçı () {
// ...
}

// kuyruğa e-posta eklemek için üretici işlevi
zaman uyumsuz addEmailToQueue (emailData) {
// 'email_notification' adlı görevi kuyruğa ekleyin
beklemekBu.sıra.ekle('Eposta bildirimi', e-postaVerileri);
konsol.kayıt('e-posta kuyruğa eklendi...');
}
};

ihracatvarsayılan E-posta Sırası; // sınıfı dışa aktar

Üretici işlevi hazırdır ve artık bir tüketici işlevi tanımlayabilirsiniz (Bull's işlem() işlevi) kuyruktaki tüm e-posta görevlerini işlemek için — örn. e-posta göndermek için işlevi çağırın. Bu tüketici işlevini sınıfın yapıcısında tanımlamanız gerekir.

// tailHandler.js
sınıfE-posta Sırası{
inşaatçı () {
// ...

// görevin atanan adını alan tüketici işlevi ve
// bir geri arama işlevi
Bu.kuyruk.işlem('Eposta bildirimi', zaman uyumsuz (emailJob, tamamlandı) => {
konsol.kayıt("e-posta bildirimi görevi işleniyor");
beklemek emailHandler.sendEmail (emailJob); // e-postayı gönder
Tamamlandı(); // görevi tamamla
})
}
// ...
};

ihracatvarsayılan E-posta Sırası; // sınıfı dışa aktar

Bir işin kuyruktaki davranışını veya tüketici işlevinin bunu nasıl ele aldığını tanımlama seçenekleri de olabilir. Bununla ilgili daha fazla bilgiyi şurada bulabilirsiniz: Bull's belgelerinin iş seçenekleri bölümü.

bu e-postaİş argüman, kuyruğun işlemesi için görevin özelliklerini içeren bir nesnedir. Ayrıca, e-postayı oluşturmak için gereken ana verileri de içerir.. Kolay anlaşılması için, eposta gönder() işlevi bu örneğe benzer olacaktır:

// emailHandler.js
sabit sendgridMail = gerekmek("@sendgrid/posta");

sabit apiKey = işlem.env. SENDGRID_API_KEY

sendgridMail.setApiKey (apiKey); // e-posta taşıyıcı güvenlik kimlik bilgilerini ayarla

sabit E-posta gönder = zaman uyumsuz (emailJob) => {
denemek {
// e-posta verilerini işten çıkarın
sabit { isim, e-posta } = emailJob.data;

sabit mesaj = {
itibaren: "[email protected]",
ile: "[email protected]",
ders: 'MERHABA! Hoş geldin',
metin: Merhaba ${isim}, MUO`ya hoş geldiniz
};

beklemek sendgridMail.sendMail (mesaj); // eposta gönder

// görevi kuyrukta tamamlandı olarak işaretle
beklemek emailJob.moveToCompleted('Tamamlandı', doğru);
konsol.kayıt('E-posta başarıyla gönderildi...');
} yakalamak (hata) {
// görevi başarısız işlere taşı
beklemek emailJob.moveToFailed({ İleti: 'görev işleme başarısız oldu..' });
konsol.hata (hata); // hatayı günlüğe kaydet
}
}

ihracatvarsayılan eposta gönder;

Artık hem üretici hem de tüketici işlevlerini tanımladığınıza ve kullanıma hazır olduğunuza göre, işlenmek üzere kuyruğa bir e-posta eklemek için uygulamanızın herhangi bir yerinde üretici işlevinizi arayabilirsiniz.

Örnek bir denetleyici şuna benzer:

// userController.js
sabit E-posta Sırası = gerekmek('../handlers/queueHandler.js')

sabit kaydol = zaman uyumsuz (gerekli, res) => {
sabit { isim, e-posta, şifre } = req.body;

// --
// yeni kullanıcıyı Veritabanına eklemek için bir sorgu...
// --

// E-posta kuyruğuna ekle
sabit emailData = { ad, e-posta };
beklemek EmailQueue.addEmailToQueue (emailData);

res.status(200).json({
İleti: "Kayıt başarılı, lütfen e-postanızı kontrol edin"
})
}

Senin tailHandler.js dosya şimdi aşağıdaki gibi olmalıdır:

// tailHandler.js
sabit sıra = gerekmek('Boğa');
sabit e-postaHandler = gerekmek('../handlers/emailHandler.js');

sabit REDIS_URL = 'redis://127.0.0.1:6379';

sabit sıra Seçenekleri = {
sınırlayıcı: {
maks: 100,
süre: 10000
},

önek: 'E-POSTA GÖREVİ',

varsayılan İş Seçenekleri: {
denemeler: 3,
Tamamlandığında kaldır: doğru
}
};

sınıfE-posta Sırası{
inşaatçı() {
Bu.kuyruk = yeni Sıra("E-posta Sırası", REDIS_URL, sıraOpts);

// tüketici
Bu.kuyruk.işlem('Eposta bildirimi', zaman uyumsuz (emailJob, tamamlandı) => {
konsol.kayıt("e-posta bildirimi görevi işleniyor");
beklemek emailHandler.sendEmail (emailJob);
Tamamlandı();
})
}

// üretici
zaman uyumsuz addEmailToQueue (emailData) {
// 'email_notification' adlı görevi kuyruğa ekleyin
beklemekBu.sıra.ekle('Eposta bildirimi', e-postaVerileri);
konsol.kayıt('e-posta kuyruğa eklendi...');
}
};

ihracatvarsayılan E-posta Sırası;

Bunu bir Node.js REST API'sinde uyguladığınızda, kayıt uç noktasının yanıt süresinde azalma ve alternatifine kıyasla daha hızlı e-posta teslim süreleri fark edeceksiniz.

Görev kuyrukları ayrıca kayıt ve e-posta hatalarını bağımsız olarak işlemenizi sağlar.

Görev Kuyruklarını Kullanarak Uygulamaları Optimize Etme

İleti ve görev kuyrukları, uygulamaların genel performansını iyileştirmenin harika bir yoludur. Ayrıca çok ucuzdurlar ve bunları bir uygulamanın ihtiyaç duyduğunuz kadar çok bölümünde kullanabilirsiniz.

Bu eğitimde, kuyruklarla bellek tüketen görevleri işlemek için örnek bir senaryo olarak e-postalar kullanılmış olsa da, aynı kavramları uygulayabileceğiniz başka birçok durum vardır. Bunlar, yoğun okuma/yazma işlemlerini, yüksek kaliteli görüntüleri veya belgeleri işlemeyi ve toplu bildirimler göndermeyi içerir.