0

像许多现代应用程序一样,我在当前应用程序中有几个移动部件:

  • 网络服务
  • 各种队列
  • 各种工作进程
  • 等等

为了正确管理我的应用程序,我想跟踪各种与应用程序相关的任意指标,例如:

  • 一段时间内的平均队列长度
  • 平均队列处理时间和/或最大处理时间
  • 每单位时间处理的项目数,或每单位时间处理的类型 X 的项目数,例如在最后一分钟,小时,天有多少
  • 等等

我很难为此提出一个逻辑模型,然后是一个实际的实现。我正在努力解决的一些问题:

  • 这些计算是如何进行的?通过与我正在测量的事情相同的过程?通过一个单独的过程?
  • 这些计算是什么时候进行的?例如,当然计算不应该与应用程序流程同步。
  • 我如何存储这些计算的结果?是否有适合存储此类指标的数据库模式?

我的一部分感觉这是一个已解决的问题,并且我应该采用或重用一种架构或模式。

我故意提出这个问题,但没有提及我的应用程序正在使用的具体技术,因为我的直觉告诉我这对模式并不重要。

想法?

4

1 回答 1

1

以下是每个问题的一些提示

这些计算是如何进行的?通过与我正在测量的事情相同的过程?通过一个单独的过程?

绝对不是同一个过程。原因是,如果你将这些计算绑定到任何不完全服务于这个唯一目的的进程,你的服务中就会出现一些分散的逻辑,并且很快就会变得无法维护。有一个集中的地方来执行所有的计算。让你的每一个架构都通过一些不可知的传输来发送它们的有效负载,比如 REST(或者如果你每秒有数百个传输速度,比如你提到的消息队列)。

这些计算是什么时候进行的?例如,当然计算不应该与应用程序流程同步。

这取决于您的用例。如果您不需要实时执行所有计算,您可以拥有一个静态组件,它接收来自其他参与者的所有传入数据流,然后临时存储它们(稍后会详细介绍),另一个组件会遍历所有新获取的数据(或全部)来执行计算。后者可以由像 Celery 这样的库调度,或者使用标准的 cron 作业。

我如何存储这些计算的结果?是否有适合存储此类指标的数据库模式?

标准 SQL 几乎可以用于它的任何实现。现在,如果您有主要是时间戳或时间序列数据的指标,您可以查看时间序列数据库 (TSDB)

于 2019-07-19T21:40:01.803 回答