Любая идея, почему запросы к vertx, встроенным в grails, синхронно помещаются в очередь
Environment: Mac osx lion
Grails version: 2.1.0
Java: 1.7.0_08-ea
Если я запускаю vertx во встроенном режиме в Bootstrap.groovy и пытаюсь подключиться к одной и той же конечной точке веб-сокета через несколько браузеров, запросы попадают в очередь.
Таким образом, в зависимости от времени выполнения запросов, после выполнения одного запроса с его выполнением следующий запрос попадает в обработчик.
Я попробовал это с обоими websocket и SockJs и заметил одинаковое поведение на обоих.
BootStrap.groovy (SockJs):
def vertx = Vertx.newVertx()
def server = vertx.createHttpServer()
def sockJSServer = vertx.createSockJSServer(server)
def config = ["prefix": "/eventbus"]
sockJSServer.installApp(config) { sock ->
sleep(10000)
}
server.listen(8088)
JavaScript:
<script>
function initializeSocket(message) {
console.log('initializing web socket');
var socket = new SockJS("http://localhost:8088/eventbus");
socket.onmessage = function(event) {
console.log("received message");
}
socket.onopen = function() {
console.log("start socket");
socket.send(message);
}
socket.onclose = function() {
console.log("closing socket");
}
}
ИЛИ ЖЕ
BootStrap.groovy (Websockets):
def vertx = Vertx.newVertx()
def server = vertx.createHttpServer()
server.setAcceptBacklog(10000);
server.websocketHandler { ws ->
println('**received websocket request')
sleep(10000)
}.listen(8088)
Javascript
socket = new WebSocket("ws://localhost:8088/ffff");
socket.onmessage = function(event) {
console.log("message received");
}
socket.onopen = function() {
console.log("socket opened")
socket.send(message);
}
socket.onclose = function() {
console.log("closing socket")
}
4 ответа
Из полезных людей в Vertx:
def server = vertx.createHttpServer () - это фактически вертикаль, а вертикаль - однопоточный процесс
Как говорит блюзмен, каждая вертикаль идет в своей теме. Вы можете распределить свои статьи по ядрам в вашем оборудовании, даже кластеризовав их с большим количеством машин. Но это добавляет способность принимать одновременные запросы.
При программировании приложений реального времени, мы должны постараться создать ответ как можно скорее, чтобы избежать блокировки. Если вы считаете, что ваша операция может быть длительной, рассмотрите эту модель:
- Сделать запрос
- Передайте задачу рабочей вертикали и присвойте этой задаче UUID (например) и поместите ее в ответ. Звонящий теперь знает, что работа идет, и так быстро получает ответ
- Когда рабочий завершает задачу, поместите уведомление в шину событий, используя назначенный UUID.
- Вызывающая сторона проверяет шину событий на результат задачи.
Обычно это делается в веб-приложении через websockets, sockjs и т. Д.
Таким образом, вы можете принять тысячи запросов без блокировки. И клиенты будут получать результат без блокировки пользовательского интерфейса.
Как упоминалось ранее, концепция Vertx основана на схеме реактора, что означает, что один экземпляр имеет по крайней мере один однопоточный цикл событий и обрабатывает события последовательно. Теперь обработка запроса может состоять из нескольких событий, смысл в том, чтобы обслуживать запрос и каждое событие с помощью неблокирующих процедур.
Например, когда вы ожидаете сообщения Web Socket, запрос должен быть приостановлен, а в случае сообщения он возвращается. Что бы вы ни делали с сообщением, оно также должно быть неблокирующим, таким образом асинхронным, как любой файловый ввод-вывод, сетевой ввод-вывод, доступ к БД. Vertx предоставляет базовые элементы, которые вы должны использовать для создания асинхронного потока: буферы, насосы, таймеры, EventBus.
Завернуть - просто никогда не блокировать. Использование sleep(10000)
убивает концепцию. Если вам действительно нужно остановить выполнение, используйте таймеры VertX.
Vert.x использует JVM для создания так называемой "схемы реактора", то есть схемы реактора, модифицированной для улучшения производительности.
Насколько я понял, это неправда, что каждая вертикаль имеет свой собственный поток: дело в том, что каждая вертикаль всегда обслуживается одним и тем же циклом событий, но больше вершин можно связать с одним и тем же циклом событий, и может быть несколько циклов событий. Цикл обработки событий в основном является потоком, поэтому немногие потоки должны обслуживать множество статей.
Я не использовал vert.x во встроенном режиме (и я не знаю, изменится ли основная концепция), но вы должны выполнять гораздо лучшие экземпляры для своей работы.
С уважением, Карло