3. RabbitMq Load Balancing Üzerine

RabbitMq Load Balancing Üzerine

Availibilitysi yüksek ve performanslı bir yapı için rabbitMq clusterı kurmak işin yarısıdır. Diğer yarısı ise node failure’ına hazırlıklı ve bu durumda clusterda yeni bir node’a nasıl bağlanacağını bilen client uygulaması yazmakır. Bunun için farklı stratejiler olmakla birlikte, bu yazıda load balancing üzerine birşeyler karalayacağım.

Load Balancing

Load balancer aslında adından da anlayacağınız üzere uygulamanız üzerindeki yükü dağıtan bir yapıdır. Load balancer’ı detaylandırmadan önce load balancersız senaryo üzerinde durursak load balancerın yaptığı işi daha iyi anlayacağımızı düşünüyorum.

Bir web siteniz olduğunu varsayın ve bu websiteyi 3 farklı makinaya koydunuz. Domain isimleri de web1.acme.com, web2.acme.com ve web3.acme.com. Client manuel olarak web1.acme.com’a yönelir. web1’in bulunduğu makinanın down olması durumunda web2ye ya da web3’e yine manuel yönelir. Ancak bu durumda bile web1, web2 ve web3teki yük hakkında bilgi ve kontrol’e  dahi sahip olamayız.

Load balancer, makinalarınızı arkasına alarak size tek bir IP adress verir ve client bu IP adresine karşılık gelen domaine yöneldiği zaman, load balancer makinalarınızdan yükü en düşük olan makineye requesti otomatik olarak yönlendirir. Yine aynı şekilde makinalarınızdan biri çökerse load balancer bunu fark eder ve otomatik olarak requestleri o makinaya yönlendirmeyi keser. Kullanıcı gözünden bakıldığında ise tüm sistem sanki tek bir makinaymış gibi görülür.

RabbitMq clusteriniz ile load balancer kullanmak isterseniz, rabbitMq nodelarınız ana serverlarınız, consumer ve producerlar da clientlarınız olmuş olacak. Bu client applerinizin de tek bileceği load balancer IP’si olacak. İlerleyen zamanlarda clusterınızın gücünü arttırmak isterseniz de tek yapmanız gereken clustera yeni bir node eklemektir. Uygulama tarafında ise hiç bir değişikliğe ihtiyacınız olmayacaktır.

Failure Durumları

Bir cluster node’u çöktüğünde, uygulamanız nereye bağlanacağına karar vermeli. Bu soruya cevap vermeden önce de uygulamanızda bunun hazırlıklarını yapmış olmanız gerekir.

Bir clustera sahip olmanız sonrasında hiç problem yaşamayacağınız anlamına gelmez. Sadece herhangi bir problem yaşandığında işleri sürdürmek için gidecek başka yeriniz var anlamına gelir. Bu durumda ilk yapmanız gereken daha uygulamalarınızı yazarken bazı varsayımlarda bulunmaktır.

  1. Eğer yeni bir servera bağlanırsam, chanellarıma ve onlara attached olmuş consumption looplar ne olacak? Artık geçersiz olacaklar ve hiç bir yere hedeflenmeyecekler. İkisini de tekrardan oluşturman gerekecek.
  2. Down olan node’a tekrar bağlandığımda, tüm exchangelerim, queuelarım ve bindinglerim hala orada olacak mı ? Tekrar bağlanıp direkt olarak queuedan consume edebilir miyim? Hayır. Tüm queueların artık olmadığını varsaymalısın.  Eğer rabbitmq’nun built-in clusterını kullanıyorsan exchangelerin node failure durumda bile tüm nodelara replika olduğundan yaşadığını varsayabilirsin.

Buradan anlaşılacak olan, rabbitmqda hiçbirşeyi fail over to new node durumunda stateful varsaymamamız. Herseferinde sanki diğer queuelarla hiç bir ilişkisi olmayan yepyeni bir rabbitmq’ya bağlanıyormuş gibi geliştirme yapmamız gerekir.