Message Broker - Beyin Firtinasi
-
Selamlar herkese
Depremden dolayi icin hepinize cok gecmis olsun. Umarim tbt ailesinden kimse zarar görmemistir.
Bir sistem sorum olacak, biraz beyin firtinasi da iyi olabilir diye düsündügüm icin burada konu acmak istedim.
Kafamda asagidaki gibi temel düzeyde bir sistem kurdum, her kutucuk birbirinden bagimsiz makinelerde olacak (ya da belki docker).
Service 1: Veri saglacisi. Bu server verileri cekip yollayacak. Örnek olarak 200 ms'de en az 1000 veri (veri boyutlari cok büyük degil, belk 50-100 byte)
Service 2: Bu servisimiz gelen verileri isleyecek, cesitli matematiksel hesaplamalar yapacak ve filtereden gecenleri subscribe olmus (abone) client'lara yollayacak. Ayni zamanda verileri redis'e kaydedecek. En agir islerin oldugu kisim burasi.
Clientlar: Bunlar da Service 2'ye subscribe olmus programciklar ve Service 2'den gelen verilere göre kendi tasklarini yapacaklar.
Asagida görsellesmis hali mevcut
Burada sormak istedigim olay message broker olayi. Hem service 1- service 2 arasinda ve de service 2- clientlar arasinda bir message broker kullanmak istiyorum.
Daha önce az biraz azure hub ile calistim (ancak projede azure ya da baska bir hazir bir cloud kullanmayacagim). Ayrica yine bir kac projede SignalR kullandim, iyi calissa da performans olarak biraz hantal oldugunu düsünüyorum (en azindan aklimda öyle kaldi).
Kafamda iki tane cözüm var. RabbitMQ ve Kafka. Bir kac yil önce RabbitMQ ile basit bir kac sey yapmistim ama onun disinda her hangi düzgün bir projede kullanmadim.
Okudugum kadariyla pub-sub yapisina en uygun Kafka gibi görünüyor. Ayrica Kafka streaming projeleri icin uygun, her ne kadar benim projemde streaming olmasa da kesintisiz bir veri akisi söz konusu. Kuyruklama olayi da benim acimdan gereksik. Ve Kafta saniyede 1 milyon mesaji isleyebiliyormus, ki mükemmel bir hiz.
surda güzel bir karsilastirma yazisi var.
Kisaca üstte kurdugum sistem icin, servisler arasi veri iletisimi icin Kafka'yi kullanmayi düsünüyorum.
Sizin fikirlerinizi, önerilerinizi duymak isterim.
Tesekkürler
-
-
hipokondriyak bunu yazdı
cevap icin tesekkürler hocam. Streaming ya da video, büyük dosya vs yok. Zaten stream dedigimiz sey aslinda asenkron olarak datalarin sürekli gitmesi, ki benim ki de böyle bir sey. Cünkü yazdigim gibi 200 ms'de 1000 veri gidecek ki bu baslangic hali, cok yakin zamanda bu veri 10 bine de cikacak.
zerMQ 'yu duydum ama hic bakmadim, QmQ'yi duymadim bunlara bir bakayim.
Ayrica kafka sunucu istemiyor hocam, docker ile bile calisabiliyor
https://kafka.apache.org/intro
bu üstteki linktekini de sabah bir okuyayim
-
Aradigim cevabi sanirim buldum
-
unbalanced bunu yazdı
Aradigim cevabi sanirim buldum
tam olarak bu iş için zamanında apache mosquitto kullandım hocam. mqttv3 kullanıyor. çok basit pub/sub yapısı var. epey lightweight bir şey. Kafka ya da rabbitmq gibi yönetim vs ihtiyaçları da yok. Kur topicleri ayarla çalışsın bir yapısı var.
-
@sLeymN mosquitto'yi duydum baya ama hic denemedim. Ornek bir proje buldum, arkadasa yolladim bir denesin bakalim, mesela 10 ms'de veri gönderme olayina bakalim nasil calisiyor, sonra süreyi daha da düsürüp deneyelim. Lightweight olmasi bizim isimize gelir tabi ki. Tesekkürler önerin icin
-
hocam ihtitaçların için rabbitten ziyade kafka daha iyi duruyor. uptime min limitinize göre işler karışabilir ama :/
-
sunucuya ayıracak paranız çok heralde
ya da google çalışanı falan mısın
saniyede 1m data gönderebilen sistem ne için lazım
ne kaynak yer o anasını yiyim
para var huzur var
kaçtım
-
Redis'e dönemedim bari buna hemen döneyim :)
Şimdi aslında tam yapılmak istenen nedir, event-driven architecture yapıp microservisler arasında iletişim mi? sadece uygulamalar arasında async iletişim mi yoksa çok büyük bir veri akışı olacak(streaming) ve bunu karşılayacak bir ara katman mı lazım? Bu soruların haricinde MQ'a yazılan verilerin sıralı olarak okunması şart mı? Bir kere mi okunacaklar yoksa birden fazla kere okunacaklar mı?
RabbitMQ sana mesajların sıralı okunmasını garanti ederken Kafka daha kolay büyümene ve birden fazla kere farklı servisin aynı mesajı tüketebilmesini sağlar.
Kafka ile devam edecekse iki kurulum senaryosu var, zookeeper ve metadata veritabanıyla kurabilirsin. Benim önerim zookeer'lı kurman kendi metadata veri tabanı hala çok iyi performans göstermiyor.
Kafka'da topic yapısının altında her broker üzerinde bir veya birden fazla o topic için partition bulunur, partitionlar diskte mesajların(kafka'da log diye geçer) yazıldığı alandır ve her partition 20mb/s şeklinde limite sahiptir, performans ihtiyaçlarını buna göre planlamanı öneririm.
Kafka'da offset çalışma mantığını ve consumer group çalışma mantığını iyi anlamanı öneririm çünkü aynı topic'i birden fazla aynı işi yapan uygulama tüketecekse aynı consumer grouba alman lazım yoksa çift mesaj işlenir, ikinci notkaysa her offset partition başına ayrıdır bundan dolayı kafka mesajları yazıldığı sırayla okunamayabilir. Bunun çeşitli çözümleri var ama producer veya consumer tarafında çözmeni öneririm sakın kafka'yı buna zorlama.
Kafka kurulumunu yaptıktan sonra offset'lerin tutulduğu özel bir topic var, bu topic'in birden fazla partition ve replication'ı olduğuna emin ol yoksa leader broker giderse sistem durur failover yapmaz.
son olarak SASL_SSL ile broker'ları ayarlarsa ileride farklı roller ve ihtiyaçlara göre yetkilendirmen kolay olur.
Sorun olursa yaz bana kafkayla baya kafayı kırmıştım
Şuradaki komutlarlada performans testleri yaparsın
https://www.clairvoyant.ai/blog/benchmarking-kafka
-
TeRRoR bunu yazdı
hocam ihtitaçların için rabbitten ziyade kafka daha iyi duruyor. uptime min limitinize göre işler karışabilir ama :/
@sLeymN in dedigi gibi mosquitto'yi denedim, az biraz performans kaybi görünse de beklentilerimizi karsiliyor gibi görünüyor. Kurulumu ve kullanimi baya basit. Bizim amacimiz sadece veri göndermek ve bunu iyi bir performans alabilecegimiz sekilde yapmak
@taskafa Birden fazla veri kaynagi var hocam, ama öyle anlik milyonluk bir akisa ihtiyac yok zaten. Yavas yavas veri kaynaklarini arttiracagiz ona göre de sistemi scale etmek gerekecek.
@sandman tesekkürler detayli aciklamalar ve bilgiler icin. Anladigim kadariyla bu kafka cok profesynel amaclarla kullaniliyor, cok fazla detay ve dikkat edilecek seyler var. Dün bir kac video kurcaladim, temel seylerini ögrendim hatta egitim seti de satin aldim.
Suan bir kac kaynagi sisteme baglayip mosquitto ile baglayip, iki farkli makine üzerinden bir deneme yapayim, Orada istedigimiz karsilaniyorsa, kafka'ya girmeyi düsünmüyorum. Ama sistem iyi calismazsa mecburen bu tarz bir cözüm kullanacagim, o zaman tekrar sorarim sana :)
Aslinda yaptigimiz testlerde sunu farkettik, veri kaynagindan gelen data'nin service 2'ye mslik hizlarda gitmesine gerek yok, sistem kayiplari tolere edebilir, ayrica sirali olmasinin da hic bir önemi yok. O sebeple basit bir sistem isimizi görecek gibi görünüyor
Tüm cevaplar icin tesekkürler.
-
hocam sırf meraktan soruyorum madem sistemde redis var, mb olarak da neden redis i kullanmıyorsun : https://redis.com/solutions/use-cases/messaging/ bunu sormamın sebebi bende büyük bir projeyi BullJS ile Redis yapisina taşıyorum bir sıkıntı var mı bu konuda yaşadığınız.