Node.js veya Erlang


86

Eşzamanlılık düzeyi söz konusu olduğunda bu araçları gerçekten seviyorum.

Erlang / OTP çok daha kararlı bir çözüm gibi görünüyor, ancak çok daha fazla öğrenme ve işlevsel dil paradigmasına dalmayı gerektiriyor. Ve çok çekirdekli işlemciler söz konusu olduğunda Erlang / OTP bunu çok daha iyi hale getiriyor gibi görünüyor (yanılıyorsam düzeltin).

Ama hangisini seçmeliyim? Kısa ve uzun vadeli perspektifte hangisi daha iyidir?

Amacım, Web projelerimi yüksek yük altında ölçeklendirmeyi geleneksel dillere göre daha kolay hale getiren bir araç öğrenmektir.


JavaScript'i undercorejs.org
Todd Moses

2
@ToddMoses, doğru soruyu yorumladığınızdan emin misiniz?
Flavien Volken

Elmalar ve Portakallar. Node.JS (özünde) libevent (C) + Javascript birlikte çalışmadır. Erlang, tamamen özel bir IO uygulamasıdır. Node.JS, tek iş parçacıklı uygulamalar için yapılmıştır. Delemanız, Facebook / Google'da bir iş mi istiyorsunuz yoksa kickass yazılımı mı yapmak istiyorsunuz?
Vans S

Yanıtlar:


87

Erlang'ı bir denerdim. Daha dik bir öğrenme eğrisi olacak olsa da, işlevsel bir programlama dili öğreneceğiniz için bundan daha fazlasını elde edeceksiniz. Ayrıca, Erlang özellikle güvenilir, yüksek düzeyde eşzamanlı sistemler oluşturmak için tasarlandığından, aynı anda yüksek düzeyde ölçeklenebilir hizmetler oluşturma hakkında çok şey öğreneceksiniz.


10
Erlang'ın Javascript'ten biraz daha karmaşık olduğunu düşünmüyorum. Erlang'da herhangi bir tür kalıtım yoktur, bu nedenle hangi işlevi çağırdığınızdan her zaman emin olursunuz. Erlang'da örtük tür dönüşümü yoktur, bu nedenle ne tür verileri kullandığınızdan her zaman emin olursunuz. Yıkıcı bir atama yoktur, bu nedenle geri aramadaki bazı yeni kodlar dahili durumunuzu değiştirdiğinden, bazı eski kod parçalarının bozulmayacağından her zaman emin olursunuz.
Dmitry Belyaev

51

Erlang adına konuşamam, ancak node hakkında bahsedilmeyen birkaç şey:

  • Node, javascript'i makine kodunda derlemek için Google'ın V8 motorunu kullanır. Yani düğüm aslında oldukça hızlı. Bu, olay güdümlü programlama ve engellemesiz io tarafından sunulan hız avantajlarının en üstünde.
  • Node'un oldukça aktif bir topluluğu var. Freenode'daki IRC gruplarına atlayın ve ne demek istediğimi göreceksiniz
  • Yukarıdaki yorumların Erlang'ı işlevsel bir programlama dili öğrenmenin faydalı olacağı temelinde zorladığını fark ettim. Becerilerinizi genişletmenin ve bunlardan birini kemerinizin altına almanın önemli olduğuna katılıyorum, ancak bir projeyi yeni bir programlama stili öğrenmek istediğiniz gerçeğine dayandırmamalısınız
  • Öte yandan, Javascript zaten yazmakta rahat hissettiğiniz bir paradigma içinde! Ayrıca javascript olduğundan, istemci tarafı kod yazdığınızda tutarlı görünecek ve tutarlı görünecektir.
  • node topluluğu şimdiden tonlarca modülü pompaladı ! Redis, mongodb, couch ve neyiniz var için modüller var. İncelenmesi gereken bir başka iyi modül de Ekspres (düğüm için Sinatra'yı düşünün)

Yahoo'nun blogundaki, düğüm yazan adam Ryan Dahl'ın videosuna göz atın . Sanırım bu, düğümün nerede olduğu ve nereye gittiği konusunda size daha iyi bir fikir vermede yardımcı olacaktır.

Düğümün hala geç geliştirme aşamalarında olduğunu ve bu nedenle epeyce değişikliğe uğradığını unutmayın - önceki kodu bozan değişiklikler. Ancak, sözde API'nin çok fazla değişmemesini bekleyebileceğiniz bir noktada. Bu yüzden eğlenceli bir şey arıyorsanız, düğümün harika bir seçim olduğunu söyleyebilirim.


26
V8 motorunun JavaScript'i derlemeye değil, kodlamaya göre derlediğini düşünüyorum.
Jonas

10
Javascript etrafında bu kadar çok çalışma yapılmış olması, dili karmaşık problemleri çözmek için biraz bile uygun hale getirmez. Dilin kendisi tür dönüşümündeki tüm bu özel durumlar ile berbattır. Ve değişkenlerin yüzlerce farklı yerde değiştiği geri çağırma tarzı ve bazı atamaların gerçekleştiği yeri aramaktan cehenneme.
Dmitry Belyaev 13

15

Ben uzun süredir Erlang programcısıyım ve bu soru node.js'ye bakmamı sağladı. Oldukça iyi görünüyor.

Birden çok çekirdekten yararlanmak için birden fazla işlem oluşturmanız gerektiği anlaşılıyor. Yine de işlemci yakınlığını ayarlama konusunda hiçbir şey göremiyorum. Görev kümesini linux üzerinde kullanabilirsiniz, ancak muhtemelen parametreleştirilmeli ve programda ayarlanmalıdır.

Platform desteğinin biraz daha zayıf olabileceğini de fark ettim. Özellikle, Windows desteği için Cygwin altında çalıştırmanız gerekecek gibi görünüyor.

Yine de iyi görünüyor.


Düzenle

Node.js artık Windows için yerel desteğe sahiptir.


5
Bu cevap biraz eski. Şu anda Node çapraz platformdur, Windows için Cygwin'e gerek yoktur. Ve Node, TCP soketlerini paylaşan bir makinede kümeleme için yerleşik desteğe sahiptir.
Farid Nouri Neshat

9

Birden fazla proje için, sahip olduğunuz aynı iki alternatife bakıyorum.

Şimdiye kadar, belirli bir proje için aralarında karar vermek için bulduğum en iyi tıraş bıçağı Javascript kullanmam gerekip gerekmediğidir. Taşımak istediğim mevcut sistemlerden biri zaten Javascript'te yazılmıştır, bu nedenle bir sonraki sürümü büyük olasılıkla node.js'de gerçekleştirilecektir. Bazı Erlang web çerçevesinde başka projeler yapılacaktır çünkü taşınacak mevcut kod tabanı yoktur.

Dikkate alınması gereken bir diğer nokta da Erlang'ın birden fazla çekirdeğin çok ötesinde ölçeklendirilebilmesi, tüm veri merkezine ölçeklenebilmesidir. Node.js'de, hangi makinede olduğunu umursamadan başka bir JS işlemi bir mesaj göndermeme izin veren yerleşik bir mekanizma görmüyorum, ancak bu, en düşük seviyelerde Erlang'da yerleşiktir. Sorununuz birden fazla makineye ihtiyaç duyacak kadar büyük değilse veya birden fazla işbirliği süreci gerektirmiyorsa, bu avantajın önemi olmayabilir, bu yüzden görmezden gelmelisiniz.

Erlang gerçekten de dalmak için derin bir havuzdur. Web uygulamaları oluşturmaya başlamadan önce bağımsız bir işlevsel program yazmanızı öneririm. Javascript ile rahat göründüğünüz için daha da kolay bir ilk adım, JS'yi daha işlevsel bir tarzda programlamayı denemektir. JQuery veya Prototype kullanıyorsanız, bu yola zaten başlamışsınızdır. Erlang'daki saf işlevsel programlama veya onun benzerlerinden biri (Haskell, F #, Scala ...) ile işlevsel JS arasında gidip gelmeyi deneyin.

İşlevsel programlamaya alıştığınızda, birçok Erlang web çerçevesinden birini arayın; muhtemelen uygulamanızı inetsbu geç aşamadaki gibi düşük seviyeli bir şeye doğrudan yazmamalısınız. Örneğin, Nitrojen gibi bir şeye bakın .


"Erlang tüm bir veri merkezine ölçeklenir" noktasının dikkate alınması gereken bazı çok önemli yakalamalara sahip olduğu sıklıkla belirtilmez (güvenlik büyüktür). Bununla
atın

9

Şahsen Erlang'ı seçsem de, JavaScript'e karşı biraz önyargılı olduğumu kabul edeceğim. Benim tavsiyem, birkaç noktayı değerlendirmenizdir:

  1. Mevcut kodu bu dillerden birinde yeniden mi kullanıyorsunuz (hem kaynak kodu hem de programcı deneyimi açısından!)
  2. Uygulamayı durdurmadan anında güncellemelere ihtiyacınız var mı / istiyor musunuz (Bu, Erlang'ın varsayılan olarak kazandığı yerdir - çalışma zamanı bu durum için tasarlanmıştır ve OTP gerekli tüm araçları içerir)
  3. Bant genişliği değil, ayrı, eşzamanlı işlemler açısından beklenen trafik ne kadar büyük?
  4. Her istek için yaptığınız işlemler ne kadar "paralel"?

Erlang, gerçekten ince ayarlanmış eşzamanlılığa ve ağdan şeffaf paralel dağıtılmış sisteme sahiptir. Projenin tam olarak ne olduğuna bağlı olarak, böyle bir sistemin olgun bir şekilde uygulanmasının mevcudiyeti, yeni bir dil öğrenmeyle ilgili tüm sorunlardan ağır basabilir. Ayrıca kullanabileceğiniz Erlang VM üzerinde çalışan iki dil daha vardır, Ruby / Python benzeri Reia ve Lisp-Flavored Erlang .

Yine başka bir seçenek de her ikisini de kullanmaktır, özellikle Erlang bir tür "hub" olarak kullanıldığında. Node.js'nin Yabancı İşlev Arabirimi sistemine sahip olup olmadığından emin değilim, ancak varsa, Erlang'ın, diğer Erlang işlemleri gibi sistemle arabirim oluşturması için harici işlemler için C kitaplığı var.


Dokümanlara göre, Node.js harici eklentiler için C ve C ++ 'dan yararlanabilir. nodejs.org/docs/v0.3.1/api/addons.html
Evan Plaice

Görünüşe göre Reia öldü, ama onun yerine iksir ... Bana Groovy ve Java'yı hatırlatıyor; burada Elixir ve Erlang olacaktır.
stommepoes

@EvanPlaice - Bu beni pek etkilemiyor. Mesele şu ki, temelde C ++ 'da sorunlu bir şeyi kodluyorsunuz ve bunları yerleşik olarak ekliyorsunuz. Aslında yaptığınız şey pek bir FFI değil, öykünücüyü genişletmektir. (Tamam, kişisel tercih;)) Erlang'ın durumunda bahsedilen harici kitaplık, düğümler olarak görünen YA DA açık bir bağlantı noktası üzerinden konuşan diğer dillerde zaman uyumsuz işlemler yapmaktır (yapılandırılmış verilerle iki yönlü boru düşünün). Tüm bunlar zaman uyumsuz çalışma moduna güzelce uyuyor. Ayrıca Node.js'nin sahip olduğu, ancak tavsiye edilmeyen NIF'ler de vardır.
p_l

1
@p_l Anladığım kadarıyla düğüm yaklaşımı biraz farklı. Düğüm, eşzamansız GÇ çağrılarını (yani web isteklerini) işlemede çok iyi olsa da, tek iş parçacıklı bir ortamda çalışır. Bu yüzden gönderimde harika ama CPU yoğun işlemede o kadar iyi değil. Bu zemini kapsamak için yerel C / C ++ kodunu çalıştıran başka bir işlemi / iş parçacığını çatallayabilirsiniz. Tek yaptığınız eşzamansız IO çağrıları ise (örn. IPC | iki yönlü kanallar), o zaman node.js yükü kaldırabilmelidir. Eşzamanlı aramalarda beklemek için çok fazla zaman harcamak için kodlanmadığı sürece.
Evan Plaice

5

Görünüşe göre Erlang, nispeten düşük kaliteli bir sunucuda (512MB 4 çekirdekli 2.4GHz AMD VM) dağıtım için daha iyi performans gösteriyor. Bu, SyncPad'in sanal beyaz tahta sunucu uygulamalarının Erlang ile Node.js uygulamalarını karşılaştırma deneyiminden kaynaklanmaktadır.


2
Evet, node.js kötü bir bellek sızıntısı sorunu yaşıyor gibi görünüyor. Düğüm oldukça yeni ve deneyseldir ve ne JavaScript ne de V8 motoru bu tür sunucu senaryoları için tasarlanmamıştır. Öte yandan Erlang, aşağıdan yukarıya sadece bunun için tasarlandı ve kendini geliştirmek ve olgunlaşmak için uzun yılları vardı.
Rolf

2
Bu bağlantı kesik görünüyor ama burada WayBackMachine web.archive.org/web/20120902014555/http://blog.mysyncpad.com/…
jocull

4

Aynı sanal makinede erlang'ın olduğu bir dil daha var -> Elixir

Erlang'a çok ilginç bir alternatif, şuna bir bakın.

Ayrıca hızlı büyüyen bir web çerçevesine sahiptir -> Phoenix Framework



0

Düğüm yerine Erlang'ı Tercih Edeceğim. Eşzamanlılık istiyorsanız, Node, hafif süreçleri nedeniyle Erlang veya Golang ile değiştirilebilir.

Erlang öğrenmesi kolay değildir, bu yüzden çok çaba gerektirir, ancak topluluğu aktiftir, bu yüzden bundan yardım alabilir, bu sadece insanların Node'u tercih etmesinin nedenidir.

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.