Node.js arka plan işleme için iyi bir seçim mi?


10

Yavaşça öğreniyorum node.jsve başlamak istediğim küçük bir projem var. Projede çok sayıda arka plan işlemi olacak (harici sitelerden veri indirme, CSV dosyalarını ayrıştırma vb.).

Benim ve düğümüm için büyük bir "kazanç", hem istemci hem de sunucu için JavaScript kullanmasıdır. Java ve JavaScript günlük işimi kodlamak ama Ruby de oldukça iyiyim.

Ancak, dediğim gibi, her yerde bir dil kullanmak cazip görünüyor ve JS bu faturaya uyuyor gibi görünüyor.

Ancak, arka plan işlerini çalıştırmak için JS kullanma konusunda fazla deneyimim olmadı. Ruby bu konuda mükemmel görünüyor. Ve onu kullanmaya karşı değilim. Peki bunun için% 100 JS kullanmaya yönelik düşünceleriniz nelerdir? Çok büyük projelerin özel çözümler gerektirdiğinin farkındayım. Sadece çabaya değip değmeyeceğini merak ediyorum. Yoksa Ruby ile bu tür işleri yapmalı mıyım?

Görüşler takdir edildi.

Teşekkürler


Düğüme alternatif olarak vert.x dosyasına bakmak da isteyebilirsiniz .
Mike

Yanıtlar:


13

Bir ton dosya G / Ç işleminde özellikle güçlüdür ve bir ton ağ iletişimini de iyi işlemesini beklerim. Soket tahrikli uygulamalar için özellikle popüler görünüyor. Akılda tutulması gereken önemli şey, ihtiyaçlarınız mevcut kütüphaneler tarafından karşılanmıyorsa (çok sayıda vardır) JS komutlarına bağlanabilen bazı C'ye dalmanız gerekebilir. Ayrıca başka Düğüm işlemleri de ortaya çıkarabilirsiniz, ancak bunun bir çok vergi verebileceğinden şüpheleniyorum (sanırım - yanlış olabilir - bunların her biri için ortaya çıkan bir V8 örneği var).

JS tek iş parçacıklı ve engellemelidir, yani işlev çağrısı tamamlanana kadar başka hiçbir şey yürütülemez. Bu, JS'nin istenen bir özelliğiydi, temel olarak tüm iş parçacığı ve kuyruk endişelerini elinizden aldı. JS, C / C ++ öğelerinin kaputun altında daha çok iş parçacıklı bir şekilde çalışmasını engellemez, bu nedenle JS'nin rolü gerçekten daha fazla mimari / habercidir. Görüntü işliyorsanız, senkronize JavaScript komutlarıyla bunu işlemek istemezsiniz çünkü uygulamanızdaki veya sunucunuzdaki diğer her şey bitene kadar engellenir. Fikir, bir görüntünün bağlı C / C ++ işlevselliği tarafından işlenmesini ve ardından görüntünün işlenmesi bittiğinde 'done' olayına yanıt vermenizdir.

Bu, herhangi bir Node.js uygulamasındaki JS'nin büyük ölçüde olay ve geri arama odaklı olmasını gerektirir veya muhtemelen çok kötü performans gösterir. Böylece, Düğümde daha sonra kullanmak üzere bir işlev verilmeyen çok fazla yöntem çağrısı görmezsiniz. Düğümde çok hızlı bir şekilde netleşen bir şey, geri arama piramidini işlemek için bir yol bulamazsanız, çirkin bir dünyaya girmenizdir. Örneğin

//event CBs are more DOM-style than Node style and this isn't built-in Node file I/O
//keeping it simple and quick since I'll just get Node stuff wrong from memory
file.get('someFile.txt', function(e){
    e.fileObj.find('some snippet', function(e){
        someFinalCallBackHandler( e.snippetLocations );
    } );
} );

Neyse ki bunu daha iyi ele almak için birçok araç ve örnek var. Çoğu, vaat mekanizmaları etrafında dönme eğilimindedir ve sadece birbirlerinin geri çağrı durumlarına, çirkin piramit eşyalarını sizin için kaputun altında yapan bir dizide yanıt vermek amacıyla bir dizi işlevi zincirleme eğilimindedir.

Şahsen, JS'yi yüksek seviyede ve C / C ++ 'ı kroma daha yakın hale getirmekten duyduğum aşkı seviyorum. Bu nihai kombinasyon ve C öğrenmeye başlamam için bana ilham verdi. Ve biraz araştırma yapana kadar kütüphane potansiyeli eksikliğinin sizi korkutmasına izin vermeyin. Düğüm kütüphaneleri çok hızlı bir şekilde üretilmekte ve çok hızlı olgunlaşmaktadır. Eğer son derece alışılmadık bir şey yapmıyorsanız, birisinin kapladığı iyi.

Rails'ten en büyük fark, JS'nin asla olduğu gibi raylarda bulunmamasıdır. Biz sahip olmak için kodlama eğilimindedir, ancak çok hızlı bir şekilde istiyorum, bu yüzden faktör ile kendinizi asmak için ip var ve mimari son yıllarda JS oldukça DIY oldu. Ben buna özgürlük diyorum, ama bunun pek çok geliştirici için ideal olmadığını anlıyorum.

Ayrıca, Mac dışında bir şeye yüklemeye çalıştığınız için, Node.js'de asla bir "mücevher" problemi yaşamayacaksınız. İstemci tarafı web geliştiricileri, bağımlılık sorunlarını hor görüyor ve bu noktada çok sayıda Node çekirdeği geliyor. Her popüler platformda 5 dakika veya daha kısa bir süre içinde kutudan çıkmazsa, genellikle onu çöker ve fırlatırız. Henüz çalışmasını sağlamak için özel bir şey yapmam gereken popüler bir modülle karşılaşmadım. Paket sistemi mükemmel.

Ancak temel sorunuza daha açık / özlü bir şekilde cevap vermek için: Arka plan süreçleri ile iyi mi?

Evet, Düğüm temelde bir uygulamayı etkinlikler ve geri aramalar aracılığıyla yönlendirmenin bir yolu olan arka plan süreçleri IS'dir.


1
Burada birçok genel bilgi var, ancak node.js'nin istekleri eşzamansız olarak işleme yeteneği hakkında hiçbir şey söylemediniz.
Robert Harvey

İyi bir nokta. Oraya biraz daha odaklanacağım.
Erik Reppen

Eski bir Rails geliştiricisi ve yarı deneyimli bir Node.js geliştiricisi olarak, Ruby / Rails dünyası ve Erik'in JS tarafından yapılan JS / Node.js dünyası arasındaki paket sistem karşılaştırmasına kesinlikle katılmıyorum. Tecrübeli (hatta tecrübesiz) Rails geliştiricisi "mücevherlerin" tam anlamıyla mücevher gibi olduğunu bilir. Zahmetsiz çalışırlar. Çoğu iyi test edilmiş, sağlam ve kararlıdır. Bununla birlikte, NPM modüllerinin yarısından fazlası kötü tasarlanmış, test edilmemiş ve hatta tamamlanmamıştır. Örneğin, hiç kimse bana aynı kalite ve özellik zenginliğiyle Devise veya Paperclip'in JS değiştirmelerini gösteremez. Olmaz.
scaryguy

Mac dışında hiçbir şey benim deneyimim değildi. Bununla birlikte, tipik düğüm modülünüzün çapraz işletim sistemi uyumluluğu ile eskisinden daha az etkilendim. Deneyim ile daha kötü yumurtalarla karşılaşıp karşılaşmadığımdan veya toplumun çapraz platformu gerektiği kadar ciddiye almayan bir sürü geliştirici içerecek şekilde büyüdüğünden emin değilim. Ama kesinlikle bazı Linux züppelikleri var.
Erik Reppen

Bu cevap çok fazla upvotes hak ediyor
Amin Mohamed Ajani

2

Dikkat edilmesi gereken bir konu, zaman uyumsuz bir ortamda büyük dosyaları işlerken meydana gelen şeydir : giriş akışınız (bir dosya) çıkış akışınızdan (db) daha hızlıysa, giriş veri olaylarını hızlı bir şekilde işleyemezsiniz yeter. Bu, sisteminizin bir parçasını (çıkış akışı veya bellek) bunaltır veya veri kaybetmenize neden olur. Bu nedenle, zaman uyumsuz olarak veri işleme biraz zor olabilir. Ancak bağlantı verdiğim makalede açıklandığı gibi, giriş akışını duraklatma yeteneği durumunuza uygun bir şekilde kısmayı mümkün kılar.


1

Node.js, IO'da mükemmeldir. İş parçacıklarınızın çoğu SQL çağrılarında engellendiğinden, bir gün işleminizin sıkıştığını keşfetmeniz pek olası değildir.

Ancak, node.js bilgi işlemle ilgili işlerde gerçekten kötüdür . "Çok fazla IO" duyduğumda "evet! Düğüme git!" Bunun, herhangi bir nedenden ötürü, düğümün çok iş parçacığını düzgün şekilde kullanamadığından başka bir şey olup olmadığından emin değilim, ancak şimdiye kadar ürünümün hesaplama işlemlerinin tümü düğüm dışında gerçekleşiyor.

Node.js dosyasında çoklu iş parçacığı oluşturmak doğru şekilde ayarlamak zordur. Her şey varsayılan olarak tek iş parçacıklıdır ve çoğu kod yalnızca bir iş parçacığı altında çalışacağı varsayımı altında yazılmıştır. Bir iş parçacığındaki bir hatanın tüm uygulamanızı indirmesini önlemek için kesinlikle etki alanları kullanmanız gerekecektir .

Ayrıca, düğümün bazı kurumsal yeteneklerde biraz daha zayıf olabileceğini unutmayın. Örneğin, günlük kitaplıkları Java'yla karşılaştırılmaz. Şu anda, MDC'yi bile destekleyen iyi bir kayıt çerçevesi yoktur, bu da pratikte çok şey yapmanız anlamına gelir var logPrefix = userId + ": ".

Ben de asla özel bir npm repo çalıştırmak ettik, kodun sahibi olup olmadığına bağlı olarak bunlardan birine ihtiyacınız olabilir.


1

Arka plan işlemleriniz sıralı olarak çalışabiliyorsa, oldukça iyi olabilir. Son pozisyonumda, birçok veri kaynağı için bir dizi ön işlemci, dışa aktarma ve çeviri yardımcı programı yazmak zorunda kaldım. NodeJS kullanmak burada bir esinti oldu.

Çok fazla bilgi işlem bağlı işlem yapmıyorsanız , kısa dizelerin basit bir şekilde manipüle edilmesi ve tamsayı ayrıştırma o kadar da kötü değildir, görüntüleri manipüle etmeniz gerekiyorsa, muhtemelen en iyi araç değildir (çağrılabilir sarmalayıcılar ve modüller olsa da) iyi çalışabilir).

Tavsiye, akış kullanan modüllere bağlı kalın. Bu, işleminizi söz konusu adım için modüllere bağlamayı kolaylaştırabilir. Nasıl bakarsanız olay akışı kullanılır yudum-yeşim için yutkunmak inşa aracı örneğin, bunun ne kadar yetenekli görebilirsiniz.

CSV için, kayıtları bir işlemci akışına bağlamak için bir taban oluşturmakta oldukça iyi olan düğüm-csv'yi kullanabilirsiniz .

Tek seferde tek bir kayıt yapmak istediğiniz büyük-ish XML için, bir SAX işlemci kullanarak XML akışınızı okuyan ve her düğüm için olayları yükselten düğüm-halfstreamxml'e bakarım . İstediğiniz maçları yükseltebilmeniz için bunu bir okuma / yazma akışına sararım. Düğümdeki birçok xml nesnesi ayrıştırıcısı, tüm xml'yi bir kerede okumaya / ayrıştırmaya çalışacak ve diyelim ki 100st xml çok büyük ... halfstreamxml'in bir akış olarak okuyacağı yer.

NOT: xat-stream gibi altında expat (C kütüphanesi) kullanacak, daha fazla performans verebilecek, ancak bir yapı ortamı olmadan daha az taşınabilir başka işlemciler de vardır .

Genel olarak, kullanmak gerçek bir zevkti ...

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.