• 19-06-2014, 17:07:26
    #1
    Arkadaşlar merhaba,

    veritabanımdaki bir tablodan bağlı olan tüm kullanıcılara mesajlar göndermek istiyorum , ama istediğimi bir türlü yapamadım.

    Örnek veriyorum,
    mesajlar isimli bir veritabanı tablom var ,

    alanları
    id - mesaj - tarih

    Yönetim Panelinden bir mesaj kaydettiğim zaman , NodeJS'nin nimetlerinden de faydalanarak , kullanıcıların ekranında bu mesajı gerçek zamanlı görmelerini istiyorum.




    deneme amaçlı verileri çekiyorum.

    console.log() ile yazdırıyorum ama sonradan eklediklerim güncellenmiyor.

    yeniden yükledikten sonra ancak görebiliyorum.

    bununla alakalı örnek yapan , bilen var mı acaba

    yardımlarınız için teşekkürler
  • 21-06-2014, 00:33:15
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    nodejs ile async server seklinde surekli calisan bir reactorunuz var degil mi?
    Ayrica bu reaktor dbyi tekrardan okuyor mu? Yani sadece calismaya basladigi anda mi select yapiyorsunuz db'de yoksa belli bir mantiga gore thread'ler calistirip selectler yapiyorsunuz?
  • 21-06-2014, 10:49:14
    #3
    drjoseph adlı üyeden alıntı: mesajı görüntüle
    nodejs ile async server seklinde surekli calisan bir reactorunuz var degil mi?
    Ayrica bu reaktor dbyi tekrardan okuyor mu? Yani sadece calismaya basladigi anda mi select yapiyorsunuz db'de yoksa belli bir mantiga gore thread'ler calistirip selectler yapiyorsunuz?
    Yorum için teşekkürler.
    Öncelikle NodeJS'ye yeniyim, yeni yeni öğreniyorum
    Bu işlem için dün linkteki örneği buldum. onu inceliyorum şimdi. settimeout ile yapmış zannedersem.

    Nodejs de devamla yayın yapmak istesem yine de mantığı settimeout ile işlemi yenilemek midir acaba.

    Başka alternatif yollar var mı, buna benzer işlemler için.
  • 21-06-2014, 13:07:10
    #4
    uysal_rockci adlı üyeden alıntı: mesajı görüntüle
    Yorum için teşekkürler.
    Öncelikle NodeJS'ye yeniyim, yeni yeni öğreniyorum
    Bu işlem için dün linkteki örneği buldum. onu inceliyorum şimdi. settimeout ile yapmış zannedersem.

    Nodejs de devamla yayın yapmak istesem yine de mantığı settimeout ile işlemi yenilemek midir acaba.

    Başka alternatif yollar var mı, buna benzer işlemler için.
    Hocam isin gercegi henuz async islerim icin nodejs kullanmayi denemedim. Python'da twisted yada flask ile isleri goruyoum genellikle.
    Ama kodlari okuyarak size yardimci olmaya calisayim.
    var pollingLoop = function () {
        
        // Make the database query
        var query = connection.query('SELECT * FROM users'),
            users = []; // this array will contain the result of our db query
    
    
        // set up the query listeners
        query
        .on('error', function(err) {
            // Handle error, and 'end' event will be emitted after this as well
            console.log( err );
            updateSockets( err );
            
        })
        .on('result', function( user ) {
            // it fills our array looping on each user row inside the db
            users.push( user );
        })
        .on('end',function(){
            // loop on itself only if there are sockets still connected
            if(connectionsArray.length) {
                pollingTimer = setTimeout( pollingLoop, POLLING_INTERVAL );
    
                updateSockets({users:users});
            }
        });
    
    };
    Su kisim zaten inceledigim kadariyla burda update fonks'da duzgun bicimde tanimlanmis. Hemen asagisinda da timer ile surekli calisir hale getirilmis.
    Bu kodlarda bir sorun goremiyorum.
  • 21-06-2014, 14:27:58
    #5
    drjoseph adlı üyeden alıntı: mesajı görüntüle
    Hocam isin gercegi henuz async islerim icin nodejs kullanmayi denemedim. Python'da twisted yada flask ile isleri goruyoum genellikle.
    Ama kodlari okuyarak size yardimci olmaya calisayim.
    var pollingLoop = function () {
        
        // Make the database query
        var query = connection.query('SELECT * FROM users'),
            users = []; // this array will contain the result of our db query
    
    
        // set up the query listeners
        query
        .on('error', function(err) {
            // Handle error, and 'end' event will be emitted after this as well
            console.log( err );
            updateSockets( err );
            
        })
        .on('result', function( user ) {
            // it fills our array looping on each user row inside the db
            users.push( user );
        })
        .on('end',function(){
            // loop on itself only if there are sockets still connected
            if(connectionsArray.length) {
                pollingTimer = setTimeout( pollingLoop, POLLING_INTERVAL );
    
                updateSockets({users:users});
            }
        });
    
    };
    Su kisim zaten inceledigim kadariyla burda update fonks'da duzgun bicimde tanimlanmis. Hemen asagisinda da timer ile surekli calisir hale getirilmis.
    Bu kodlarda bir sorun goremiyorum.

    Evet dediğiniz gibi örneği çalıştırmayı başardım.
    Peki Nodejs de devamla yayın yapmak dediğimiz işlem mantığı settimeout ile veritabanı veri çekme işlemini yenilemek midir acaba.

    NodeJS için başka alternatif yollar var mıdır ?

    Bir de ek olarak mantık belirli bir saniye sonra kendini tekrar etmek olduğuna göre , ben bunu nodejs kullanmadan da yapabiliyorum. NodeJS 'nin burada bana sağladığı avantajlar nedir acaba.

    NodeJS daha hızlı sonuç getirir, veritabanı sunucusuna daha az yükleni, CPU dostudur vs ... gibi diyebilir miyiz.
  • 21-06-2014, 19:37:21
    #6
    uysal_rockci adlı üyeden alıntı: mesajı görüntüle
    Evet dediğiniz gibi örneği çalıştırmayı başardım.
    Peki Nodejs de devamla yayın yapmak dediğimiz işlem mantığı settimeout ile veritabanı veri çekme işlemini yenilemek midir acaba.

    NodeJS için başka alternatif yollar var mıdır ?

    Bir de ek olarak mantık belirli bir saniye sonra kendini tekrar etmek olduğuna göre , ben bunu nodejs kullanmadan da yapabiliyorum. NodeJS 'nin burada bana sağladığı avantajlar nedir acaba.

    NodeJS daha hızlı sonuç getirir, veritabanı sunucusuna daha az yükleni, CPU dostudur vs ... gibi diyebilir miyiz.
    Hocam bu yeni sistemler (tornado, nodejs vs) cikmadan once dediginiz gibi surekli threadingler calistirarak bkz: http://www.saltycrane.com/blog/2008/...hread-example/

    Sekildeki gibi time.sleepler yada call later fonksiyonlari ile senkronize bir sekilde anlik veri akislari saglanmaya calisilirdi.
    Bu eger dediginiz gibi tek bir islem icin kullanilacaksa hic performans kaybi yasamazsiniz bile ancak buyuk sistemlerde async calismak mecburiyettir.
    Cunku calistirdiginiz 1 thread bitmeden diger threadlar aktif olmaz. Bu da o makinanin ayni anda 1 islemi yapabilmesi demek. Bundan oturu event-driven protokoller gelistirildi (twisted bu sekilde calisiyor). Siz istek geldikce o isleri verirsiniz makinaya makina o an o isi bitirmis gibi atlar (arkada onun sonucunu dondurur) daha sonra cliente sonucu yollar. Boylece istekler arasinda makina sismez cpu sorunu cook daha istek hacimlerinden sonra gorulur.
    Resmi kitaptan bulup attım. Şu resim olayı özetliyor sanırım

    Nodejs disinda baska sistemler kullanabileceginiz kendinize ait sunucunuz varsa python ile isinizi goren kodu 10dk da yazabilirim.. Buna js ile client yazarsiniz paketleri alirsiniz
  • 22-06-2014, 07:53:30
    #7
    İlk olarak gerçek zamanlı bir mesajlaşma istiyorsunuz. İkinci olarak ucuz ve performanslı bir çözüm. İzlediğiniz yol ilk ve ikinci durumlar arasında bir ters orantı doğmasına neden oluyor. Ne kadar sık sorgu yaptırırsanız kullanıcılarınız bir o kadar güncel veri alacak ama bu sizi gereksiz SQL sorguları yapmaya zorlayacak.

    Üzerinde tartıştığınız çözüm yolu maalesef sıkça uygulanan bir "anti-pattern" (Database-as-IPC) olarak kabul edilir. Öncelikle sorununuzu çözmek için daha farklı bir bakış açısına ihtiyacınız var. "setTimeout" kullanmayın, PHP ile Node.js arasına bir iletişim katmanı ekleyin. Veritabanına bilgi girişi başarılı olduktan sonra PHP bu bilgileri Node.js'e göndersin ve bu şekilde yayınlayın. Hem gerçek zamana en yakın hızı almış hem de bir gün içerisinde yapacağınız binlerce belki de milyonlarca gereksiz sorgudan kurtulmuş olursunuz.
  • 14-07-2014, 22:06:28
    #8
    Üyeliği durduruldu
    Siteye bağlanan yani söz gelimi online olan oyuncular sockette arrayda tutulur.
    gönderilecek mesaj bu arraya gönderilir veritabanı ile işiniz yoktur.
  • 15-07-2014, 08:06:47
    #9
    Emura adlı üyeden alıntı: mesajı görüntüle
    Siteye bağlanan yani söz gelimi online olan oyuncular sockette arrayda tutulur.
    gönderilecek mesaj bu arraya gönderilir veritabanı ile işiniz yoktur.
    Veritabanı ile işimizin olmadığı tek durum kayıt edilmesi gerekli olmayan bilgilerin söz konusu olduğu durumlar için geçerlidir. Ancak burada bir web sitesindeki yöneticinin mesajlarından basediyoruz, anlık olarak oyuncular arasında paylaşılan mesajlardan değil. Dolayısı ile bir veritabanına ve devamlılığa ihtiyaç var. Burada söz konusu olan tek yanlış bir önceki mesajımda da belirttiğim gibi olay güdümlü bir iletişim protokolü kullanmak yerine düzenli veritabanı sorguları yapmak.