2016-04-14 1 views
0

Веб-клиент будет заблокирован в ожидании ответа, но на сервере ничего не будет заблокировано, а серверные ресурсы могут использоваться для обслуживания других клиентов.Play framework работает с длинными задачами блокировки, не блокируя клиента

Некоторые из запросов клиента требуют, чтобы мой сервер выполнял длительные задачи блокировки. Я понимаю, что могу выполнить их в отдельном пуле потоков.
Но я также не хочу, чтобы клиент был заблокирован. Я просто хочу немедленно ответить клиенту (например, OK получил вашу длинную задачу блокировки). Клиент не заботится о том, чтобы получить результат выполнения задачи, он просто должен знать, что я работаю над его выполнением.

Как я могу реализовать это поведение в игре?

Я думаю, что могу создать очередь заданий и использовать другой поток для обработки очереди заданий. Если контроллер воспроизведения только добавляет задание в очередь, а другой поток выполняет задания из очереди. Должен ли я это сделать? Должен ли я использовать акка Акка? (Я не знаю, Akka мне нужно будет выучить)

ответ

1

Callbacks

Все началось с обратными вызовами.

Вы наверняка видели это:

Something.save(function(err) { 
    if (err) { 
    //error handling 
    return; 
    } 
    console.log('success'); 
}); 

Это определение обратного вызова в JavaScript - то, что будет выполняться асинхр. Благодаря их синтаксису, реализации и т. Д., Обратные вызовы на самом деле не ваш друг. Перенапрягают их могут привести к ужасной обратному вызову ад

Обещания

В этом контексте: Обещания в ES6

Something.save() 
    .then(function() { 
    console.log('success'); 
    }) 
    .catch(function() { 
    //error handling 
    }) 

Обещание не «ES6-вещь», они существовали в течение многих лет , ES6 приносит их вам. Обещания хороши, вы можете их даже цепочки:

saveSomething() 
    .then(updateOtherthing) 
    .then(deleteStuff) 
    .then(logResults); 

Но достаточно с асинхронным для сумасшедшего.

WebSocket

WebSocket является то, что я бы рекомендовал:

  • на сегодня very well supported
  • замечательная поддержка в Play 2.x
  • полнодуплексный TCP
  • вы, наконец, найти время изучить Akka;)

Таким образом, вы можете создать клиент, который открывает соединение WebSocket с приложением Play. На стороне сервера вы можете handle WebSocket connections either with Akka actors (что я рекомендую) или с обратными вызовами в потоках.Использование актеров очень просто, а также весело - вы определяете актера - и когда кто-то открывает соединение с WebSocket, экземпляр этого актера создается, а затем каждое сообщение, которое вы получили в канале WebSocket, будет получено актером - вы может сконцентрироваться на вашей бизнес-логике, не задумываясь об окружающей среде, а затем отправить сообщение обратно - что-то, что выделяет Акка.

Смежные вопросы