SNS-SQS yerine neden Amazon Kinesis kullanmalıyım?


164

Veri akışının geleceği bir kullanım durumum var ve aynı hızda tüketemiyorum ve bir tampona ihtiyacım yok. Bu bir SNS-SQS kuyruğu kullanılarak çözülebilir. Kinesis'in aynı amacı çözdüğünü öğrendim, fark ne? Neden Kinesis'i tercih etmeliyim (ya da tercih etmemeliyim)?

Yanıtlar:


59

Yüzeyde belirsiz bir şekilde benzerler, ancak kullanım durumunuz hangi aracın uygun olduğunu belirleyecektir. IMO, eğer SQS ile başa çıkabiliyorsanız - istediğinizi yapacaksa, daha basit ve daha ucuz olacak, ancak burada her iki araç için uygun kullanım durumlarına örnekler veren AWS SSS'den daha iyi bir açıklama var. karar vermenize yardımcı olun:

SSS



80

Bu cevabın Haziran 2015 için doğru olduğunu unutmayın

Sorunu bir süre inceledikten sonra, aynı soruyu akılda tutarak, mesajların sırası sizin için önemli olmadıkça SQS'nin (SNS ile) çoğu kullanım için tercih edildiğini buldum (SQS, mesajlarda FIFO'yu garanti etmiyor).

Kinesis için 2 ana avantaj vardır:

  1. aynı mesajı birkaç uygulamadan okuyabilirsiniz
  2. gerektiğinde mesajları tekrar okuyabilirsiniz.

Her iki avantaj da SNS'yi SQS'ye bir fan olarak kullanarak elde edilebilir. Bu, mesajın üreticisinin SNS'ye yalnızca bir mesaj göndereceği anlamına gelir, O zaman SNS hayranları mesajı her tüketici uygulaması için bir tane olmak üzere birden fazla SQS'ye gönderir. Bu şekilde, kırma kapasitesini düşünmeden istediğiniz kadar tüketiciye sahip olabilirsiniz.

Ayrıca, SNS'ye abone olan ve 14 gün boyunca mesaj tutacak bir SQS daha ekledik. Normal durumda hiç kimse bu SQS'den okumaz, ancak verileri geri sarmamızı sağlayan bir hata durumunda, bu SQS'deki tüm mesajları kolayca okuyabilir ve SNS'ye tekrar gönderebiliriz. Kinesis ise sadece 7 günlük saklama sağlar.

Sonuç olarak, SNS + SQS'ler çok daha kolaydır ve çoğu yetenek sağlar. IMO, Kinesis'i seçmek için gerçekten güçlü bir davaya ihtiyacınız var.


2
Bilginize: Kinesis'in 7 güne kadar saklanmasını sağlayabilirsiniz.
Didier A.

30
Kısa süre önce AWS, mesajların zaman sırasına göre hizmet verebilecek SQS FIFO [ docs.aws.amazon.com/AWSSimpleQueueService/latest/… ' ı duyurdu .
VijeshJain

4
süper küçük yorum - muhtemelen kelimesini kullanmak ister splitiçinde SNS split the message to multiple SQSso parçalar ama birden fazla hedefe kopyalar o iletileri yıkmak olmadığından.
Mobigital

2
Kinesis, parça / saniye başına okuyucu sayısı etrafındaki sınırlamalar nedeniyle fan çıkışı (pub-sub) kullanım durumları için uygun değildir. Orijinal soruşturma ile ilgili olmasa da, n-okuyuculara Kinesis ölçeklendirmesine güvenen herkes bu gerçeği dikkate almalıdır. forums.aws.amazon.com/message.jspa?messageID=760351
codeasone

2
Kinesis'in sipariş garantisi, akış başına değil, parça başıdır. Birden fazla kırığa sahip olduğunuzda, tüm akışın sipariş konusunda garantisi yoktur. SQS kuyruğunda, verim nispeten düşük olduğunda, neredeyse FIFO'dur. Sadece veriminiz yükseldiğinde, sipariş daha az takip edilir. Bu, klasik SQS kuyruklarıyla ilgilidir, FIFO kuyruklarıyla değil.
yoroto

54

Kinesis, aynı veri kayıtlarının aynı saatte veya farklı saatlerde farklı saatlerde 24 saat içinde işlenebileceği anlamına gelen çoklu tüketici yeteneklerini destekler, SQS'deki benzer davranış birden fazla kuyruğa yazılarak elde edilebilir ve tüketiciler birden fazla kuyruktan okuyabilir. Ancak tekrar birden fazla kuyruğa yazmak sistemde alt saniye {az milisaniye} gecikme süresi katacaktır.

İkincisi, Kinesis belirli EC2 örnekleri tarafından işlenebilen ve mikro yığın hesaplamasını {Sayma ve toplama} etkinleştirebilen bölüm anahtarını kullanarak farklı parçalara seçici yol veri kayıtlarına yönlendirme yeteneği sağlar.

Herhangi bir AWS yazılımı üzerinde çalışmak kolaydır, ancak SQS ile en kolay olanıdır. Kinesis ile, zamanın ötesinde yeterli kırıkları sağlamaya, başak yükünü yönetmek için kırıntıların sayısını dinamik olarak arttırmaya ve yönetmek için gereken maliyeti düşürmek için azalmaya ihtiyaç vardır. Kinesis'te ağrı, SQS ile böyle bir şeye gerek yok. SQS sonsuz ölçeklenebilir.


11
SQS hakkında açıklama hakkında. Onlardan önce bir SNS ile aynı mesajı birden fazla SQS'ye göndermenin kolay bir yolunu elde edebilirsiniz.
Roee Gavirel

8
app -> sns konu ---> sqs1, sqs2, sqs3 ...?
kartik

4
Evet, tam olarak bu yaklaşımdan bahsediyordum.
Roee Gavirel

@ RoeeGavirel Peki ya sns api için istek / ikinci sınırlamalar?
Barbaros Alp

@BarbarosAlp - Yalnızca konu dışı SMS (mobil metin mesajları) sınırlamasının farkındayım. Bu resmi belgeler: docs.aws.amazon.com/general/latest/gr/…
Roee Gavirel

43

Bu teknolojilerin semantiği farklıdır çünkü farklı senaryoları desteklemek üzere tasarlanmıştır:

  • SNS / SQS: akıştaki öğeler birbiriyle ilişkili değil
  • Kinesis: Akıştaki öğeler birbiriyle ilişkilidir

Farkı örnek olarak anlayalım.

  1. Bir sipariş akışımız olduğunu varsayalım, her sipariş için biraz stok ayırmamız ve bir teslimat planlamamız gerekiyor. Bu tamamlandığında, öğeyi akıştan güvenli bir şekilde kaldırabilir ve bir sonraki siparişi işlemeye başlayabiliriz. Biz tam edilir yapılması önümüzdeki birini başlamadan önce bir önceki sipariş ile.
  2. Yine, aynı sipariş akışına sahibiz, ancak şimdi hedefimiz siparişleri varış noktalarına göre gruplandırmak. Aynı yere 10 sipariş verdikten sonra, bunları birlikte teslim etmek istiyoruz (teslimat optimizasyonu). Şimdi hikaye farklı: akıştan yeni bir öğe aldığımızda, onu işlemeyi bitiremeyiz; daha ziyade amacımızı karşılamak için daha fazla ürün gelmesini "beklemek". Ayrıca, işlemci süreci çökerse, durumu "geri yüklememiz" gerekir (bu nedenle hiçbir sipariş kaybolmaz).

Bir öğenin işlenmesi başka bir öğenin işlenmesinden ayrılamazsa, tüm durumları güvenli bir şekilde ele almak için Kinesis semantiğine sahip olmalıyız.


SQS FIFO kuyruğunda, iletilerin gönderildikleri sırada sıralanmasını sağlayacağız. Bu SQS'yi bu açıdan Kinesis'e benzetir mi?
Andy Dufresne

1
@AndyDufresne: bu, siparişin önemli olduğu senaryoyu iyi kapsar. Yukarıdaki durumda (1), siparişleri "sırayla" ele almak isteyebilirsiniz. Bu nedenle, stokunuz biterse, daha sonraki siparişler reddedilir veya ertelenir. FIFO anlambilimi çekirdek görelilik (gruplama) problemini çözmez.
Konstantin Triger

35

AWS Belgelerinden Alıntı :

Aşağıdakine benzer gereksinimlere sahip kullanım durumları için Amazon Kinesis Akışlarını öneriyoruz:

  • İlgili kayıtları aynı kayıt işlemcisine yönlendirme (akış MapReduce'da olduğu gibi). Örneğin, belirli bir anahtar için tüm kayıtlar aynı kayıt işlemcisine yönlendirildiğinde sayma ve toplama daha basittir.

  • Kayıtların sıralanması. Örneğin, günlük verilerinin sırasını korurken günlük verilerini uygulama ana bilgisayarından işleme / arşiv ana bilgisayarına aktarmak istersiniz.

  • Birden fazla uygulamanın aynı akışı aynı anda tüketebilmesi. Örneğin, gerçek zamanlı bir gösterge tablosunu güncelleyen bir uygulamanız ve Amazon Redshift'e veri arşivleyen bir uygulamanız var. Her iki uygulamanın da aynı akıştaki verileri aynı anda ve bağımsız olarak tüketmesini istiyorsunuz.

  • Birkaç saat sonra kayıtları aynı sırayla tüketebilme. Örneğin, bir faturalandırma uygulamanız ve faturalandırma uygulamasının birkaç saat gerisinde çalışan bir denetim uygulamanız var. Amazon Kinesis Streams, verileri 7 güne kadar sakladığından, denetim uygulamasını faturalandırma uygulamasının 7 gününe kadar çalıştırabilirsiniz.

Aşağıdakilere benzer gereksinimlere sahip kullanım durumları için Amazon SQS'yi öneririz:

  • Mesajlaşma semantiği (mesaj düzeyinde ack / başarısız) ve görünürlük zaman aşımı. Örneğin, bir iş öğesi kuyruğunuz var ve her bir öğenin başarıyla tamamlandığını bağımsız olarak izlemek istiyorsunuz. Amazon SQS ack / başarısızlığı izler, böylece uygulamanın kalıcı bir kontrol noktası / imleç tutması gerekmez. Amazon SQS yapılandırılmış bir görünürlük zaman aşımı süresinden sonra saldırıya uğramış iletileri siler ve başarısız iletileri yeniden gönderir.

  • Bireysel mesaj gecikmesi. Örneğin, bir iş kuyruğunuz var ve bireysel işleri gecikmeli olarak zamanlamanız gerekiyor. Amazon SQS ile bireysel mesajları 15 dakikaya kadar gecikecek şekilde yapılandırabilirsiniz.

  • Okuma zamanında eşzamanlılık / işlem hacmini dinamik olarak artırın. Örneğin, bir çalışma kuyruğunuz var ve biriktirme listesi temizlenene kadar daha fazla okuyucu eklemek istiyorsunuz. Amazon Kinesis Streams ile, yeterli sayıda kırığı ölçeklendirebilirsiniz (ancak, önceden yeterli kırıkları sağlamanız gerektiğini unutmayın).

  • Amazon SQS'nin şeffaf bir şekilde ölçeklendirme yeteneğinden yararlanmak. Örneğin, ara sıra yük artışları veya işletmenizin doğal büyümesi nedeniyle talepleri arabelleğe alırsınız ve yük değişir. Arabelleğe alınan her istek bağımsız olarak işlenebileceğinden, Amazon SQS sizden herhangi bir provizyon talimatı olmadan yükü ele almak için şeffaf bir şekilde ölçeklendirilebilir.


34

Benim için en büyük avantaj, Kinesis'in tekrarlanabilir bir kuyruk olması ve SQS'nin olmaması. Böylece SQS ile, bir mesaj onaylandıktan sonra, bu kuyruktan çıktığı aynı Kinesis mesajlarından (veya farklı zamanlarda aynı tüketiciden) birden fazla tüketiciniz olabilir. SQS bundan dolayı işçi kuyrukları için daha iyidir.


Mesajı nasıl alırsınız? Şunu mu demek istediniz: delete
NeverEndingQueue

Evet, esasen. Bu mesajla işin bittiğini söyleyerek
Matthew Curry

15

Başka bir şey: Kinesis bir Lambda'yı tetikleyebilirken, SQS yapamaz. Yani SQS ile ya SQS mesajlarını işlemek için bir EC2 örneği sağlamanız (ve başarısız olursa onunla başa çıkmanız) ya da zamanlanmış bir Lambda'ya sahip olmanız gerekir (bu ölçek büyütülmez veya küçülmez - dakikada sadece bir tane alırsınız) .

Düzenle: Bu cevap artık doğru değil. SQS, Haziran 2018 itibariyle Lambda'yı doğrudan tetikleyebilir

https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html


1
-1 Katılmıyorum. Kinesis lambda'yı tetikleyebilirken, bu, sheduled SQS lambda'ya göre hiçbir avantaj sağlamaz. İkincisi sorunsuz bir şekilde ölçeklendirilir (yani bir dakikadan uzun sürerse ikinci bir lambda bükülür). Fiyat hesaplama süresi başına yani orada önemli bir fark ya. Ve 5'ten fazla eşzamanlı lambdaya ihtiyacınız varsa, sadece birkaç saniye arayla planlanan birden fazla tetikleyici ekleyin (cron kullanarak). Bu Kinesis'i SNS / SQS üzerinde kullanmak için bir neden değildir.
Steven de Salas

5
Anlaşmazlığa katıldığımdan emin değilim;] - bir lambda / dakika planlayabilirsiniz, bu da o aralığa ulaşan mesajları toplu işlemeyle sınırlar. Kinesis mesajları hemen okumanıza izin verir. Yoksa yanlış anladığım bir şey mi?
Moszi

SQS'ye karşı çeken lambda'yı çağırmanız gerektiğinde birkaç bulut saati tetikleyicisi ile yüzlerce arasında büyük bir fark var.
Domuzu Kodlama

14
Lambda artık tetikleyici olarak SQS'yi destekliyor!
sixty4bit

11

Fiyatlandırma modelleri farklıdır, bu nedenle kullanım durumunuza bağlı olarak biri veya diğeri daha ucuz olabilir. En basit durumu kullanarak (SNS hariç):

  • İleti başına SQS ücretleri (her 64 KB bir istek olarak sayılır).
  • Kırık başına saat başına Kinesis ücreti (1 parça, 1000 mesaja veya 1 MB / saniyeye kadar işleyebilir) ve ayrıca koyduğunuz veri miktarı için (her 25 KB).

Mevcut fiyatları takıp ücretsiz katmanı hesaba katmamakla, maksimum mesaj boyutunda günde 1 GB mesaj gönderirseniz, Kinesis'in maliyeti SQS'den (Kinesis için 10,82 $ / ay, SQS için 0,20 $ / ay) . Ancak günde 1 TB gönderirseniz, Kinesis biraz daha ucuzdur (SQS için aylık 158 $ / 201 $).

Ayrıntılar: SQS, milyon istek başına 0,40 $ (her biri 64 KB) tutarındadır, bu nedenle GB başına 0,00655 dolar. Günde 1 GB ile bu ayda 0.20 doların biraz altında; Günde 1 TB, ayda 201 $ biraz fazla geliyor.

Kinesis milyon istek başına 0,014 dolar (her biri 25 KB) ücret alır, bu nedenle GB başına 0.00059 dolar. Günde 1 GB ile, bu ayda 0.02 $ 'dan azdır; Günde 1 TB, ayda yaklaşık 18 $. Bununla birlikte, Kinesis ayrıca kırk saat başına 0,015 dolar ücret alır. Saniyede 1 MB başına en az 1 parçaya ihtiyacınız vardır. Günde 1 GB, 1 parça bol olacak, böylece ayda toplam 10.82 $ maliyet için günde 0.36 $ daha ekleyecektir. Günde 1 TB'de, ayda toplam 158 ABD doları karşılığında günde 4,68 ABD doları ekleyen en az 13 parçaya ihtiyacınız olacak.


Burada, boyuttaki üstel artışın neden önemli olduğunu tam olarak takip etmiyorum. Biraz daha kazabilir misin? Kulağa sahip olmak istediğim içgörü var gibi görünüyor. Edit Aslında, Euguene Feingold'un cevabına bakarak, bu konuda oldukça sağlam bir tartışma var gibi görünüyor (?).
Thomas

Üzgünüm, hesaplamalarda bazı hatalar yaptım (şimdi düzeltildi, umarım).
John Velonis

doğru, ancak ortalama SQS mesajınızın boyutu küçükse, 1kb veya daha az diyelim?
mcmillab

1
@ cmcmlablab SQS, mesajınız 1 KB veya 64 KB olsun aynı ücreti alır - Amazon'un SQS fiyatlandırma sayfasına bakın . İletileriniz yalnızca 1 KB ise, aynı miktarda veri gönderiyorsanız SQS, yukarıda verdiğim rakamların 64 katı kadardır. Ancak, tek bir istek en fazla 10 ileti içerebilir, bu nedenle iletileri toplu halde topluyorsanız, yalnızca 6 kat daha fazla olabilir (toplu işlerinizin doluluk oranına bağlı olarak).
John Velonis

1
@JohnVelonis SQS fiyatlandırması için yukarıdaki hesaplamalarda önemli bir parça eksik. SQS taleplerinin nasıl ücretlendirildiğini anlamak için ekstra özen gerekmektedir. 1 istek = 1 API Eylemi. Tek bir "mesajı" işlemek için en az 3 API işlemi gerçekleştirmek gerekir: 1 gönderme + 1 okuma + 1 silme. Görünürlüğü değiştirme gibi diğer SQS özellikleri daha fazla API işlemi gerektirecektir. Bu beklenmedik çarpan oldukça kötüdür ve tipik olarak SQS'nin büyük veri setleri için Kinesis Akışlarından 2-10 kat daha pahalı olmasına neden olur (örneğin ayda 100 milyon mesaj işleniyor).
19'da Vlad Poskatcheev

9

Kinesis, veri akışı için tipik bir harita azaltma senaryosunda harita parçası sorununu çözer. SQS bundan emin değilken. Bir anahtarda toplanması gereken akış verileriniz varsa, kinesis, o anahtarın tüm verilerinin belirli bir parçaya gittiğinden ve parça, anahtar üzerindeki toplama işlemini SQS'ye göre daha kolay hale getiren tek bir ana bilgisayarda tüketilebildiğinden emin olur.


5

Kimsenin bahsetmediği bir şey daha ekleyeceğim - SQS, birkaç büyüklük sırası daha pahalı.


3
Emin misiniz? Hesaplamamdan Kinesis çok daha pahalı, ama Amazon Basit Fiyat Hesaplayıcı'yı kullanarak hiç yetenekli olmadım.
Didier

Aws'daki şu anki fiyatlandırma örneklerine bakıldığında: 267M mesajlarına sahip Kinesis 60 $ civarında, SQS aracılığıyla bu miktarda mesaj koymak 107 $ ile sonuçlanacak. Açıkçası, gerçekten hızlı bir karşılaştırma yaptım ve bu farklı kullanım durumlarıyla oldukça farklı, ancak bu cevap kesinlikle bazı kredileri hak etmeli.
Moszi

1
Günde 2 tüketici ve 100 milyon mesaj demek için bir fan yaptığınızı varsayın. SNS maliyeti günlük 50 $ 'dır. SQS maliyeti günlük 40 $ / tüketici veya toplam 80 $ / gün'dür. Kinesis PUT'lar için günde 1,4 $ ve 0,36 $ / parça. 100 parça ile bile (100 MB / s giriş, 200 MB / s çıkış) günde sadece 3.60 $ + 1.40 $ / gün. Yani Kinesis 4 $ / gün, SNS / SQS ise 130 $ / gün.
Carlos Rendon

@Moszi Bu hesaplamaya nasıl geldiniz? Ayda 15.000.000 mesaj ve standart olarak 10GB veri aktarımı ve veri aktarımı ile standart bir SQS kuyruğu sadece 5,60USD / ay, Kinesis'te ise 256KB yük (SQS max) ve ~ 15,000,000 PUT birimi / ay (130 kırıntı) maliyeti 1.638,43 USD / ay.
simoncpu

3
Bu iş parçacığında neden maliyetlerde böyle bir eşitsizlik olduğunu bilmek isterim.
Thomas

2

Kinesis Kullanım Durumları

  • Günlük ve Olay Verilerinin Toplanması
  • Gerçek Zamanlı Analiz
  • Mobil Veri Yakalama
  • “Nesnelerin İnterneti” Veri Beslemesi

SQS Kullanım Örnekleri

  • Uygulama entegrasyonu
  • Mikro hizmetlerin ayrıştırılması
  • Görevleri birden çok çalışan düğümüne ayırma
  • Yoğun arka plan çalışmasından canlı kullanıcı isteklerini ayırın
  • Gelecekteki işlemler için toplu mesajlar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.