ExpressJS 应用程序每秒接收大约 70 个请求 - Cassandra 性能较慢

ExpressJS app which receives around 70 requests per second - slow Cassandra performance

这不是与代码相关的问题,而是与服务器性能和我应该检查的事情有关。所以我有一个连接到 cassandra 数据库的 ExpressJS 服务器(1 个集群上有 1 个种子节点和 2 个节点,所以总共有 3 个节点)。 API 是 运行 在与 cassandra 数据库种子节点相同的服务器上。我在本地网络中总共有 3 个服务器。

所以结构看起来是这样的-

服务器 1 运行 API 和种子 cassandra 节点。 服务器 2 运行 cassandra 节点。 服务器 3 运行 cassandra 节点。

每台服务器有 8GM 内存和 2.5Ghz CPU。

默认情况下,每秒大约有 70 个请求,它们执行以下操作 -

1) 调用一个函数,该函数从 cassandra 的 table 中读取数据(使用物化视图)。 2) 从 cassandra db 读取另一个 table(使用物化视图)。 3)将数据发布到cassandra中的第三个table。

调用的第二个函数非常相似,它使用物化视图进行 1 次读取和 1 次读取 post。

每秒调用的函数之间的比例差异大约是函数 1 被调用 30 次(执行 2 次读取和 1 post),函数 2 被调用大约 40 次(执行 1 次读取和 1 次 post) 1 post).

一切都会很好,但请求的延迟会时不时地跳跃,有时需要大约 10 毫秒,但每 5 - 10 秒就会上升到 3-30 秒。另外 cassandra 似乎是 unstable - 在有 3-30 秒的请求时间期间,cassandra 似乎在某些请求上超时。

我应该检查的第一件事是什么?我是否需要额外的节点以及如何确定我是否有足够的节点来处理发送到 cassandra db 的数据量?我是否应该将 API 与 cassandra 节点分开 - 因此将 API 服务器保存在单独的服务器上,例如服务器 4?

物化视图非常适合读取操作,但它们以写入为代价;您需要考虑执行其魔法所需的一些开销:

  • 物化视图将需要额外的资源来跟踪其来源的更新;当您与多个实体化视图交互时,情况会变得更糟,就像您提出的第一个场景一样。
  • 如果post的数据写在实体化视图的同一源中,这将取决于table中使用的主键的复杂性,如解释here.

我要探索的第一个选项是非规范化并为第一个函数创建一个单独的 table,因此您将进行一次读取,而不是两次读取。

我的回答中有很多猜测,因为结构和您的 table 模式有很多未知数;如果启用跟踪,您可能会获得更好的洞察力,在我们的案例中,我们使用 openzipkin 获得了很好的结果,如 TLP

所解释的