当前位置: 首页 > 知识库问答 >
问题:

Vertx |群集中垂直线的全局状态

郑景胜
2023-03-14

新手警报。

我正在尝试在Vertx中编写一个简单的模块,它每10秒轮询一次数据库(PostGres)并将结果推送给客户端。我正在考虑将阻塞代码(通过JDBC查询数据库)限制在工作垂直中,上面的其余层是完全非阻塞和异步的。

此模块将打包为一个jar,并分发到不同的应用程序(通常是webapps),这些应用程序可以通过javascript桥订阅事件总线。

我这里的问题是在集群环境中,我有5个运行vertx模块的webapp进程,我如何确保只有一个vertx垂直查询数据库。我不希望所有的顶点都在查询数据库并增加更多负载。或者有没有不同的方法来解决这个问题。我使用的是Vertx版本3.4.1

共有2个答案

漆雕嘉茂
2023-03-14

我在这里给出了我天真的解决方案,我不知道它是否能完全解决你的问题,但这是我的思考过程

1) 轮询位,是的,确实可以为每10秒部分设置一个用于阻止调用的工作线程垂直路径[或者您也可以在这里使用异步位,因为您已经有了异步Postgress JDBC客户端]。这样的代码片段可以帮助您

vertx.setPeriodic(10000, id -> {
  // This handler will get called every 10 seconds
  JsonObject jdbcObject = fetchFromJdbc();
  eventBus.publish("INTRESTED_PARTIES", jdbcObject); 
});

2) 对于侦听部分,所有其他垂直站点都可以订阅事件总线并侦听该地址,并且在任何情况下都可以获取消息

3)这是为了确保并非您的jar的所有运行实例都开始轮询数据库,为此我认为最好的处理方法是不要在任何jar中部署垂直,并使用运行时vertx命令以独立方式运行垂直

vertx run DatabasePoller.java -cluster

如果你真的想变得非常花哨,你可以加入服务发现来确保如果垂直的服务已经注册,那么没有其他部署会触发注册。

但是我想在考虑事件时给你竖起大拇指,以便更好地处理系统间通信。

云鸿祯
2023-03-14

因此,有两种方法可以让你的垂直度成倍增加:

  1. 如果在部署verticle时实例化多个实例
  2. 如果你开始集群你的顶点。不同jvm或不同主机中的x个实例

您可以尝试控制执行查询的verticle的实例数。意味着您要确保竖线只存在于一个顶点中。x个实例,您的verticle只部署了一个实例。

但这有几个缺点:

  • 您的部署是不透明的,这意味着您的集群节点在部署结构上有所不同
  • 如果集群节点在运行查询垂直链接的地方死亡,那么就没有回退

因此,最好的做法是在所有实例上部署verticle并对其进行同步。

我认为有3种可能性:

>

将数据库用作同步点。您可以添加一个以毫秒为单位存储上次执行时间的简单表。轮询模块将首先检查是否到了执行下一次轮询的时间。如果轮询模块执行轮询,它也会更新时间。这必须在一个事务中完成,并在时间表上显式锁定。

您可以将redis与https://redis.io/commands/getset功能。您可以将时间以毫秒为单位存储在密钥中,并使用getset方法确保时间的升级是原子的。因此,只有能够在redis中设置密钥的轮询模块才会执行轮询。

 类似资料:
  • 我被vertx实例搞糊涂了。第一次看到文档时,我认为实例意味着事件循环线程的数量 当我深入研究源代码(vertx 2.1.2)时,我发现verticle实例意味着事件循环线程组中的一项任务。事件循环线程总是等待选择器并运行任务。 在vertx中有必要有顶点实例吗?因为顶点只由一个事件循环运行一次。更准确地说,事件循环线程运行Verentlestart方法并将其丢弃,它就像一个条目一样工作,仅此而已

  • 无法建立垂直。云环境中垂直柱之间的x群集 我在配置vert时遇到问题。x eventbus群集在私有云环境中。 在实验室测试中,我尝试使用Hazelcast集群管理器制作两个垂直点来建立一个集群,每个垂直点都在您自己的容器中运行。 问题很可能是由于配置错误引起的,但我无法找到它。在这个云上,不可能进行多播调用,那么我使用的是TCP IP发现策略。 最初的计划是制作一个“labatf api”垂直链

  • 我知道,在vert. x中,默认的版本将在每次我们不需要在处理程序中写入线程安全时运行在相同的事件循环中。 例如,如果我有一个运行HttpServer的版本- } 可以保证,在任何时候,我的请求处理程序都会在两个事件循环上被调用两次(针对2个不同的请求)。因此,我不必在请求处理程序中处理线程安全问题。 如果我运行多个HttpServer顶点实例- 我需要注意线程安全吗?多个请求处理程序(最大值=1

  • 我没有试图将任何视图居中,因为我的问题是,我有一条分界线应该从中间向下。为了做分割线,我做了一个LinearLayout并给它一个背景色。但是,两侧还有其他LinearLayouts。 你大概可以看出中间的LinearLayout就是构成线条的那个。我已经改变了很多android:layout_width值,也改变了很多android:gravity和android:layout_gravity值

  • 问题内容: 我想删除图像中显示的行。我该如何删除? 问题答案: jqGrid在主网格表上构建了一些其他div。外部div具有class 。因此,如果需要删除整个网格上存在的左右边界,则可以使用以下CSS: 如果需要删除所有网格边框,可以使用 如果您还需要删除网格中单元格之间的垂直边框,则可以使用 要删除行之间的水平边框,可以使用 要删除列标题之间的垂直边框,可以使用 或替代(不使用)

  • 对于比较复杂的表单,要填写的内容相对较多,采用水平布局显然不合适。因此,垂直布局的表单更加常用。垂直对齐的表单中,标签和输入框可以使用三种对齐方式,包括顶对齐、左对齐和右对齐。 顶对齐可以缩短用户填写表单的时间,由于标签和输入框非常靠近,处理起来毫不费力,用户只需顺着表单向下移动,就可完成整个表单。如图 7‑22 所示: 图7-22 顶对齐的表单 但是,顶对齐的标签会占用额外的垂直空间。因此,如果