

İki Farklı Socket.IO (Node.Js) Uygulamasını Nasıl Bağlarız, Fikri Olan Var Mı?
-
Selamlar,
Farklı ip ya da port larla socket.io vasıtasıyla clientlerle iletişim kuran sunucular düşünün.
SUNUCU1 üzerinde diyelim ki biri chat odası oluşturdu:
socket.join(room_id);
diyerek kanalı oluşturanı (soketi) kanala dahil ediyor.
SUNUCU2 ye bağlanan biri diyelim ki oluşturulan chat odasına girmek istiyor (chat odası SUNUCU1 de oluşmuş fakat redis ile tüm sunuculara görünüyor):
socket.join(room_id);
diyerek room_id ye sahip kanala join oluyor.
Şimdi, bu işlem tek bir node.js process i için sorunsuz çalışıyor fakat birden fazla sunucu kullanmak istediğimde malesef sağlıklı çalışmıyor çünkü kullanıcılar farklı farklı sunuculara bağlı ve aslında kanalına girilmeye çalışılan sunucunun durumdan haberi bile olmuyor..
Nginx ile ip_hash dağıtım yapıyorum. Malesef bu olayı stateless yapamadım, yani diğer herşey stateless, çalışıyor fakat olay iki farklı sunucudaki kullanıcıların bir araya gelmesine gelince iş bozuluyor..
Fikri olan var mı? Redis kullanarak yapılan çeşitli şekiller var ama çeşitli nedenlerden dolayı içime sinmedi. Redis kullanımda bi' sıkıntı yok, zaten var.
Umarım anlatabildim, Sevgiler..
RockZs tarafından 26/Ara/15 16:33 tarihinde düzenlenmiştir -
Anladığım kadarıyla, A ve B sunucuları oda kurmak ve odaya girmek için kullanılıyor. Bunlarda problem yok ama c ve d sunucularını kullanıcıların ikisini ortak kullanabileceği bir ağa çevirmek istiyorsun ama A ve B izin ver miyor yanlış mıyım ?
-
hocam daha önce redis ile yaptım senin dediğin olayı. başka bir clusterdaki cliente veri göndermek için redise bi veri publish ediyordum bütün clusterlar kendi içinde o client varmı diye kontrol edip var ise gönderiyordu bir sıkıntısını görmedim bu olayın. başka bilmiyorum nasıl yapılabilir. birde soru sorayım neden socket.io da direk ws değil ?
detCode tarafından 26/Ara/15 21:26 tarihinde düzenlenmiştir -
senin yazdıgın su projeyi çok merak ediyorum cidden
-
detCode bunu yazdı
hocam daha önce redis ile yaptım senin dediğin olayı. başka bir clusterdaki cliente veri göndermek için redise bi veri publish ediyordum bütün clusterlar kendi içinde o client varmı diye kontrol edip var ise gönderiyordu bir sıkıntısını görmedim bu olayın. başka bilmiyorum nasıl yapılabilir. birde soru sorayım neden socket.io da direk ws değil ?
hocam selam. pub/sub denen olay sanırım. sağol, şu anda inceliyorum.
socket.io cluster modda (ya da scale olurken diyelim) gerçekten sorunlu, haklısın, hatta https://medium.com/@3rdeden/cluster-fucks-when-scaling-socket-io-2c8ad1153332#.k8sd5w9fy adresinde adam konuyu "Cluster fucks when scaling Socket.IO" diyerek kısaca özetlemiş, fakat oldukça popüler olmasından dolayı kullanma kararı aldım, öğrenmek kolay gibi geldi ve kolay da.. şu an için de socket.io ile devam gibi görünüyor hocam ama bakalım ne gibi bir çözüm bulacağım.
sevgiler..
ek: http://zeromq.org/ ve https://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol de araştırılabilir, bulunsun.
RockZs tarafından 28/Ara/15 13:42 tarihinde düzenlenmiştir -
detCode bunu yazdı
hocam daha önce redis ile yaptım senin dediğin olayı. başka bir clusterdaki cliente veri göndermek için redise bi veri publish ediyordum bütün clusterlar kendi içinde o client varmı diye kontrol edip var ise gönderiyordu bir sıkıntısını görmedim bu olayın. başka bilmiyorum nasıl yapılabilir. birde soru sorayım neden socket.io da direk ws değil ?
hocam tekrar merhaba..
https://github.com/socketio/socket.io-redis
buradaki modül ile sorunu hallettim. senin bahsettiğin olayı otomatikleştirmişler.
sadece npm ile üstteki modülü kurup,
var redis = require('redis').createClient; var adapter = require('socket.io-redis'); var pub = redis(port, host, { auth_pass: "pwd" }); var sub = redis(port, host, { return_buffers: true, auth_pass: "pwd" }); io.adapter(adapter({ pubClient: pub, subClient: sub }));gibi bir kod eklemesi yaparak sessionların redis ile pub/sub edilmesi sağlanıyor. kendi kodlarım üzerinde hiçbir değişiklik yapmadan sorun ortadan kalktı.
bilgilerinize, sevgiler..