消息队列在执行过程中, 如何统计消息队列执行一轮的时间以及效率呢? 如果消息队列中的任务变多, 则需要对应增加消费进程, 保证队列不被堆积。

一、一般消息队列生产和消费类型

1. 一次性任务消费

从某个地方一次性写入多个任务到队列, 消费完成后就算完成

2. 不断写入的任务消费

一般是判断队列任务少了, 就开始写入任务, 队列任务足够则不写入任务。对应的消费进程也是持久性进程。

3. 有任务则写入, 然后持续消费

随时可能有任务产生, 之后不断消费。任务写入时间不可控, 所以消费进程一般也得是持久性进程。

二、如何计算出来消费一轮的时间以及消费速率

1. 通过统计任务开始和结束, 计算消费总时间

关于消息队列速率的解决方案

关于消息队列速率的解决方案

当时最早想到的就是这种方式, 这种方式的优点:

  1. 统计相对准确

缺点:

  1. 流程复杂且耦合性高
  2. 如果中间有队列暂停之类的时间, 也会被包含进时间内。

2. 通过读取队列状态, 获取到一定时间内消耗数量

关于消息队列速率的解决方案
根据两次读取的任务数, 得到固定时间内的消耗掉的任务数, 计算出来执行的任务。

3. 通过计算单个任务的执行时间, 然后根据运行的进程数, 来计算一轮的时间。

关于消息队列速率的解决方案

之后根据运行进程数, 以及任务总数, 来获取到一轮的更新时间。 或者一段时间内取样, 来计算需要的机器和进程数。

如果有其他更好的办法, 希望可以一起交流下。