У меня есть HTTP-сервер Netty, который я использую в качестве сервера API. Пользователь отправляет события на сервер API и обрабатывает событие на других потоках на том же сервере, используя службы-исполнители или инфраструктуру параллелизма, такую как Akka. У меня есть два варианта ответа; когда я отправляю событие в другой поток, я могу подождать ответа и записать его в сокет или просто записать сообщение подтверждения обратно в сокет.Ожидание ответа на серверах API
Когда я жду ответа, время ожидания HTTP-запросов увеличивается, и количество запросов, которые сервер может обрабатывать, уменьшается. С другой стороны, нет контроля за противодавлением, поэтому мы не знаем, когда сервер будет обрабатывать событие, и я не могу сообщить пользователю, что сервер обработал событие. Тем не менее, количество HTTP-запросов, которые сервер может обрабатывать, увеличивается, потому что задержки для большинства запросов достаточно низки.
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof HttpRequest) {
executor.submit(new Event(msg));
// do not wait for the response
ctx.write(new DefaultFullHttpResponse(HTTP_1_1, OK));
}
}
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof HttpRequest) {
Future<Object> future = executor.submit(new Event(msg));
future.after(x -> ctx.write(new DefaultFullHttpResponse(HTTP_1_1, OK)));
}
}
Поскольку это сервер API, я не должен ждать ответа для того, чтобы информировать пользователя о том, что обрабатывается событие, потому что это просто запрос на запись, которая не возвращает ответ. Итак, какой способ является наиболее удобным для серверов HTTP, и считаете ли вы, что второй вариант стоит для его производительности?
Итак, в чем вопрос? – biziclop
Я обновил вопрос @biziclop – Boyolame