Запрос на переадресацию порта в мультисервере Dart // Изолятор

Если у меня запущен сервер 4 Dart и я хочу пересылать запросы, как мне это сделать в Dart? С одной стороны, я хочу эффективно реагировать на запросы, а также иметь возможность обрабатывать определенные запросы определенным образом или иметь IP-адрес из какого-либо города. Поэтому я оцениваю идентификатор сеанса и говорю, что этот сеанс должен обслуживаться сервером server2:1234, что означает, что в идеале ответ должен быть напечатан этим сервером, а не маршрутизировать все через server1:80, потому что это значительно снижает доступность server1:80.

В "привет мире" номера:
сервер1: 80 может обслуживать приблизительно: 8000 рэк / сек
Приблизительно 4 сервера могут обслуживать примерно 15-20000 запросов в секунду (с nginx в качестве внешнего интерфейса)

Изоляты не могут обрабатывать httprequests afaik. Мне нужно было бы проанализировать / понизить запрос на изолят, что еще хуже.

2 вопроса:

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

Основная проблема, которую я вижу, заключается в том, что вы не разделяете память, поэтому вопрос заключается в том, возможно ли даже направить какие-либо данные без дублирования копии. Если серверы работают на разных машинах, это может привести к серьезным накладным расходам. Метод динамического заголовка перенаправления / перезаписи был бы лучшим, я думаю. Но даже для этого мне понадобится, скажем, 4-16 "потоков" на порте 80, чтобы быть эффективными. Афайк не возможно с дротиком. Что лучше всего сделать?

Я бы очень признателен за помощь здесь.

ОБНОВИТЬ

с этим патчем: https://codereview.chromium.org/250513002/
на самом деле вы можете достичь параллельных серверных процессов, которые работают подобно старому патчу: https://codereview.chromium.org/25511002/

в обоих случаях вы прослушиваете один и тот же порт, но в случае два вы можете просто запустить другой процесс и повторно использовать порт, в то время как в первом случае вы можете запускать процессы в изолятах и ​​совместно использовать ServerSocketReference.

Более старый патч нуждался в некоторых корректировках, но, наконец, с новым SDK я, по крайней мере, смог избавиться от nginx. Сохранение пропуска прокси-сервера nginx доставляет на 10-20 % больше запросов о приветствии. С двумя параллельными процессами я достиг примерно 140% производительности, в то время как с 3 и 4 это было только 145%. Но в целом на моем ноутбуке около 10 тыс. Запросов в секунду, и это хорошо (также говорится, что мы просто хотим умереть здесь в красоте;))

Это очень экспериментально, и никто не знает, как это будет работать в будущем. Я рекомендую первый патч, так как он кажется более чистым.

Вот основной пример, который я хотел найти ранее:)

import 'dart:io';
import 'dart:isolate';
isoserve(List d){
    d[0].create().then((server){
    HttpServer httpserver = new HttpServer.listenOn(server);
             httpserver.listen((HttpRequest hr){
             hr.response.write(d[1]);
         hr.response.close();
     });
    });
}

main() { 
    ServerSocket.bind(InternetAddress.ANY_IP_V6, 5555).then( (serverSocket) {
        Isolate.spawn(isoserve,[serverSocket.reference,"aloha world"]);
        Isolate.spawn(isoserve,[serverSocket.reference,"aloha world 2"]);
        });
}

ОБНОВЛЕНИЕ == теперь работает с SDK 1.4

2 ответа

На самом деле Dart HttpServer очень плохо спроектирован. Socket, RawSokcet, SecureSocket и т. д. В NodeJs у вас есть Tcp Socket, который вы можете перенаправить на любой сервер Http,HTTPS или сервер Websocket. Если вы используете общие порты между серверами http и https, он не передает все запросы https на сервер https. Таким образом, изоляция может запускать отдельный процесс, но не гарантирует работу.

Дарт 1.13 добавляет shared флаг при создании серверных сокетов и экземпляров HttpServer. Это позволяет нескольким изолятам связываться с одним и тем же портом. Входящие запросы на соединение распределяются поровну между слушающими изолятами.


Кажется, нет открытой ошибки для этого. Я нашел эту информацию: https://groups.google.com/a/dartlang.org/forum/

Команда Dart рассматривает возможность "передачи", чтобы разрешить копирование, кроме List/Map/String/num/bool, между изолятами, что должно позволить передавать соединения в другой изолят. Обсуждение также содержит несколько других мыслей и попыток решить эту проблему.

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