Sequelize.js를 ORM으로 실행중인 익스프레스 앱이 있습니다. 익스프레스 앱은 주요 Rails 앱에서 요청을받으며 도메인 간 정책으로 인해 이러한 요청은 getJSON을 통해 수행됩니다.너무 많은 요청으로 인해 ExpressJS 백엔드가 걸려 있습니다.
클라이언트에서 사용자가 키를 누를 때 요청이 시작됩니다. 모든 것이 잘되고 익스프레스는 사용자가 키를 누를 때마다 수행되는 쿼리 (및 json이 제공됨)를 기록합니다. 빨리 치는 것을 시도조차 그것은 ok를 실행한다. 하지만 키를 눌렀을 때 (또는 여러 클라이언트가 키를 매우 빠르게 누르는 경우) 요청이 많이 발생하기 시작하면 잠시 서버가 멈추고 그 시점의 모든 요청이 보류 상태가됩니다. Chrome Dev Tools의 Network 탭에서), 천천히 타임 아웃되기 시작합니다. 다시 응답하도록 서버를 재부팅해야합니다.
models.Comment.findAllPublic(req.params.pId, req.params.sId, function(comments){
var json = comments.map(function(comment){
var com = {};
['user_id','user_avatar', 'user_slug', 'user_name', 'created_at', 'text', 'private', 'is_speaker_note'].forEach(function(key){
com[key]=comment[key];
});
return com;
});
res.json({comments: json});
});
그리고 코멘트 모델에서 findAllPublic 방법은 (이것은 Sequelize 모델입니다)입니다 :
내 요청에 대한 서버 코드는
findAllPublicAndMyNotes: function(current_user, presentationId, slideId, cb){
db.query("SELECT * FROM `comments` WHERE commentable_type='Slide' AND commentable_id=(SELECT id from `slides` where `order_in_presentation`="+slideId+" AND `presentation_id`="+presentationId+") AND (`private` IS FALSE OR (`private` IS TRUE AND `user_id`="+current_user+" AND `is_speaker_note` IS FALSE))",self.Comment).on('success', cb).on('failure',function(err){console.log(err);});
}
어떻게 점점에서 서버를 방지하기 위해 붙어있어? 새로운 요청이있을 때 서버를 천천히 정지시킬 수있는 요청에 차단 코드를 남겨두고 있습니까?
처음에는 Sequelize 모델에서 json 객체를 작성할 때 "forEach"때문에 문제가 될 수 있다고 생각했지만, mysql 쿼리의 콜백을 비워 뒀으며 비어있는 json 만 응답했고 또한 겨울 왕국.
아마도 mysql 커넥터의 문제일까요? 서버가 멈추었을 때 나는 일반적으로 mysql 콘솔을 실행하고 데이터베이스에서 쿼리를 수행 할 수 있으며 응답하기 때문에 문제인지 여부는 알 수 없다.
키가 오랫동안 눌러지면 너무 많은 요청을 발생시키지 않도록 키 이벤트를 제어 할 수 있지만 여러 클라이언트가 키를 반복하여 동시에 누를 때 문제가 발생하는 것처럼 보입니다.
의견이 있으십니까? 도움에 미리 감사드립니다 : D
autosuggest와 같은 것을 만들면 되나요? –