java - Vertx 事件总线的性能与 Java 中的 ConcurrentQueues 一样好还是更好?
问题描述
在我的一个项目中,我决定将 Vertx 用于 HTTP API,因为它具有经过验证的性能记录。然后,因为应用程序确实在内部使用了事件队列,我开始怀疑是否应该使用Vertx 事件总线和 Verticle,而不是使用我通常的ArrayBlockingQueue。我对 Vertx 还是很陌生,所以我不知道它有多合适。我有使用 Akka 和 Actors 的经验,它们非常符合要求,但我不确定 Vertx 事件总线是否设计为每秒可扩展到 100k 个事件?
解决方案
我从版本 3 开始使用 Vert.x 并用它完成了一些项目(这是我的主要堆栈,几年以来)。我从来没有遇到过事件总线是限制因素的情况。事件总线旨在处理如此多的事件,甚至更多。正如@injecteer 所提到的,限制因素基本上是硬件,将处理多少事件取决于你用它们做什么以及你如何扩展你的代码。
因此,Vert.x 遵循非阻塞编程模型,您也应该遵循它……永远不要阻塞。Vert.x 具有松散耦合的概念,这可以通过使用“verticles” https://vertx.io/docs/vertx-core/java/#_verticles分割代码来解决。您可以部署/启动这些 Verticle 的多个实例(您的代码段)。另一个基本概念是事件循环线程(默认内核数 * 2)。
每个部署的 Verticle 实例都将在特定的事件循环线程上运行,并且所有已注册的处理程序(事件总线、http 服务器等)随时在此特定事件循环线程上被调用。通过这种方式,您可以根据需要以“每个线程”的方式扩展您的代码。事件总线上的事件在 Verticle 实例(和 Verticle 内的处理程序)之间以循环方式分发......顺便说一下,http 请求的处理程序也以循环方式分发。
集群模式有点不同。您如何(反)序列化 dtos(Json、Protobuf 等)在性能方面可能会产生显着差异。集群事件总线在所有节点之间都有 TCP 套接字,这意味着事件是点对点发送的。另一方面,集群管理器(Hazelcast 是默认设置)定义了事件应该发送到哪个节点(集群级别的循环),但事件不会通过集群管理器发送。例如,集群管理器知道哪个节点在事件总线上注册了消费者(在哪个地址上)。
从 Vert.x 4 里程碑 5 开始,集群管理器 SPI 提供了一个入口点,您可以在其中实现自己的轮询替代方案,例如负载特定分布等。
有一些基本概念,例如事件循环线程、非阻塞编程和 Verticle(这不是强制性的,但推荐使用)。如果/当这些概念很清楚时,您将获得一个非常灵活的基础,可以用于任何类型的应用程序。我个人很喜欢它,也从未见过任何其他框架/技术达到接近可比性能(具有适合负载的适当缩放)。
推荐阅读
- java - java中的调度程序是否有任何替代方法
- python - Pandas DataFrame 和 DateTimeIndex
- docker - Makefile 未在 NFS 上扩展文件 * 通配符
- javascript - 我需要根据独特的对象大小重复纹理
- plugins - 虚幻引擎中的 Leap Motion 运行良好,直到我将游戏打包到它不会跟踪任何东西的地方
- python - 在更少的时间戳(索引)上对 pandas 数据帧进行分组
- linqpad - LINQPad 中的本机 DLL
- ionic-framework - Ionic 3 传单地图位置
- javascript - 当不可见模态时反应本机模态卸载
- c# - 将常规类对象映射到 MVC 模型