2010-09-01 5 views
14

İlk olarak, burada my original question that spawned all of this.Doğrudan CouchDB'nin soketine bağlanmalı ve HTTP isteklerini iletmeli veya node.js'yi proxy olarak kullanmalı mıyım?

Bir iPhone uygulaması geliştirmek için Appcelerator Titanium kullanıyorum (Android de). Titanium'un Titanium.Network.TCPSocket object'u kullanarak CouchDB'nin portuna doğrudan bağlanıyorum. I ,'un Apple SDK'nın CFSocket/NSStream sınıfını kullanacağına inanıyor.

kez ben sadece yazmak, bağlantı:

'GET /mydb/_changes?filter=app/myfilter&feed=continuous&gameid=4&heartbeat=30000 HTTP/1.1\r\n\r\n'

doğrudan sokete. "Sonsuza dek" açık kalmasını sağlar ve db güncellendiğinde ve filtreyle ve isteği değiştirdiğinde JSON verilerini döndürür. Güzel. Merak ediyorum

, Tamam böyle CouchDB en soketine doğrudan bağlanmak için, yoksa yerine node.js için soket açma ve belki node.js aracılığıyla CouchDB vekil işlemek için bu CouchDB node.js module kullanarak daha iyi olurdu olduğunu ?

Başlıca endişem performanstır. Ben sadece CouchDB ile soketine isabet edip, sahte HTTP isteklerini geçip geçmemenin iyi bir uygulama olup olmadığını bilmek için yeterli tecrübem yok. Herhangi bir sonuçlar veya alternatif önerilerle ilgili deneyim ve görüşler aramak.

cevap

13

Yine benim. :-)

CouchDB, yazdığı dil olan Erlang'dan süper eşzamanlılık yönetimi gerçekleştirir. Erlang, yüksek eşzamanlı yük altında mükemmel performans elde etmek için bu işlemler arasında hafif süreçler ve mesaj geçişi kullanır. Tüm cpu çekirdeğinden de yararlanacak.

Nodejs tek bir işlem yürütür ve temel olarak bu işlemdeki bir kerede yalnızca bir şey yapar. Olay tabanlı, engellenmeyen IO yaklaşımı, IO'nun parçaları için beklerken çok görevli olmasına izin verir, ancak yine de yalnızca bir şey yapar.

Her ikisi de on binlerce bağlantıyı kolayca işlemelidir, ancak CouchDB'nin eşzamanlılığı Düğümden daha iyi (ve daha az çaba ile) ele almasını beklerdim. Ve CouchDB'nin önüne koyarsanız Düğümün biraz gecikme eklediğini unutmayın. Bu, ancak farklı makinelerde varsa, ancak fark edilebilir.

TCPSocket aracılığıyla doğrudan Couch'e yazmak, spekrini izleyen iyi oluşturulmuş bir HTTP isteğini yazdığınız sürece a-tamam. (Hatalı bir istek iletmiyorsunuz ... bu, başka herhangi bir yol gibi göndereceğiniz gerçek bir HTTP isteğidir.)

Not: HTTP 1.1, istekte bir Ana bilgisayar üstbilgisini eklemenizi gerektirir, böylece ' kodunuzu düzeltmek için VEYA sadece bir şeyleri basit tutmak için gerektirmeyen HTTP 1.0'ı kullanacak şekilde düzeltmeniz gerekir. (Neden Titanyum.Network.HTTPClient kullanmıyorsunuz merak ediyorum. Sadece istek bittikten sonra istek gövdesini verir mi?)

Her neyse, CouchDB doğrudan bağlantıları kaldırabilir ve Düğüm proxy'nize çok fazla çaba harcamanız - muhtemelen 100k'lık bir oyunu aynı anda oynadığınızda kullanıcılara daha iyi bir deneyim sunacaktır.

DÜZENLEME: Düğüm kullanırsanız, gerçek bir HTTP proxy'si yazın. Bu, sağladığınız modülü kullanmaktan ve uygulamak için daha basit olmaktan çok daha hızlı çalışacaktır. (Daha sonra Couch'e istekte bulunan kendi API'nizi tanımlamak yerine, bazı istekleri sadece CouchDB'ye iletebilir ve güvenlik nedenleriyle başkalarını engelleyebilirsiniz.

Ayrıca "Çok Düğüm" nasıl çalıştığına bir göz atın: http://www.sitepen.com/blog/2010/07/14/multi-node-concurrent-nodejs-http-server/

+1

Serin, biz aynı sayfada konum sayesinde tekrar iyi şeyler! Önce Titanium.Network.HTTPClient kullanmayı denedim ancak bağlantıyı canlı tutmak için hiç şansım olmadı. Apple'ın değiştirilemeyen arabelleğe sahip NSUrlConnection kullandığını düşünüyorum. Bununla bir çözüm değil, emin olmak için biraz daha oynayabilirim. – k00k

İlgili konular