routing - Dart 多服务器中的端口转发请求//隔离处理程序

标签 routing dart portforwarding dart-io dart-isolates

如果我有 4 个 Dart 服务器正在运行并且我想转发请求,我将如何在 Dart 中执行此操作?
一方面,我希望有效地对请求使用react,但也能够以不同的方式处理某些请求,或者在某处处理来自某个城市的 IP。所以我评估一个 session ID 并说这个 session 应该由 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 负载平衡一样)
我怎样才能理想地将请求路由到隔离区?
(我发现的任何示例要么已过时,要么使用了我不喜欢的模式:为每个请求生成隔离...不是一个好主意。我宁愿在隔离中动态创建服务器实例并在那里转发请求)

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

最佳答案

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

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

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

关于routing - Dart 多服务器中的端口转发请求//隔离处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23492925/

相关文章:

flutter - ListTile中具有图像和标签的Flutter左对齐列将不会垂直扩展并裁剪图像

android - 客户端连接到服务器时出现超时错误

internet-explorer - 如何让 AngularJS 路由在 IE 8 上工作

ruby-on-rails - Rails 应用程序中的前缀 url

node.js - 我使用 express for node.js 得到冒号和我的参数

android - 由于QuerySnapshot为null,即使在initState()中初始化后,也对null调用了getter 'docs'

routing - 路由中的多个 Controller

google-chrome-extension - 在 Chrome 扩展内容脚本中使用 Dart 不运行?

spring-boot - 如何在运行Spring Boot应用程序的kubernetes中使用在localhost上运行的服务器的端口