5

Uygulamam yoğun şekilde AWS hizmetlerine dayanıyor ve bunlara dayanarak en uygun çözümü arıyorum. Web Uygulaması, belirli bir miktarda kaynağın gerçekleştirilmesini gerektiren, zamanlanmış bir işi tetikler (sonsuza kadar tekrarlanır). Görevin tek koşulu normalde maksimum 1 dakika sürecektir.AWS hizmetlerini kullanarak uzun süren görevleri zamanlama

Güncel fikir, SQS ve yumurtlama çalışanlarını sıra boyutuna bağlı olarak EC2 örneklerinde geçirmektir. (bu bölüm az ya da çok açıktır) Ancak, belirli aralıklarla işleri gerçekten tetiklemek için uygun bir çözüm bulmaya çalışıyorum. 10000 iş ile uğraştığımızı varsayalım. Yani bir zamanlayıcı 10k cronjobs (işin kendisi oldukça basit, sadece SQS üzerinden iş tanımını geçerek) çalıştırmak için çılgın bir fikir gibi görünüyor. Öyleyse asıl soru, programlayıcıyı otomatik olarak nasıl kaydeder (zamanlayıcı yeniden başlatıldığında, yeni örnek oluşturulurken verilen senaryolar vb.)? Veya programlayıcı bir uygulama olarak gereksizdir ve AWS Lambda işlevlerine (veya zamanlamayı sağlayan diğer hizmetlere) güvenmek akıllıca olur mu? Lambda fonksiyonlarının kullanılması ile ilgili problem belirli bir sınırlamadır ve tek fonksiyon tarafından sağlanan 128MB bellek aslında çok fazladır (20MB, fazlasıyla yeterlidir)

Alternatif olarak, çalışanın kendisi belirli bir süre bekleyebilir ve bildirebilir. Zamanlayıcı, işi bir kez daha tetiklemelidir. Frekans 1 saat ise Diyelim ki:

1. Scheduler sends job to worker 1 
2. Worker 1 performs the job and after one hour sends it back to Scheduler 
3. Scheduler sends the job again 

burada ancak o işçinin olasılığı hangi olur hafif bir zamanlayıcı elde etmek çalışıyorum

Alt Hattı ölçekli olsun edilecektir edilir sorunu. Otomatik ölçeklendirme gerektirmez ve yalnızca iş tanımlarını iletmek için bir merkez görevi görür. Ve kesinlikle servis yeniden başlatıldığında daraltılmamalıdır.

+1

"uzun çalışan görevler" (İşiniz bittiğinde S3 dışına işi silmek için unutmayın) .. "maksimum 1 dk sürer": öneri için/ –

cevap

5

Lambda bunun için mükemmeldir. Çok kısa süreli işlemleriniz var (~ 1 dakika) ve Lambda kısa süreçler için (bugünlerde beş dakikaya kadar). CPU hızının doğrusal olarak RAM'e bağlı olduğunu bilmek çok önemlidir. 1GB Lambda işlevi, doğru bir şekilde hatırladığımda t2.micro örneğine eşdeğerdir ve 1,5GB RAM ise 1,5 kat daha fazla CPU hızı demektir. Bu işlevlerin maliyeti o kadar düşük ki, bunu yalnızca çalıştırabilirsiniz. 128MB RAM, bir mikro örneğinin 1/8 CPU hızına sahiptir, bu yüzden bunları gerçekten kullanmanızı önermiyorum.

Bir sıraya alma mekanizması olarak S3'ü kullanabilirsiniz (evet bu hakkı okuyorsunuz). Bir kepçe oluşturun ve bir nesne oluşturulduğunda Lambda çalışanının tetiklenmesine izin verin. Bir işi planlamak istediğinizde, kovanın içine bir dosya koyun. Lambda hemen başlar ve işler.

Şimdi bazı sınırlamalara saygı göstermelisiniz. Bu sayede aynı anda sadece 100 çalışanınız olabilir (toplam aktif Lambda örneği), ancak AWS'den bunu arttırmasını isteyebilirsiniz.

  • 0,005 1000 başına PUT isteklerini, yani milyon iş istekleri başına 5 $ (bu SQS'in daha pahalıdır) şu şekildedir:

    maliyetlerdir.

  • Lambda çalışma zamanı. Normal t2.micro işlemci hızı (1GB RAM) varsayıldığında, bu, iş başına 0.0001 $ maliyeti (60 saniye, ilk 300.000 saniye serbest = 5000 iş)
  • Lambda istekleri. Milyon dolar başına $ 0.20 (ilk milyon ücretsizdir)

Bu kurulum sizin tarafınızdan herhangi bir sunucu gerektirmez. Bu aşağı inemez (sadece AWS'nin kendisi varsa).

+0

teşekkürler. Bir soru daha, pek çok lambda fonksiyonu doğurmak yerine, sadece bir kaçını yaparız (hadi her 5 dakikada bir, her saatte, günde bir, her gün çalışan ayrı fonksiyonlar yaratıyoruz). Lambda fonksiyonlarının her biri işleri s3'ten alır ve bunları sq'lerden geçirir. Bu mimaride sorunlara neden olabilecek herhangi bir şey var mı? – Yerken

+0

S3 tuşlarının (dosya isimleri) yapısı hakkında düşünmeniz gerekir, bu nedenle lambda işlevleri dosyaları çift içermez (bir lambda işlevi diğerleri hakkında bilinmez). Güzel olan şey, bir S3 etkinliğinde bir lambda fonksiyonunu tetikleyebilmenizdir, bu yüzden asla bu problemi yaşamamış olursunuz. Sonra SQS'ye gönderebilirsiniz (her lambda fonksiyonu bir SQS çağrısına sahiptir, bu bir problem değildir ve <1 saniye sürer). Ama eğer toplu iş yapabildiğiniz halde, partiyi neden 1 SQS biletinde tanımlamıyorsunuz ve S3 ve Lambda hepsini bir arada bırakmıyorsunuz? –

+0

1 SQS biletinde parti tanımlayarak ne demek istediniz? Teşekkürler – Yerken

İlgili konular