如果我有 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 一起使用