Dart Routing к нескольким клиентам одновременно
У меня проблема с сервером Dart. Я пытаюсь отправить нескольким клиентам некоторую информацию, но у меня нет информации, доступной для них, когда они запрашивают ее. Это означает, что я использую Future
и когда это Future
После завершения я отправлю данные клиенту.
Проблема в том, что сервер не позволит второму (или более) клиенту подключаться к серверу, пока первый Future
все еще ждет завершения
Вот пример:
import "dart:async";
import "dart:io";
import "package:route/server.dart";
void main(List<String> args) {
HttpServer.bind("localhost", 5000)
.then((HttpServer server) {
Router router = new Router(server)
..serve("/multi").listen(_multi);
});
}
void _multi(HttpRequest request) {
print("Waiting");
new Timer(new Duration(seconds: 5), () {
print("Replying");
request.response.write("Hello There");
request.response.close();
});
}
В принципе, если у вас есть только один клиент, подключенный одновременно, это работает отлично. Однако, если у вас более одного клиента, первый подключившийся клиент заблокирует второго клиента до тех пор, пока соединение первого клиента не будет закрыто.
Я также пытался использовать ..serve("/multi").asBroadcastStream()...
потому что я думал, что это позволило бы нескольким подписчикам, но это было то же самое поведение.
Есть ли способ сделать это?
Благодарю.
2 ответа
Я уверен, что он не блокирует запросы. Я думаю, что это ваш клиент (браузер?), Который ставит в очередь соединения, чтобы использовать только один сокет (вероятно, с keep-alive). Это очень нормально для браузеров, сводя количество используемых сокетов к минимуму.
Сервер Dart предназначен для обработки нескольких запросов одновременно, и пакет маршрутизатора не является исключением из этого.
Вы можете выделить один изолят для сбора данных и несколько изолятов, каждый из которых обрабатывает запрос клиента (используя стратегии, рассмотренные в вопросе, на который вы ссылались в своем комментарии).
Все ваши изоляты для обработки запросов могут подключаться к одному изолятору для сбора данных и блокироваться, пока данные не станут доступны.
Изолят для сбора данных может кэшировать данные для обслуживания одних и тех же данных для каждого последующего запроса.
Я еще мало использовал изоляты, и я не знаю, могут ли несколько изолятов (обработчик запросов) подключаться к одному изолятору (сборщику данных) с использованием портов, и если это работает, как это ведет себя.
Если это не сработает, я уверен, что несколько изолятов (обработчик запросов) могут подключиться к одному изолятору (сборщик данных) с помощью TCP.