1

如果我有 4 个 Dart 服务器正在运行并且我想转发请求,我将如何在 Dart 中执行此操作?一方面,我希望有效地对请求做出反应,但也能够以不同的方式处理某些请求,或者在某处处理来自某个城市的 IP。所以我评估了一个会话 ID 并说这个会话应该由 server2:1234 提供服务,这意味着理想情况下响应将由该服务器打印,而不是通过 server1:80 路由所有内容,因为这会大量消耗 server1:80 的可用性

在“hello world”数字中:
server1:80 可以服务 aprox:8000 req/sec
4 个服务器可以服务 aprox:15-20000 req/sec(使用 nginx 作为前端)

隔离无法处理 httprequests afaik 我需要解析/降级隔离的请求,这更糟糕。

2个问题:

如何在不阻塞主实例的情况下转发请求?
(如使用 nginx 负载平衡)
我怎样才能理想地将请求路由到隔离?
(我发现的任何示例要么已过时,要么使用了我不喜欢的模式:为每个请求生成隔离...不是一个好主意。我宁愿在隔离中动态创建服务器实例并在那里转发请求)

我看到的主要问题是,您不共享内存,所以问题是,是否甚至可以在没有重复副本的情况下路由任何数据。如果服务器在不同的机器上运行,您将产生严重的流量开销。我猜最好有一种动态标头重定向/重写的方法。但即使如此,我也需要在端口 80 上说 4-16 个“线程”以提高效率。飞镖不可能实现 Afaik。最好的办法是什么?

我真的很感谢这里的帮助。

更新

使用此补丁: https
://codereview.chromium.org/250513002/ 您实际上可以实现与旧补丁类似的并行服务器进程: https ://codereview.chromium.org/25511002/

在这两种情况下,您都在同一个端口上侦听,但在两种情况下,您可以只运行另一个进程并重用该端口,而在一种情况下,您可以在隔离中运行进程并共享一个 ServerSocketReference。

旧补丁需要一些调整,但最终使用新的 SDK,我至少可以摆脱 nginx。保存 nginx 代理通行证可以多提供 10-20% 的 hello world 请求。使用 2 个并行进程,我实现了大约 140% 的性能,而使用 3 和 4,它只有 145%。但是在我的笔记本电脑上总共大约 10k req/sec 这很好(也说明我们只想在这里死于美丽;))

这是高度实验性的,没有人知道它将来会如何工作。我推荐第一个补丁,因为它似乎是更清洁的方法。

这是我希望早先找到的基本示例:)

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"]);
        });
}

UPDATE == 现在可与 SDK 1.4 一起使用

4

1 回答 1

0

Dart 1.13shared在创建服务器套接字和 HttpServer 实例时添加了标志。这允许多个隔离绑定到同一个端口。传入的连接请求平均分配给侦听隔离。


似乎没有开放的错误。我找到了这个信息:https ://groups.google.com/a/dartlang.org/forum/#!topic/misc/yYNRbBm0zmM

Dart 团队正在考虑使用“可转移”以允许在隔离之间进行除 List/Map/String/num/bool 之外的复制,这应该允许将连接转移到另一个隔离。讨论还包含其他几个想法和对这个问题的尝试。

于 2014-05-06T11:51:41.130 回答