0

假设

  • 我正在构建一个无状态微服务,它公开了一些简单的 API 端点(例如,一个通读缓存,将一个条目保存到数据库),
  • 我正在使用非阻塞数据库客户端,例如mysqlredis
  • 我总是希望我的微服务通过 HTTP 相互通信(通过将 EC2 实例放在负载均衡器后面)

问题

  1. 我什么时候要使用超过 1 个标准 Verticle(即,将整个微服务编写为单个 Verticle 并部署它的 n 个实例(n = 事件循环线程数))?添加更多的verticles不会增加序列化和上下文切换的成本吗?
  2. 假设我将微服务拆分为多个标准 Verticle(无论出于何种原因)。与部署不同比例的实例相比,部署每个实例的 n(n = 事件循环线程数)不会总是提供更好的性能。由于每个 Verticle 只是一个地址上的侦听器,这意味着每个事件循环线程都可以处理各种消息,并且它们已经是负载平衡的。
  3. 我什么时候想在集群模式下运行我的应用程序?根据文档,我觉得集群模式只有在您有多个 Verticle 时才有意义,并且当您有一个实际的集群用例时也是如此,例如,不同的 EC2 实例处理不同用户的请求以帮助处理数据局部性(比如使用点燃)

PS,即使您可以回答上述问题之一,也请提供帮助。

4

2 回答 2

1
  1. Verticle 是一种结构化代码的方式。因此,当您的主 Verticle 变得太大时,您可能需要另一种类型的 Verticle。多大?这取决于您的喜好。我尽量保持它们相当小,最多大约 200 LOC,以做一件事。

  2. 不必要。不同的 Verticle 可以以不同的速度执行非常不同的任务。拥有所有 N 个实例不一定是坏事,而是多余的。

  3. 可能永远不会。集群模式是微服务之前的事情。使用它会增加另一个层次的复杂性(集群管理器,例如 Hazelcast),这也意味着你不能成为多语种。

于 2020-04-12T20:34:49.237 回答
1

我总是希望我的微服务通过 HTTP 相互通信(通过将 EC2 实例放在负载均衡器后面)

如果您已经采用这种过于复杂的方法,那么使用 Vertx 并没有多大意义。Vertx 正在使用 Event Bus 进行集群内通信,从而消除了对 HTTP 以及前面的 LB 的需求。

答案:

  1. 为什么要呢?如果 Verticle 不相互通信,那么序列化开销应该发生在哪里?

  2. 如果您的 Verticle 使用非阻塞调用(因此是多线程的),您将不会看到同一台机器上的 1 个或 N 个实例之间有任何区别。此外,如果您的 Verticle 通过某个端口启动(HTTP)服务器,那么所有实例将在所有线程中共享该单个服务器(vertx 在这里做一些神奇的重新路由)

  3. 集群模式是我一开始提到的东西。这是分发和扩展微服务的正确方法。

于 2020-04-09T21:27:28.957 回答