最近我开始学习reactive
、事件驱动
和非阻塞Java框架,其中一个引起了我的注意——vert.x
。
我想,同样的问题可能适用于akka(Play框架),因为他们的理念或目标之一是相同的,那就是减少线程数量,从而提高应用程序的可扩展性。
垂直。x
建议它所消耗的线程数与CPU内核数相当,但它也表明,有时您必须执行阻塞操作,因此它鼓励开发人员在单独的工作线程上执行阻塞操作(垂直于vert.x的工作线程)。
这就是我要问的问题:
一个真实的例子是 JDBC 查询 - 如果 1000 个并发用户通过 JDBC 查询 SQL 数据库,则每个用户都会为该阻塞操作生成自己的工作线程。从我的角度来看,与传统的阻塞线程模型相比,没有线程备用、改进的可扩展性或 RAM 备用。我一定错过了什么...要不?提前感谢所有的答案。
如前所述,您应该使用连接池,但是如果您对数据库访问而不是特定的JDBC感兴趣,您可以查看async db驱动程序,例如:
这些驱动程序依赖于netty,因此它的所有IO操作都是非阻塞的,这意味着您不需要有工作线程池。更少的线程意味着操作系统级别的上下文切换更少,从而带来更好的性能。
遗憾的是,这些驱动程序并不多(我只知道MySQL和PostgreSQL),所以如果您被迫使用其他RDBMS,您可能会倒霉。
vert. x建议在机器上运行线程,而不是用户。
他们所说的是,如果你有16个CPU内核可用,并且有16个准备工作的线程,那么如果你对其中一个运行阻塞操作,最多只有15个线程保持工作状态,因此只有15个CPU内核实际上在工作。
因此,为了防止有一个空闲内核,他们建议您再创建一个线程,并将阻塞任务交给它,这样16个CPU内核上仍有16个线程在工作。
阻塞线程的数量并不重要(只要它不太大…),因为它们实际上不会消耗您的CPU能力。
它与通常的阻塞模型不同,因为您隔离了您那边不需要太多资源的阻塞操作。剩下的是在您拥有的工作线程之间共享剩余的事件驱动操作。
在查询 SQL 数据库时生成 1000 个并发线程是没有意义的 - 仅仅因为典型的数据库无法承受这么多同时连接,典型的数量是 10-15。解决方案是组织一个特殊的线程池,其中每个线程都有一个开放的连接,并为访问数据库的任务提供服务。任务提交到公共阻塞队列,工作线程循环从该队列读取。任务是
interface DBRunnable {
public void run(Connection conn);
}
工作线程将它们的连接传递给任务:
public void run() {
Connection conn = DriverManager.getConnection(...);
while (true) {
DBRunnable task=queue.take();
task.run(conn);
}
}
根据我的理解,每个Vert.x实例都将被分配一个事件循环。事件循环处理该特定实例的所有请求和其他任务。事件循环是一个线程,我认为。当部署了多个Vert.x实例时,每个实例都有自己的事件循环,对吗?这意味着存在多个线程(multi-threading)。我就是这么理解的。这个单线程概念让我非常头疼。任何帮助都将不胜感激。
我正在使用vert。x 2.1.5版本。我试图在我的项目中使用事件循环。下面给出了示例代码 在此代码中,我的事件总线在执行事件循环之前返回值。我需要根据事件循环输出填充我的输出 如何实现
给定以下代码: 如果kafka消费者是Vert. x Kafka消费者,我希望 会发生在Reactive IO线程上。但是,它在Vert. x事件循环线程上执行。当我运行以下测试类时,相同的场景按照预期在IO线程上运行map方法。 是什么导致线程执行中出现这种差异?
Vert.x 是一个微服务开发框架,基于事件和异步,依托于全异步Java服务器Netty,并扩展了很多其他特性,以其轻量、高性能、支持多语言开发而备受开发者青睐,开发者可以通过它使用 JavaScript、Ruby、Groovy、Java、甚至是混合语言来编写应用。 概念 Vert.x是事件驱动的,其处理请求的高性能也是基于其事件机制。Vert.x的事件机制中有几个非常重要的概念:Event Lo
微服务作为一种软件架构风格正在获得牵引力,它将更好地支持持续交付,为快速部署和关注点分离提供模型。 Vert.x 3和Vert.x-Apex为构建微服务提供了一个有趣的模型。如其中一个例子所示,一个简单的verticle可以公开一个HTTP服务,因此REST服务是可用的。垂直绑定它自己的tcp端口。 当扩展到多个微服务来支持一个完整的应用程序时,您最终会有许多选择。对于哪种风格能够最终支持连续交付
我是Vert.x.中活动巴士的新手https://vertx.io/docs/vertx-core/java/,描述如下: 尽最大努力交付 Vert.x尽最大努力传递消息,并且不会有意识地丢弃它们。这称为尽力而为的交付。 如果您的应用程序关心丢失的消息,您应该将您的处理程序编码为等幂,并将您的发送程序编码为在恢复后重试。 我的系统不希望丢失任何消息,所以我必须了解事件总线并决定是否使用Vert.