Çok kullanılan bir API için sunucu kurulumum


9

Yakında başlatmak üzere olduğum bir uygulama için bir grup sunucu satın alacağım, ancak kurulumumla ilgili endişelerim var. Aldığım geri bildirimler için teşekkür ederim.

Yazdığım bir API'yı kullanacak bir uygulamam var. Diğer kullanıcılar / geliştiriciler de bu API'yı kullanacaktır. API sunucusu istekleri alacak ve bunları çalışan sunuculara aktaracaktır. API yalnızca günlüğe kaydetme, kimlik doğrulama ve hız sınırlama için istekleri mysql db tutar.

Her çalışan sunucu farklı bir iş yapar ve gelecekte ölçeklendirmek için iş alabilmek için daha fazla çalışan sunucu ekleyeceğim. API yapılandırma dosyası, yeni çalışan sunucuları dikkate alacak şekilde düzenlenir. İşçi sunucuları bazı işlemler yapacak ve bazıları daha sonra uygulamamda görüntülenecek API tarafından alınacak bir görüntünün yolunu yerel veritabanına kaydedecek, bazıları işlemin sonucunun dizelerini döndürecek ve bunu yerel bir veritabanına kaydedecektir. .

Bu kurulum sizin için verimli görünüyor mu? Bunu yeniden yapılandırmanın daha iyi bir yolu var mı? Hangi konuları dikkate almalıyım? Lütfen aşağıdaki resme bakın, umarım anlamaya yardımcı olur.resim açıklamasını buraya girin

Yanıtlar:


17

Daha Yüksek Kullanılabilirlik

Chris'in belirttiği gibi, API sunucunuz mizanpajınızdaki tek hata noktasıdır. Ayarladığınız, birçok kişinin daha önce uyguladığı bir mesaj kuyruğu altyapısı.

Aynı yolda devam et

API sunucusunda istekleri aldığınızdan ve işi her sunucuda çalışan bir MySQL DB'ye eklediğinizden emin olun. Bu yolda devam etmek istiyorsanız, API sunucu katmanını kaldırmanızı ve İşçilerin her birini doğrudan API Kullanıcılarınızdan kabul komutları için tasarlamanızı öneririm. Her API Kullanıcı bağlantısını doğrudan kullanılabilir çalışan düğümlerden birine dağıtmak için yuvarlak devirli DNS kadar basit bir şey kullanabilirsiniz (ve bir bağlantı başarılı olmazsa yeniden deneyin).

Message Queue Sunucusu Kullanma

Daha sağlam ileti kuyruğu altyapıları, bu amaç için tasarlanmış ActiveMQ gibi yazılımlar kullanır . API Kullanıcılarından POST isteklerini kabul etmek için ActiveMQ'nun RESTful API'sini kullanabilirsiniz ve boş çalışanlar kuyruktaki bir sonraki mesajı ALABİLİR. Ancak, bu muhtemelen ihtiyaçlarınız için aşırı doludur - saniyede gecikme, hız ve milyonlarca mesaj için tasarlanmıştır.

Zookeeper kullanın

Orta yol olarak, özellikle bir ileti kuyruğu sunucusu olmasa da Zookeeper'a bakmak isteyebilirsiniz . Bu iş için $ işte kullanıyoruz. Zookeeper sunucu yazılımını çalıştıran ve kullanıcılardan ve uygulamalardan gelen istekleri işlemek için bir web ön ucuna sahip olan üç sunucumuz var (API sunucunuza benzer). Web ön ucunun yanı sıra, işçilerle Zookeeper arka uç bağlantısı, bir sunucu bakım için kapalı olsa bile kuyruğu işlemeye devam ettiğimizden emin olmak için bir yük dengeleyiciye sahiptir. İş tamamlandığında, işçi Zookeeper kümesine işin tamamlandığını söyler. Bir işçi ölürse, o işi tamamlamak için başka bir işe gönderilir.

Diğer endişeler

  • Bir işçinin yanıt vermemesi durumunda işlerin tamamlandığından emin olun
  • API bir işin tamamlandığını ve işçinin veritabanından alınacağını nasıl bilecek?
  • Karmaşıklığı azaltmaya çalışın. Her çalışan düğümünde bağımsız bir MySQL sunucusuna mı ihtiyacınız var, yoksa bunlar API sunucularındaki MySQL sunucusuyla (veya çoğaltılmış MySQL Kümesi) konuşabilir mi?
  • Güvenlik. Herkes iş gönderebilir mi? Kimlik doğrulaması var mı?
  • Bir sonraki işi hangi işçi almalı? Görevlerin 10ms veya 1 saat sürmesi beklenmiyor. Hızlıysa, gecikmeyi azaltmak için katmanları kaldırmalısınız. Yavaşsa, daha kısa taleplerin birkaç uzun süren işin arkasına takılmadığından emin olmak için çok dikkatli olmalısınız.

mükemmel cevabınız için çok teşekkür ederim. API katmanının bir darboğaz olduğunu biliyordum, ancak uygulama kullanıcılarının el ile bilmelerine izin vermeden daha fazla çalışan sunucu ekleyebilmemin tek yolu gibi görünüyordu. Cevabınızı tam olarak okuduktan sonra, evet, her çalışanın kendi API'sı olması daha iyi olacağını fark ettim. Daha fazla işçi ekledikçe kod çoğaltılacak olsa da, senaryom için daha performanslı.
Abs

@Abs - İlk oylamam için teşekkürler! API katmanını kaldırmaya karar verirseniz, yuvarlak robin DNS yapmamanızı ve bu makalede açıklandığı gibi HAProxy (tercihen bir çift) kurmanızı öneririz . Bu şekilde zaman aşımlarıyla uğraşmanıza gerek kalmaz.
Fanatik

@abs , API katmanını kaldırmak zorunda değilsiniz , ancak artıklık (CARP yük devretme veya benzeri) eklemek, tek hata noktasını ortadan kaldırmak için önemli bir
faktör olacaktır

Biraz mesajlaşma gider karar vermeden önce RabbitMQ yakından bakmak öneririz: rabbitmq.com
Antonius Bloch

2

Gördüğüm en büyük sorun yük devretme planlamasının olmaması.

API sunucunuz büyük bir hata noktasıdır. Aşağı inerse, çalışan sunucularınız hala işlevsel olsa bile hiçbir şey çalışmaz. Ayrıca, bir çalışan sunucu çökerse, sunucunun sağladığı hizmet artık kullanılamaz.

Yük dengeleme ve yük devretmenin nasıl çalıştığı hakkında bir fikir edinmek ve bunların tasarımınıza nasıl fayda sağlayabileceği hakkında bir fikir edinmek için Linux Sanal Sunucusu projesine ( http://www.linuxvirtualserver.org/ ) bakmanızı öneririm .

Sisteminizi yapılandırmanın birçok yolu vardır. Hangi yolun daha iyi olduğu sizin tarafınızdan en iyi cevaplanan öznel bir çağrıdır. Biraz araştırma yapmanızı öneririm; farklı yöntemlerin dengesini tartmak. Bir implantasyon yöntemi hakkında bilgi almanız gerekiyorsa, yeni bir soru gönderin.


Bu senaryoda bir başarısızlık mekanizmasını nasıl uygularsınız? Genel bir bakış harika olurdu.
Abs

Diyagramınızdan Linux Sanal Sunucusu'nu (LVS) araştırmalısınız. Linuxvirtualserver.org adresine gidin ve yapabileceğiniz her şeyi öğrenmeye başlayın.
Chris Ting

İlginç, genel olarak yük devretme ve bunun yerine bakacağım. Kurulumum hakkında başka yorumlarınız var mı? Karşılaşabileceğim başka tehlikeler var mı?
Abs

@Abs: Karşılaşabileceğiniz birçok sorun var. Sorunuzda birçok öznel bölüm var ve sizi kişisel olarak yaptığım şeylere yerleştirmek istemiyorum. Kurulumunuzu desteklememe gerek yok; siz yapıyorsunuz. Gerçek cevabım, yük devretme ve yüksek kullanılabilirlik hakkında bilgi edinmek.
Chris Ting
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.