- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设您需要编写一个 1000 rps 的服务器。将来负载可能会增加。服务器仅服务于一种请求 - getGender(name)
,它接受一个名称,并返回 Male
/Female
。确定性别是最简单的操作,需要单索引查找,其中索引是内存中的数据结构。
如果理解正确 - 您创建单个 ServerVerticle
,并运行 Runtime.getRuntime().availableProcessors()
worker verticles 委托(delegate)作业(见下面的代码) .
问题:
NetServer
可以处理 3000 rps,但工作人员坚持处理它们。 Vert.x 是否有任何队列来保持等待请求?怎么做?如果有 - worker 失败会发生什么?NetServer
无法处理 3000 rps - 只需运行服务器的几个实例。 没有陷阱,对吧?ServerVerticle
与事件循环在同一个线程中运行,对吗?ServerVerticle.java
public class ServerVerticle extends AbstractVerticle {
public static void main(String[] args) {
Consumer<Vertx> runner = vertx -> vertx.deployVerticle("ServerVerticle", new DeploymentOptions());
Vertx vertx = Vertx.vertx();
runner.accept(vertx);
}
@Override
public void start() throws Exception {
NetServerOptions options = new NetServerOptions();
NetServer server = vertx.createNetServer(options);
server.connectHandler(socket -> {
socket.handler(buffer -> {
vertx.eventBus.send("get.gender", buffer, res -> socket.write(res.toString()));
});
});
server.listen(1234, "localhost");
//Deploy worker verticles
DeploymentOptions deploymentOptions = new DeploymentOptions()
.setInstances(Runtime.getRuntime().availableProcessors())
.setWorker(true);
vertx.deployVerticle("GenderServiceVerticle", deploymentOptions);
}
}
GenderVerticle.java
public class GenderVerticle extends AbstractVerticle {
@Override
public void start() throws Exception {
vertx.eventBus().consumer("get.gender", message -> {
String gender = singleIndexLookup(message);
message.reply(gender);
});
}
singleIndexLookup() { ... }
}
最佳答案
这里有几个问题和一些关于 vert.x 的误解。一旦你使用 Verticle
实现你的代码,你就不需要实现你自己的 main
方法,因为在木头下,内部 main
方法将这样做是为了确保您可以充分发挥 CPU 的能力,并且不需要自己扩展它:
//Deploy worker verticles
DeploymentOptions deploymentOptions = new DeploymentOptions()
.setInstances(Runtime.getRuntime().availableProcessors())
您应该阅读 documentation 的以下部分.
其次,您将 GenderVerticle
称为 worker,因为它会为您执行一些操作。请注意,在 vertx
中,worker 意味着它应该在专用线程池上执行,因为该 Verticle 中的代码可能会执行一些阻塞 IO。
使用worker 模式会带来性能损失,因为您失去了异步 IO 的优势,并且您的请求需要排队等待池中的线程。
由于您的示例说明您的所有代码所做的都是内存查找,我假设它受 CPU 限制而不是 IO 限制,这意味着您应该避免将其部署为 worker 。
回到您的示例,您有 1 个处理所有 HTTP 流量的 Verticle 和另一个处理它的 Verticle。为了获得最佳性能,您可能希望只有 1 个 Verticle,因为跳数较少,但此解决方案无法水平扩展(您提出问题的原因)假设一个节点只能执行 1000rps,我如何处理 3000rps。
现在您已经走上了正确的道路,您将 http 处理与业务处理分开,它有一点损失,但是如果您知道 1 个节点可以处理 1000rps 并且您必须至少处理 3000rps,那么您需要做的就是在 3 台额外的机器上部署 GenderVerticle
。
执行此操作并启用集群后,您可以通过添加依赖项(例如:hazelcast)来执行此操作:
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-hazelcast</artifactId>
<version>3.3.3</version>
</dependency>
然后使用标志 --cluster
启动您的应用程序。您将拥有一个由 4 台机器组成的集群,其中请求将以循环方式负载均衡到每个 GenderVerticles
。
由于 HTTP 代码由 netty 高度优化,您可能不需要超过一台服务器,如果不是这种情况,您可以选择在服务器前面添加一个流量负载均衡器,然后再次部署另一个ServerVerticle
在集群中的另一台机器上,现在流量负载均衡器将对 2 个服务器之间的 HTTP 流量进行负载均衡,这两个服务器将轮询到 GenderVerticles
。
所以我猜你开始看到这样一种模式,即一旦你的监控告诉你你的 CPU/NetworkIO 已达到极限,你就会向集群添加更多机器。
关于java - Vert.x:最简单的 1000 rps 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40150925/
我制作手机游戏,但我想为我的社交游戏制作一些简单的基于浏览器的客户端,以便我们可以更轻松地调试。最简单的引擎是什么? 我研究了一些 HTML5 引擎和 GWT,但我想听听社区的意见。我正在寻找一种能够
有一个有趣的例子,有人设法为一个只占用 1kb 的论坛创建了一个 PHP 脚本:http://www.nerdparadise.com/blogs/blake/6034/ 我想知道是否有类似的小脚本可
首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真tm的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易
我的proguard配置太糟糕了,我的游戏崩溃了,而且似乎不正常。在我弄清楚到底哪里出了问题之前,最简单,最安全的配置用于全部安装是什么?有没有办法使它仅更改变量名?或者只是混淆代码以使其更难阅读而不
我正在重构一些 C# 代码,其中一部分是重做一些引用,因为我们正在完全重做文件夹结构。我想做的就是进入 .csproj 或 .sln 文件并修改路径。 然而,一些引用文献有类似的路径 "../../.
免责声明:这是一个理论问题,目的是增加我的理解。我知道我总是可以使用像 JSON 库这样的工具来解决问题。 假设我想创建一个逗号分隔的值列表,这些值本身可能包含逗号。这些逗号需要先转义。假设我使用 .
我对编程完全陌生,我选择 Delphi 作为我想学习的编程语言。 我基本上想构建使用套接字填写和提交 Web 表单的工具,并且我希望它们也是多线程的。 我希望它们功能丰富且性能正确。 我并不急于这样做
我正在构建一个协作创作工具,该工具允许用户共同编辑信息空间,该信息空间是节点和链接的可视化。一个客户端应用程序中所做的更改需要反映到所有其他客户端中。由于它是可视化的,因此可能需要经常更新潜在的大数据
作为一家专门开发自定义 CMS 的公司,我们被要求在下一个项目中部署开源 CMS。 我们可以自由选择系统。对于熟悉 PHP5 中的 MVC 模型和 OOP 的团队,您会推荐什么? 有人告诉我Drupa
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我完全是 Ember.js 菜鸟,需要了解后端注意事项,目前似乎很少有教程涵盖。对于快速原型(prototype)设计,最简单/最简单的后端设置是什么?我看到了一些 ember-rails 教程,但是
我正在寻找这种最简单、最简单的方法来启动 Java Web 服务。我曾经使用 Axis-1-on-Tomcat,但是对于 Axis 2,它变得太厚了。我正在寻找的一些偏好: 低内存占用 - 一个包含最
我多年来一直使用旧版 openGL 和 cocoa,但现在我正在努力过渡到 openGL 3.2。互联网上有几个例子,但它们都太复杂了(许多甚至在 XCode 5.1 下不再编译)。有人可以编写一个最
我正在构建一个简单的应用程序,它应该将开关/支票簿的状态存储 7 天。我遇到的唯一问题是我用来构建所述应用程序的网站不适合手机上的本地存储。没有通过本地存储或链接到在线数据库来存储开关/支票簿状态的良
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 7 个月前。 Improv
有时我需要 1 个用户类型元素的集合(或任何其他容器)并以这种方式创建它们: boost::assign::list_of(typeVariable).convert_to_container >()
我的页面上有一个 DropDownList 和一个 TextBox。当用户在 DropDownList 中选择“其他”选项时,我想在其右侧显示一个文本框。我不想使用传统的回发技术。我希望这种交互是在客
说到编码,我还很年轻,而且我听说过很多关于组织的事情。有些使用部分,有些使用 div,有些使用 div 作为按钮,其他使用 css 中的输入来更改它。作为一个喜欢让他的代码干净、简单易懂但又正确的人,
我需要将带有变量项的 ContentValues 转换为 JSON 字符串,我可以将其保存到数据库中,并在以后用作 HTTP 请求的正文。网络上的所有内容都只会以相反的方向进行转换。 最佳答案 每当您
我的电脑上安装了 Python 3.7。想用tensorflow,发现基本不支持3.7,所以想(也)安装Python 3.6。 关于如何做到这一点有什么建议吗?我是否必须卸载 3.7 并将其替换为 3
我是一名优秀的程序员,十分优秀!