Her şeyden önce, SADECE DOĞRU fikrimin Erlang öğrenmekle ilgili cevabını kabul ediyorum Çoğunlukla işlevsel bir dildir (eşzamanlılık büyük bir rol oynamasına rağmen) ve tüm özellikleri ilk etapta Javascript ile aynı tasarım hedefleri değil aynı şekilde hata toleransı ve sağlamlığa yönelik olarak eklendi.
İkincisi, Node.js'yi Erlang'a girmek için bırakmak biraz yanlış. Node.js, geri aramaların yardımı ile her şeyi olaya dayalı bir şekilde yapma yoluna giden tek bir sunucu / çerçevedir. Erlang'ın kendi çerçevesi (OTP) var, ancak aynı seviyede değil.
Erlang'ı öğrenmeyi planlıyorsanız, blogumda Erlang Acemi'sine (veya Onlooker'e) Açık Mektup mektubunu öğreticilere dalmadan önce giriş okuma olarak öneririm .
Erlang ve Node.js 'i kalıplar ve kullanım açısından karşılaştırabileceğiniz tek şey, olaylara yönelik olmalarıdır. Ancak, burada iki büyük ana fark var. Node.js modeli, olaylara bağlı geri aramalara dayanıyor. Erlang mesaj sıralarına ve seçici alıcılara dayanmaktadır. Oradaki etkiler neler?
Her şeyden önce, bir şeyleri geri çağırma tabanlı bir şekilde yaparsanız, etrafta dolaşmanızın tek yolu, onu global hale getirmek veya devam eden stil programlamasına girmek. İkincisi, tam olay matrisini kendiniz gözetmek zorundasınız. Buna bir örnek, çok basit bir sonlu durum makinesi hayal edersek: mutex semafor, olaya dayalı.
Mutex semaforunun iki durumu vardır: kilitli ve serbest. Belirli bir hesaplama birimi (işçi, süreç, işlev veya iş parçacığı) mutekse erişmek istediğinde, 'ilgileniyorum' diyen bir olayı başlatması gerekir. Şimdi aşağıdaki etkinlik türlerine dikkat etmeniz gerekiyor:
- Mutex ücretsizdir ve kilidi almanız istenir.
- Mutex başkası tarafından kilitlenmiş ve kilidi almak istiyorsunuz.
- Muteks kendi kendine kilitlenir ve muteksiyi serbest bırakmak istiyorsun.
Ardından, kilitlenmeleri önlemek için zaman aşımına uğramak gibi dikkate alınması gereken ek etkinlikleriniz vardır:
- Muteks kilitlendi ve çok uzun süre beklediniz, yangınları kesmek için bir zamanlayıcı
- Muteks kilitlendi ve çok uzun bir süre beklediniz, kilidi aldınız, sonra zaman aşımı sona erdi
Öyleyse aynı zamanda sınır dışı etkinliklere de sahipsiniz:
- bir işçi serbest kalmasını beklerken muteksiyi kilitledin. Şimdi bu işçinin sorgusu sıraya konmalı, böylece ücretsiz olduğunda geri alınabilsin
- Tüm işi asenkronize etmeniz gerekiyor
Olay matrisi çok hızlı bir şekilde karmaşıklaşıyor. Bizim FSM’mizde sadece 2 eyalet var. Erlang durumunda (veya seçici alanlara sahip herhangi bir dilde ve potansiyel olarak senkronize olaylarla senkronize olmayan bir dilde), birkaç vakayla ilgilenmelisiniz:
- Mutex ücretsizdir ve kilidi almanız istenir.
- Mutex başkası tarafından kilitlenmiş ve kilidi almak istiyorsunuz.
- Muteks kendi kendine kilitlenir ve muteksiyi serbest bırakmak istiyorsun.
Ve bu kadar. Zamanlayıcılar, alıcıların yapıldığı aynı durumlarda ele alınır ve 'ücretsiz olana kadar bekle' ile ilgili olan her şey için mesajlar otomatik olarak sıralanır: çalışan sadece bir cevap beklemek zorundadır. Model bu durumlarda çok daha basittir.
Bu, genel durumlarda, CPS ve node.js'deki gibi geri çağrı tabanlı modellerin ya olayları nasıl işlediğiniz konusunda çok zekice olmanızı ya da tam bir karmaşık olay matrisine tam olarak bakmanızı isteyeceği anlamına gelir; garip zamanlama sorunlarından ve durum değişikliklerinden kaynaklanan her bir tutarsız duruma geri çağrılmanız gerekir.
Seçici almalar genellikle yalnızca tüm olası olayların bir alt grubuna odaklanmanıza izin verir ve bu durumda olaylar hakkında çok daha kolay bir şekilde karar vermenize izin verir. Erlang'ın bir şeyin davranışına (tasarım deseni / çerçeve uygulaması) sahip olduğunu unutmayın gen_event
. Gen_event uygulaması, eğer istersen, node.js'de kullanılana çok benzer bir mekanizmaya sahip olmana izin verir.
Onları farklılaştıran başka noktalar da olacak; Node.js işbirliğine yardımcı olurken Erlang'ın ön planlı zamanlaması var, Erlang bazı çok büyük ölçekli uygulamalara (dağıtım ve diğerleri) daha uygun, ancak Node.js ve topluluğu genellikle daha fazla web uyumlu ve en son web eğilimi hakkında bilgili. Bu, en iyi aracı seçme meselesidir ve bu, geçmişinize, problem tipinize ve tercihlerinize bağlı olacaktır. Benim durumumda, Erlang'ın modeli benim çok iyi düşünme tarzıma uyuyor. Bu mutlaka herkes için durum böyle değil.
Bu yardımcı olur umarım.