2013-03-15 3 views
6

현재 데이터베이스에 mysqldb을 사용하고 있으며 실시간으로 메시징 기능을 통합해야합니다. 토네이도가 데이터베이스를 구현하지 않습니다 제공 chat demo,데이터베이스에 실시간 채팅 메시지를 저장하는 방법은 무엇입니까?

이 메시징 서비스는 또한 페이스 북의 메시지 서비스의 작동 방식과 같은 미래의 이메일 (로 두 배로. 채팅 플랫폼합니다 (blog을. 못하다) 그럼에도 불구하고, 나는 현재의 첫 번째 채팅 버전이 전자 메일처럼 작동하도록 확장 될 수 있는지, 전체적으로 데이터베이스에 메시지를 저장해야하는지 확인하고 싶습니다.

다음과 같이 간단합니다. 전송 된 모든 채팅 메시지에 대해 데이터베이스를 쿼리하고 사용자의 화면에 메시지를 표시합니다. 또는이 방법이 서버 부하가 높고 최적화가 좋지 않은 경우가 있습니까? 이 작업을 수행하려면 "인프라"를 얼마나 정확하게 구성해야합니까?

(나는이 문제의 고유의 주관성의 일부에 대해 사과하지만, 나는 "한 번, 두 번 코드를 측정합니다."선호) 평가

입력, 예제 및 자원을.
감사합니다.

답변

12

토네이도는 단일 스레드 비 차단 서버입니다.

메인 스레드에서 차단 호출을하면 결국 성능이 저하됩니다. 각 데이터베이스 호출이 20ms 동안 만 차단 될 수 있으므로 처음에는이를 알지 못합니다. 그러나 초 당 200 개 이상의 데이터베이스 호출을 수행하면 응용 프로그램이 효과적으로 잠겨집니다.

그러나 DB 호출은 꽤 많습니다. 귀하의 경우 200 명이 같은 시간에 채팅 메시지를 보내 게됩니다.

차단 API가없는 대기열을 사용하는 것이 좋습니다. 그래서 토네이도는 채팅 메시지를 받는다. 대기열에 넣으면 다른 프로세스가 데이터베이스에 저장 한 다음 채팅 메시지를 다시 다른 채팅 회원에게 보냅니다.

누군가가 채팅 세션에 연결하면 이전의 모든 메시지에 대한 요청을 대기열로 보내야합니다. 대기열에 응답하면 새로 연결된 사용자에게 대기열을 보냅니다.

어쨌든 문제에 접근하는 방법입니다.

또한이 질문을보고 답변 : Any suggestion for using non-blocking MySQL api on Tornado in Python3?

그냥 기억, 토네이도는 단일 스레드입니다. 놀랍다. 또한 수천 개의 동시 연결을 처리 할 수 ​​있습니다. 하지만 그 연결 중 하나에있는 코드가 1 초 동안 차단되면 NOTHING 그 동안 다른 연결에 대해 다른 작업이 수행됩니다.

+0

와우 이것은 훌륭한 답변입니다. 도움을 주셔서 감사합니다. 이것은 완벽한 의미를 가지며 시작할 수있는 좋은 곳입니다. – JohnZ

+3

이전에 프로덕션 앱의 토네이도 루프에서 차단 호출을 사용했다고 말할 수 있습니까? :) – aychedee

관련 문제