2012-08-03 38 views
7

ile hataya dayanıklı, yumuşak, gerçek zamanlı bir web uygulaması oluşturma Bir pizza dağıtım mağazası için hataya dayanıklı, yumuşak, gerçek zamanlı bir web uygulaması oluşturmak istiyorum. Pizza dükkanında müşteriden gelen telefon görüşmelerini kabul etmeli, bunları sisteme (CRM web istemcisi üzerinden) emir vermeli ve dağıtım memurlarının emirlere teslimat sürücüleri tahsis etmesine yardım etmelidir.Erlang/OTP

Bu hedefler olağandışı bir şey değildir, ancak hizmeti 7/24 kullanıma sunmak, yani hataya dayanıklı hale getirmek istiyorum. Dahası, çok hızlı çalışmak ve çok duyarlı olmak istiyorum.

Böyle bir uygulama için çok basit bir mimari görünüm aşağıdadır.

pizza delivery shop orders system

sorun

Başvuru çok duyarlı ve hataya dayanıklı hale getirmek için Erlang/OTP iyilik her kullanmayı biliyor kalmamasıdır.

İşte sorularım şunlardır:

hata toleransını sağlamak ve bunu nasıl yapmalıyım sırayla çoğaltılmış olmalıdır sistem elemanları
  1. ? Her aracın durumunu (koordinatlar, atanan siparişler, vb.) Çoğaltılan bir Mnesia veritabanında depolayabileceğimi biliyorum. Bu gitmek için doğru bir yol mu?
  2. Hangi veri depolama hizmetleri geleneksel SQL tabanlı (ör. boss_db temelli) olmalıdır ve çok hızlı yanıt sağlamak için Mnesia üzerinde yapılması gerekenler hangileridir? Müşteri kayıtlarını ve geçmişini böyle bir hataya dayanıklı ve yüksek oranda yanıt veren bir uygulamada saklamak için geleneksel bir SQL veritabanı kullanmak doğru mu?
  3. Uygulamayı son derece uyumlu hale getirmek için tüm verileri (müşteriler, taşıt durumu, vb.) RAM'deki tüm verileri depolamaya çalışmalı mıyım?
  4. Kalıcı araç verilerini (id, kapasite vb.) Geleneksel bir SQL veritabanında saklamalı ve gerçek zamanlı verileri (koordinatlar, atanmış siparişler, bagajdaki siparişler vb.) Bir Mnesia veritabanında saklamalıyım. Uygulama daha gerçek zamanlı tepki veriyor?
+1

Tüm uygulama mantığınızı ve verilerinizi çoğaltamazsanız, örneğin 7 gün 24 saat hizmetinizi nasıl gerçekleştirirsiniz? Bir veritabanı sunucusu hatası;) –

+0

Mantıkla uğraşan 2+ düğüme sahip bir Erlang/OTP sisteminde verilerin nasıl kopyalanacağı konusunda bir referans verebilir misiniz? – skanatek

+0

süreç grubu, herkese gönderme, uyuşmazlık çözümü veya sadece riak/couchdb kullanın. Ya da mnesia'ya bakarsın. Ama bunu kendi başına yapmak gerçekten çok zor bir iş olacaktır. –

cevap

8

Her şeyden önce, bu büyük bir sorudur, ancak onu parçalamaya çalışacağım. Önce gerçeklere bakalım. Onun bir web servisi. Bu, şu katmanlara sahip olduğumuz anlamına gelir: Web Server, Middle ware application ve ardından Data Storage. En yüksek düzeyde kullanılabilir uygulamalarda, Veri Depolama katmanı replication aracılığıyla yedeklemeye sahip olmalı ve yük Distribution üzerinden yönetilmelidir. Çoğu gerçek dünyadaki uygulamalarda, uygulama gerçekte doğada gerçek zamanlı olmadıkça, Multi-player Game Server veya A telecom Switch gibi RAM'de hiçbir şey depolamanıza gerek yoktur. Yani, bu tür bir uygulama, gerçekten, RAM depolama için gerek yok (belki de göreceğiz gibi, burada ve orada bir çeşit caching.)

Şimdi, bu tür bir uygulama, farklı türde veri içerir, Bir kerede aynı forma sahip olmayan bilgiler, dolayısıyla RDMS kullanarak her şeyi aynı şekilde düzenlemenize zorlar. Benim önerim, herhangi bir document oriented database, bir NoSQL DB veya key-value system kullanmayı öğrenmenizdir, çünkü bunlar gerçek dünya karmaşıklıkları için iyi bir şekilde modellenmiştir. Bu tür bir depolama alanı hakkında daha fazla bilgi bu pdf'da bulunur. Verileriniz sadece JSON documents, schemaless olacak ve uygulamanız büyüdükçe geliştirilebilecek olan Couch base server'u kullanmanızı öneririm. Herhangi bir uygulamaya ihtiyaç duyduğu şekilde, dağıtım ve çoğaltma ile birlikte gelir. Çalışma zamanında sunucu ekleyebilir veya sunucuları kaldırabilirsiniz ve tüm sistem kendini yeniden dengelemeyi sürdürür. Ayrıca, önbellekleme için yerleşik memcached ile birlikte gelir, bu nedenle bahsettiğiniz IN-Memory parçası için, önbellekleme sizin için her şeyi yapar.

Depolamadan sonra orta eşya hakkında konuşalım. web sunucusu hakkında orta eşyaların bir parçası olarak konuşmak istiyorum. Yüke bağlı olarak çok kararlı bir Web sunucusuna ve Erlang kullanmak istediğinize göre yaws web server öneririm ve appmods kullanarak RESTFUL services yapmayı öğrenin. Proxies Sunch'in bir web sunucuları kümesinin ön yüzünde Nginx olarak kullanılması, yük yönetiminde yardımcı olabilir. Atleast, web sunucularına karşı yük dengelemenin birkaç yolu vardır. Bundan sonra bir OTP uygulamasına ihtiyacınız olacak. Bir OTP uygulamasının gerekli olmaması gen_servers olmalıdır. Ancak, öğreneceğiniz gibi, gerçekten, paralelleştirmeye ihtiyacınız olduğu veya sıralı kodlara ihtiyacınız olduğu yerleri keşfedeceksiniz. Ancak, henüz hakim olmadığınız bir şeyi kullanmak istediğiniz için endişeleniyor. Erlang hakkında herşeye yardımcı olmak için lütfen this web book ve bu Orielly book'u takip edin. Chicago Boss ve Mochiweb veya Misultin Http sunucu kitaplıklarını denemeniz yararlı olabilir.

Erlang'da bunu yapmaktan bahsetmem gereken diğer bir şey de, Veri Yapıları'nıza hakim olmanız ve onlarla çalışmak için etkili bir yöntem olmanızdır. Veri yapılarının yetersiz seçimi problemlere neden olabilir. Her adımda her şeyi test edin ve test edin. Mümkünse her yerde records kullanın ve her aşamada bellek tüketimini kontrol edin. Bu soru hakkında söylenecek çok şey var, ama umarım diğerleri de düşüncelerini yayınlayacaklar.

+0

Oreilly kitabı learnyousomeerlang ile bağlantılıdır. Onu düzenler miydi, ama hangi kitaptan bahsettiğinizi bilmiyorum, en az 2 tane oreilly kitap var;) –

+0

Bağlantıyı düzelttim. Maalesef, –

+0

@MuzaayaJoshua Çok Oyunculu oyun sunucusu olması durumunda Veri Deposu'nu RAM'deki her şeyi depolamak için en iyi yaklaşım/araç hangisidir? – skanatek

2

bu oyunu hack: https://github.com/synrc/games tüm gerçek zamanlı, düşük gecikme, pub/alt, veritabanı, mimari sorular var, en son teknoloji yazılımı olarak yazılmıştır. Uygulamanızdaki durumları 'tamam' denetleyicilerinde yapıldığı gibi kontrol etmek için gen_fsm'yi kullanmanızı öneririm. riak ayrıca sosyal güncellemeler için iyi bir desteği olan kvs lib ile entegre edilmiştir. n2o seçilen kovboy sunucu, benim görüşüme göre, etrafında en iyi sunucu.