2012-04-28 3 views
11

나는 호스트하는 XMPP 서버에 직접 연결하는 Android 및 iOS 네이티브 모바일 응용 프로그램을 가지고 있습니다. 그들은 XMPP를 통해 실시간 데이터를 밀고 당깁니다. 나 또한 XMPP XEP extensions 중 일부를 사용합니다. 다른 작업의 경우, 모든 모바일 애플리케이션이 HTTP REST 인터페이스를 통해 소비하는 동일한 서버에서 장고 애플리케이션을 실행합니다. 장고 측에서 비동기 적으로 일부 작업을 수행하기 위해 Celery 및 Redis를 사용합니다 (예 : 대량 데이터베이스 일괄 처리).소켓 IO (또는 Strophe.js), XMPP 및 Django가 포함 된 실시간 서버 푸시

이 모든 것이 훌륭하게 멋지게 작동합니다. 예.

하지만 지금은이 모든 것에 웹 프런트 엔드를 쓰고 싶습니다. 그래서 옵션을 연구하기 시작했습니다. 우선 SO 커뮤니티에서 확인하고 싶은 고양이를 여러 가지 방법으로 조사하고 있습니다.

소켓 통신을위한 통합 API (즉, 웹 소켓의 다른 구현을 시도하거나 플래시로 폴백)를 제공하는 js 라이브러리를 갖는 아이디어가 나에게 호소합니다. 그렇기 때문에 소켓 IO에 대해 언급합니다. nodejs 서버를 실행해야한다는 생각은, 많이는 아니지만, 배울 점이 더 많습니다.하지만 꼭해야만한다면, 분명히 할 것입니다. 어떤 사람들은 gevent as a replacement of the node server을 사용합니다. 기타는 small nodejs which they connect to the rest of their stack로 작성하십시오. 나는 아마 이것을 할 것이다.

또 다른 옵션은 플래시 폴백이 없다고 생각하는 Strophe과 같은 js XMPP 라이브러리를 사용하는 것입니다. 또한, 내 서버에서 이것이 무엇을 의미하는지 연구해야 할 것입니다.

나는 혜성과 장고를하는 방법에 대한 Stackoverflow 답을 여러 권 읽었으므로 몇 가지 옵션이있는 것 같습니다.

질문 :

I합니다 (폴백 (fallback)와) 소켓 IO 동작의 장점을 갖고 싶어하고 내가 XMPP를 통해 서버에 공급되고있는 웹 클라이언트에 실시간 데이터 (푸시 할), 그리고 장고를 사용하여 최선의 선택은 무엇입니까?

업데이트 : 내가 사용 XMPP 서버는 BOSH을 지원 ejabberd이다. 나는 Strophe.js을 사용할 수 있다는 것을 알았고 따라서 나의 통신은 웹 소켓 대신에 긴 폴링 (polling) HTTP 연결 유형을 거쳐야했다. 내가 알 수있는 한, XMPP over Websockets open source library이 있지만 AFAIK 커뮤니티는 SocketIO만큼 활발하지 않습니다.

업데이트 2 : 지원해야하는 브라우저는 최신 브라우저입니다. 이것은 플래시 대체가 그다지 중요하지 않다는 것을 의미합니다. 이것은 나를 스트로피쪽으로 기울이고 있습니다 .js.

+1

js보다 다른 언어로 socket.io 서버 구현이 있습니다. 노드는 참조 서버 일뿐입니다. Go.socket.io를 사용하여 socket.io 서버를 Go로 작성했습니다. 파이썬에는 스택에 토네이도를 사용하는 TornadIO2가 있습니다. – jdi

답변

5

strophe.js가 수행하는 BOSH (XEP-0124, XEP-0206)를 수행하려는 경우 플래시 대체가 필요한 이유가 확실하지 않은 이유를 잘 모릅니다. IE7을 지원할 필요가없는 경우 strophe.js에서 CORS을 수행 할 수 있으며 동일한 출처에 대한 프록시조차 필요하지 않습니다. IE6는 안전하지 않으므로 작동 할 것이며 IE8 +는 CORS의 간신히 작동하는 양식을 지원합니다.

, 당신의 클라이언트에 XMPP를 통해 장고에서 정보를 사용하여 서버에 구성 요소 연결 ( XEP-0114)를 만들기 위해 당신의 마음에 드는 Python XMPP library, 장고 응용 프로그램에서 같은 SleekXMPP. 퍼포먼스를 위해 상대적으로 수명이 긴 연결을 설정하십시오 (즉, 각 클라이언트 연결마다 새 연결을 만들지 마십시오). 필요에 따라 프로토콜을 전송하십시오.

사용중인 XMPP 서버를 언급하지 않았습니다.BOSH를 지원하지 않는 XMPP 서버는 거의 없지만, 가지고 있다면 BOSH-XMPP 프록시로 Punjab이 필요하거나 Prosody과 같이 server으로 새 버전으로 전환해야 할 수 있습니다.

+0

나는 이미 BOSH를 지원하는 ejabberd를 사용하고 있으므로 프록시가 필요 없다고 생각합니다. 나는 IE6-IE7을 지원할 필요가 없으며 IE8을 방정식에서 벗어나면 내 선택입니다. – rburhum

8

일단 어떤 노드로 손을 더럽 혔다면 socket.io 노드에서 이탈하면 훨씬 더 어려워 질 것입니다. 노드에 준비된 xmpp 모듈을 매우 쉽게 사용할 수 있습니다 (https://github.com/astro/node-xmpp 참조). 기억하십시오, 노드는 모두 자바 스크립트이므로, 이미 프로그래밍을 잘 알고있을 것입니다.

개인적으로 노드 0.6 이상을 사용하여 메모리 누수 문제가 발생했습니다. 노드 0.4는 이러한 문제없이 작업했습니다. 만약 당신이 github에 익숙하지 않다면 (노드로 연주하기 전에) 노드 서버로 갈 수있는 방법이 있습니다.

리눅스 박스와 좋아하는 디렉토리 노드

  1. 로그인 정보를 얻기 (
  2. 자식 클론 https://github.com/joyent/node.git
  3. CD/노드
  4. 자식 태그 -l을이 (내가/가정합니다)
  5. git checkout v0.6.16 (노드의 0.6.16 버전을 체크 아웃 할 수 있습니다. 예를 들어 v0.4.12로 교체 할 수 있습니다. 당신은 메모리 문제)
  6. ./configure를
  7. 메이크업

당신은이 같은 ++ g으로 구축 할 특정 개발 도구가 필요합니다 설치 확인을 가지고 있지만이 시점에서 당신은 작업을해야합니다 node 명령. XMPP 같은

설치 노드 모듈

노드가 대부분의 물건은 이미 당신을 위해 기록 된 모듈의 좋은 금액을 가지고있다. http://search.npmjs.org에 검색 기능이 있거나 npm 명령을 사용하여 쉘에서 직접 모든 모듈에 액세스 할 수 있습니다. NPM은 노드 모듈을 설치하고 관리하기위한 노드 도구입니다. npm search xmpp을 입력하면 모든 xmpp 모듈을 검색 할 수 있습니다. 노드 용 기본 xmpp 라이브러리를 설치하려면 npm install node-xmpp을 사용하십시오. 그런데 대부분의 github 노드 모듈 페이지에는 첫 페이지 readme 파일에 대한 지침이 포함됩니다. 처음 시작 할 때

이 생산에서 실행

유지 노드 나를 던졌다. 잡히지 않은 오류가 있으면 노드가 단순히 죽을 것입니다. 따라서 중 하나 일 수 있습니다. 1. 오류가 없거나 모두 잡히게됩니다 (노드 자체도 오류가 발생하기 때문에 거의 발생하지 않음). 2. uncaughtException 핸들러를 사용하여 이러한 문제점을 잡으십시오. 당신은

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

}); 

엑스트라 안전하고도 생산 프로그램이 죽을 수도의 uncaughtException의 문제를 영원히

를 사용하여 프로그램에서 같은 코드를 사용합니다. 메모리 부족, 세그 폴트, 누가 무엇을 압니까? 그것이 바로 영원한 노드 모듈 (https://github.com/nodejitsu/forever 참조)과 같은 멋진 노드 모듈을 사용하는 데 드는 비용입니다.영원히 설치하려면 npm install forever -g을 입력 할 수 있습니다. 영원히 GLOBAL 노드 모듈 디렉토리에 놓는 -g 옵션에주의하십시오. -g를 지정하지 않으면 노드 모듈이 현재 작업 디렉토리에 놓입니다. 다음과 같이 입력 할 수 있습니다 (노드 프로그램이 my_program.js라고 가정) forever start my_program.js을 입력 한 다음 영원히 프로그램을 종료하면 다시 시작됩니다.

2

우리는 Django 및 Celery와 실시간 푸시를 사용하고 있습니다. 처음 아키텍처를 만들었을 때 제 옵션도 연구했습니다. 결국, 나는 devapp 작업으로 주변을 둘러 보지 않고 앱을 올바르게 만드는 데 초점을 맞추기로 결정했습니다. 거기에 몇 가지 서비스를 제공하는 호스팅 된 실시간 푸시 기술을 쉽게 모든 응용 프로그램과 통합 할 수 있습니다.

PubNub을 선택했는데 행복하지 않았습니다. 클라이언트 측에서 socket.io를 지원하고 Django 및 Celery 작업자가 사용하는 Python 라이브러리가 있습니다. 또한 기본 모바일 앱에서 사용할 수있는 SDK가 있습니다.

아시다시피, 이미 작동중인 설정이 있습니다. 하지만 현재 호스팅하고있는 솔루션으로 현재 설정을 바꾸는 데 걸리는 시간이 당신이 찾고있는 것에 대한 좋은 해결책을 찾고 구현할 시간보다 짧을 것이라고 저는 확신합니다. 또한 유지 보수 비용을 염두에 두어야합니다 (특히 유지 관리가 어려운 lib를 선택하는 경우).

사실, 당신은 서비스 비용을 지불하게 될 것이지만, 가격은 매우 합리적이며, 당신은 colocation과 같은 멋진 특권으로 견고한 서비스를 받게 될 것입니다.

나는 그 회사와 관련이 없으며 행복한 고객입니다. other similar services out there이 있습니다.

+0

문제는 모든 클라이언트가 매초 1 초마다 메시지를 푸시 할 수 있으며 매 초마다 1 초의 메시지를 받게된다는 것입니다 (서버 쪽에서 메시지를 버퍼링하고 최적화 및 압축하여 1로 만들 때만).이것이 내 인프라의 중요한 부분이 될 것이므로, 나는 그것을 다른 회사에 아웃소싱하지 않을 것입니다. 그럼에도 불구하고 quora 질문에 대한 링크를 통해 여러 가지 자체 호스팅 옵션에 대한 링크가 제공되었습니다. 고맙습니다! – rburhum

4

우선, 전체 공개 : 나는 곧 언급 할 PubNub라는 회사에서 일합니다.

고려할만한 가치가 있다고 생각되는 호스팅 된 양방향 메시징 서비스 (서비스로 IaaS - 인프라라고도 함)가 있습니다. 그들은 Pusher, Firebase, Flotype, PubNub 등입니다. 나는 당신이 성취하려는 것을 위해 당신이 사용할 수 있다고 확신합니다. Firebase에는 서비스와 관련이있는 데이터베이스가 내장되어 있습니다.이 유틸리티는 매우 유용한 기능이지만, 특정 유스 케이스에는 유용하지 않을 것입니다. 이미 백엔드에 데이터베이스가 있다고 가정합니다.

우리 경쟁자에 관해 너무 많이 말할 수는 없지만, 파이썬 백엔드와 통신하는 프론트 엔드의 JavaScript 라이브러리를 원한다면 우리 (PubNub)는 a very similar api in both languages을 제공하며 클라우드의 동일한 데이터 버스에서 통신합니다 . 따라서 Python으로 메시지를 보내고 JavaScript로 메시지를 잡을 수 있습니다. 심지어 바닐라 자바 ​​스크립트 API 대신 사용할 수있는 PubNub-hosted version of socket.io을 작성했으며 약 10 줄의 코드로 장고 백엔드에 연결합니다.

마지막으로, IaaS (또는 적어도 우리, ​​다른 사람들에 대해서는 확실하지 않습니다) 사용에 대한 좋은 점은 우리가 까다로울 정도로 을 처리한다는 것입니다. 문제가 있습니다. 수백만 명의 사용자가 동시에 실시간으로 뭔가를 푸시해야한다면 아무런 문제가 없을 것입니다.

관련 문제