消息队列|如何降低消息队列系统中消息的延迟?

如何监控消息延迟

  • 使用消息队列提供的攻坚,通过监控消息的堆积来完成
  • 通过生成监控消息的方式来监控消息的延迟情况
 

减少消息延迟的正确姿势

需要在 消费端消息队列 两个层面来完成。

消费端

1. 优化消费代码的性能

2. 增加消费者的数量

多线程处理

消费线程空转

在写消费线程的时候需要考虑这种场景,拉取不到消息可以等待一段时间再来拉去,等待的时间不宜过长,否则会增加消息的延迟。
可以使用固定的 10ms~100ms,也可以按照一定的步长递增,比如第一次拉取不到消息等待 10ms,第二次 20ms,最长可以到 100ms,直到拉取到消息再回到 10ms。
 

消息队列

主要也是从两个方面考虑读取性能问题:
  • 消息的存储
  • 零拷贝技术

消息的存储

比如,最开始如果使用数据库来存储消息,性能会受限于数据库的性能瓶颈。如果改用本地磁盘作为存储介质,Page Cache 的存在就可以提升消息的读取速度。

零拷贝技术

虽热不能消灭数据的拷贝,但可以减少拷贝的次数。在读取消息队列的数据的时候,其实就是把磁盘中的数据通过网络发送给消费客户端,在实现上会有四次数据拷贝的步骤。
  1. 数据从磁盘拷贝到内核缓冲区
  1. 系统调用将内核缓冲区的数据拷贝到用户缓冲区
  1. 用户缓冲区的数据被写入到 Socket 缓冲区中
  1. 操作系统再将 Socket 缓冲区的数据拷贝到网卡的缓冲区中
notion image
操作系统提供了 Sendfile 函数,可以减少数据被拷贝的次数。使用了 Sendfile 之后,在内核缓冲区的数据不会被拷贝到用户缓冲区,而是直接被拷贝到 Socket 缓冲区,节省了一次拷贝的过程,提升了消息发送的性能。