2012-04-28 38 views
11

Tôi có một vài ứng dụng di động gốc Android và iOS mà tôi đã viết kết nối trực tiếp với máy chủ XMPP mà tôi lưu trữ. Họ đẩy và kéo dữ liệu thời gian thực thông qua XMPP. Tôi cũng sử dụng một số trong số XMPP XEP extensions. Đối với các hoạt động khác, tôi có một ứng dụng django chạy trên cùng một máy chủ mà tất cả các ứng dụng di động tiêu thụ thông qua giao diện HTTP REST. Tôi sử dụng Celery và Redis cho phía django để làm một số hoạt động không đồng bộ (như làm hàng loạt nặng ghi vào db của tôi).Đẩy máy chủ thời gian thực bằng Socket IO (hoặc Strophe.js), XMPP và Django

Tất cả đều hoạt động tốt và dandy. Yay. Nhưng bây giờ tôi muốn viết một trang web front-end cho tất cả điều này, vì vậy tôi bắt đầu nghiên cứu các lựa chọn của tôi và tốt - có rất nhiều cách để da con mèo mà tôi muốn kiểm tra với cộng đồng SO trước tiên. Ý tưởng để có một thư viện js cung cấp cho tôi một API thống nhất cho các liên lạc socket (ví dụ: thử các cài đặt khác nhau của các ổ cắm web hoặc quay trở lại flash) thu hút tôi vì thế tại sao tôi đề cập đến Socket IO. Ý tưởng của việc phải chạy một máy chủ nodejs, tốt, không quá nhiều (một điều nữa để tìm hiểu), nhưng nếu tôi phải, tôi chắc chắn sẽ. Tôi biết rằng một số người sử dụng gevent as a replacement of the node server. Những người khác, quyết định viết small nodejs which they connect to the rest of their stack. Tôi có lẽ sẽ làm điều này.

Một tùy chọn khác, là sử dụng thư viện js XMPP như Strophe mà tôi không nghĩ là có dự phòng flash. Ngoài ra, tôi sẽ cần phải nghiên cứu những gì có nghĩa là cho máy chủ của tôi.

Tôi đã đọc một số câu trả lời Stackoverflow về cách thực hiện sao chổi và django - do đó tại sao dường như có một số tùy chọn.

Câu hỏi đặt ra là:

Nếu tôi muốn có lợi thế về hành vi Ổ cắm IO (với fallbacks) và tôi muốn để đẩy dữ liệu thời gian thực cho khách hàng web (hiện đang được cho ăn đến máy chủ thông qua XMPP), và sử dụng Django lựa chọn tốt nhất của tôi là gì?

Cập nhật: Máy chủ XMPP mà tôi sử dụng là ejabberd, mà còn hỗ trợ BOSH. Tôi nhận ra rằng tôi có thể sử dụng Strophe.js và do đó thông tin liên lạc của tôi sẽ đi qua một loại kết nối http bỏ phiếu dài thay vì websockets. Theo như tôi có thể nói, có một số XMPP over Websockets open source library, nhưng AFAIK cộng đồng không hoạt động như SocketIO.

Cập nhật 2: Trình duyệt mà tôi cần hỗ trợ chỉ là trình duyệt hiện đại. Tôi đoán điều này có nghĩa là dự phòng Flash sẽ không quan trọng, điều đó đang nghiêng tôi về phía strophe.js.

+1

Có cài đặt máy chủ socket.io bằng các ngôn ngữ khác ngoài js. Nút chỉ là máy chủ tham chiếu. Tôi có một máy chủ socket.io sử dụng go-socket.io viết bằng Go. Python có TornadIO2 sử dụng lốc xoáy trong ngăn xếp của nó. – jdi

Trả lời

5

Không chắc chắn lý do tại sao bạn cần Flash dự phòng nếu bạn định làm BOSH (XEP-0124, XEP-0206), đó là những gì strophe.js thực hiện. Nếu bạn không cần hỗ trợ IE7, bạn có thể thực hiện CORS từ strophe.js và thậm chí bạn không cần proxy cho cùng một nguồn gốc. IE6 sẽ hoạt động vì nó không an toàn, và IE8 + hỗ trợ một dạng CORS.

Để có được thông tin từ django qua XMPP để khách hàng của bạn, làm cho một kết nối thành phần (XEP-0114) đến máy chủ bằng cách sử dụng yêu thích của bạn Python XMPP library, chẳng hạn như SleekXMPP từ ứng dụng Django của bạn. Sắp xếp cho kết nối đó tương đối dài, để thực hiện (tức là không tạo kết nối mới cho mỗi kết nối máy khách). Gửi giao thức khi cần.

Bạn không đề cập đến máy chủ XMPP bạn đang sử dụng.Các máy chủ XMPP không hỗ trợ BOSH hiếm khi nhận được, nhưng nếu bạn có, bạn có thể cần Punjab làm proxy BOSH-tới-XMPP hoặc bạn có thể muốn chuyển sang một server mới hơn, chẳng hạn như Prosody.

+0

Tôi đang sử dụng ejabberd đã hỗ trợ BOSH, vì vậy tôi đoán tôi không cần proxy. Tôi không cần phải hỗ trợ IE6-IE7 và nó là sự lựa chọn của tôi nếu tôi đưa IE8 ra khỏi phương trình, quá. – rburhum

8

Tôi nghĩ rằng một khi bạn bị bẩn tay với một số nút, bạn sẽ thấy rằng việc đi lạc từ Node cho socket.io sẽ khó khăn hơn nhiều. Có rất dễ sử dụng các mô-đun xmpp trong nút sẵn sàng để đi (xem https://github.com/astro/node-xmpp). Hãy nhớ rằng, nút là tất cả javascript, vì vậy bạn có thể quen với lập trình trong nó rồi.

Cá nhân, tôi đã gặp phải một số sự cố rò rỉ bộ nhớ bằng cách sử dụng nút 0,6 hoặc cao hơn. Node 0.4 làm việc mà không có những vấn đề đó. Nếu bạn chưa quen với github (như tôi đã từng chơi với Node) thì đây là cách bạn sẽ làm với một máy chủ nút.

Bắt Node

  1. Đăng nhập vào hộp linux của bạn và thư mục yêu thích (Tôi sẽ giả /)
  2. git clone https://github.com/joyent/node.git
  3. cd/nút
  4. thẻ git -l (điều này sẽ liệt kê tất cả các phiên bản có sẵn của nút)
  5. git checkout v0.6.16 (điều này sẽ kiểm tra phiên bản 0.6.16 của nút, bạn có thể thay thế bằng v0.4.12 ví dụ nếu bạn có vấn đề bộ nhớ)
  6. ./configure
  7. làm
  8. thực hiện cài đặt

Bạn sẽ cần các công cụ phát triển nhất định để xây dựng nó như g ++, nhưng vào thời điểm này bạn sẽ có một làm việc node lệnh.

Cài đặt module Node như XMPP

Node có một số lượng tốt đẹp của module mà hầu hết mọi thứ đã được viết dành cho bạn. Có một cơ sở tìm kiếm tại http://search.npmjs.org hoặc bạn có thể truy cập tất cả các mô-đun trực tiếp từ trình bao của mình bằng cách sử dụng lệnh npm. NPM là công cụ nút để cài đặt và quản lý các mô-đun nút. Bạn có thể nhập npm search xmpp để tìm kiếm tất cả các mô-đun xmpp, chẳng hạn. Để cài đặt một thư viện xmpp cơ bản cho nút bạn sẽ làm npm install node-xmpp. Bằng cách này, hầu hết các trang mô-đun nút github sẽ bao gồm các hướng dẫn trên tệp readme của trang trước.

Giữ Node Chạy trong sản xuất

này ném cho tôi khi tôi lần đầu tiên bắt đầu ra. Nếu bạn có bất kỳ lỗi nào không phải là nút bị bắt thì sẽ chết đơn giản. Vì vậy, bạn có thể hoặc là 1. Hãy chắc chắn rằng không có lỗi nào hoặc chúng đều bị bắt (không phải vì ngay cả Node chính nó sẽ lỗi) 2. Sử dụng trình xử lý uncaughtException để nắm bắt các vấn đề này. Bạn sẽ sử dụng mã như thế này trong chương trình của bạn

process.addListener("uncaughtException", function (err) { 
    util.log("Uncaught exception: " + err); 
    console.log(err.stack); 
    console.log(typeof(this)); 
    // maybe email me? 

}); 

Hãy tắm an toàn và sử dụng Vô hạn

Ngay cả với các vấn đề uncaughtException chương trình của bạn trong sản xuất có thể chết. Bộ nhớ hết, segfaults, những người hiểu biết những gì. Đó là nơi mà nó trả tiền để sử dụng một cái gì đó giống như mô-đun Node tuyệt vời được gọi là "Mãi mãi" (xem https://github.com/nodejitsu/forever).Bạn có thể nhập npm install forever -g để cài đặt vĩnh viễn. Lưu ý tùy chọn -g đặt mãi mãi trong thư mục mô-đun nút GLOBAL. Nếu không có -g, nó sẽ đặt module nút trong thư mục làm việc hiện tại. Sau đó bạn sẽ có thể gõ một cái gì đó như (giả sử chương trình nút của bạn được gọi là my_program.js) forever start my_program.js và sau đó chương trình mãi mãi sẽ đảm bảo rằng nếu nó chết nó được khởi động lại.

2

Chúng tôi đang sử dụng đẩy thời gian thực cũng như với Django và Celery. Khi lần đầu tiên tôi tạo kiến ​​trúc, tôi cũng nghiên cứu các tùy chọn của mình. Cuối cùng, tôi quyết định rằng tôi muốn tập trung vào việc nhận được các ứng dụng vừa phải thay vì sau đó trên fiddling xung quanh với devops làm việc. Có một số dịch vụ ngoài đó cung cấp công nghệ đẩy thời gian thực được lưu trữ trên máy chủ có thể dễ dàng được tích hợp với bất kỳ ứng dụng nào.

Tôi đã chọn PubNub và tôi không thể hạnh phúc hơn. Họ hỗ trợ socket.io cho phía khách hàng và có một lib Python tôi sử dụng từ công nhân Django và Celery. Họ cũng có SDK bạn có thể sử dụng từ các ứng dụng di động gốc.

Tôi biết, bạn đã có thiết lập hoạt động tại chỗ. Nhưng tôi cá rằng thời gian bạn sẽ thay thế thiết lập hiện tại của mình với giải pháp được lưu trữ như vậy sẽ ít hơn thời gian để bạn tìm giải pháp tốt cho những gì bạn đang tìm kiếm và triển khai. Ngoài ra hãy ghi nhớ chi phí bảo trì xuống đường (đặc biệt nếu bạn chọn cho một lib không được duy trì tốt).

Đúng, bạn sẽ thanh toán cho dịch vụ, nhưng giá cả rất hợp lý và bạn sẽ nhận được một dịch vụ vững chắc với các đặc quyền tốt đẹp như Thuê vị trí.

Tôi không liên kết với công ty đó, chỉ là một khách hàng hài lòng. Có other similar services out there.

+0

Vấn đề là mỗi khách hàng có thể có khả năng đẩy 1 msg mỗi giây và sẽ nhận được tối đa 1 msg mỗi giây (chỉ khi tôi đệm, tối ưu hóa và nhắn tin nhỏ gọn từ phía máy chủ thành 1).Vì đây sẽ là một phần quan trọng trong cơ sở hạ tầng của tôi, tôi không muốn thuê ngoài công ty khác. Tuy nhiên, liên kết của bạn với câu hỏi quora đã cung cấp liên kết đến một số tùy chọn tự lưu trữ. Cảm ơn bạn! – rburhum

4

Trước hết, tiết lộ đầy đủ: Tôi làm việc cho một công ty có tên là PubNub, mà tôi sẽ đề cập đến trong thời gian ngắn.

Có một loạt các dịch vụ nhắn tin hai chiều được lưu trữ (đôi khi được gọi là IaaS - Cơ sở hạ tầng như một Dịch vụ) mà tôi cho là đáng xem xét. Họ là Pusher, Firebase, Flotype, PubNub và những người khác. Tôi khá tự tin rằng bạn có thể sử dụng bất kỳ thứ gì trong số họ cho những gì bạn muốn thực hiện. Firebase có một cơ sở dữ liệu được tích hợp ngay trong dịch vụ của họ, đó là một tính năng khá thú vị, nhưng có lẽ không hữu ích cho trường hợp sử dụng cụ thể của bạn (tôi cho rằng bạn đã có cơ sở dữ liệu trên chương trình phụ trợ của bạn).

Tôi không thể nói quá nhiều về đối thủ cạnh tranh của chúng tôi, nhưng nếu bạn muốn thư viện JavaScript trên giao diện người dùng giao tiếp với chương trình phụ trợ Python của bạn, chúng tôi (PubNub) cung cấp a very similar api in both languages và giao tiếp trên cùng một dữ liệu trong đám mây . Vì vậy, bạn có thể gửi tin nhắn bằng Python và bắt chúng bằng JavaScript hoặc ngược lại. Chúng tôi thậm chí đã viết một PubNub-hosted version of socket.io, mà bạn có thể sử dụng thay vì api vani JavaScript của chúng tôi, và sẽ vẫn buộc vào phụ trợ Django của bạn trong khoảng 10 dòng mã.

Cuối cùng, điều tốt đẹp về việc sử dụng IaaS (hoặc ít nhất là chúng tôi; một lần nữa tôi không chắc chắn về những người khác) là chúng tôi xử lý vấn đề chia tỷ lệ cho bạn. Nếu bạn đạt đến điểm của một triệu người dùng đồng thời và cần phải đẩy thứ gì đó cho họ trong thời gian thực, bạn sẽ thấy không có vấn đề gì.

Các vấn đề liên quan