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.

Другие вопросы по тегам