高并发系统设计:如何降低消息延迟

如何监控延迟

  • 第一种方式,使用消息队列提供的工具。比如kafka-consumer-groups.sh和JMX
  • 第二种方式,通过生成监控消息的方式,定义一种特殊的消息,启动监控程序将这个消息定时循环写入到消息队列中,消息内容为生成的时间戳。业务处理程序在消费到这个消息时可以直接丢弃,而监控程序在消费到这个消息时可以计算时间差,如果时间差超过阈值,可以报警。

如何减少延迟

  • 要减少消息处理的延迟,我们需要在消费端和消息队列两个层面完成。

消费端

  • 消费端的目标是提升消息处理能力,能做的是:1、优化消费逻辑;2、增加消费者的数量。
  • 不过第二种方式会受到消息队列的实现,比如kafka,一个topic配置成多个分区,在消费的时候,一个分区只能被一个消费者消费。这么设计的原因是因为多消费者消费一个分区的话,可能需要加锁,有性能损耗。
  • 所以这个时候增加消费者是没用的,需要增加分区数。
    在这里插入图片描述
  • 如果不增加分区或消费者,那么就需要提高单个消费者的处理能力,比如将多个逻辑使用并行的方式处理。或者一次拉取多条消息,丢进线程池。

在这里插入图片描述

  • 在消费队列中数据的时候还需要注意消费线程空转的问题:如果消息队列中没数据,消费者需要等待10-100ms再去进行下一次消费

消息队列

  • 消息队列主要从消息的存储和零拷贝两方面来处理。
  • 消息存储没啥好说的,尽量使用读写快的介质。
  • 零拷贝技术:在读取消息队列数据时,其实就是把磁盘数据通过网络发送给消费客户端。
  • 数据从磁盘拷贝到内核缓冲区、系统调用将内核缓冲区的数据拷贝到用户缓冲区、用户缓冲区的数据写入到socket缓冲区、操作系统将socket缓冲区数据拷贝到网卡缓冲区。
    在这里插入图片描述
  • 操作系统提供了 Sendfile 函数可以减少数据被拷贝的次数。使用了 Sendfile 之后,在内核缓冲区的数据不会被拷贝到用户缓冲区而是直接被拷贝到 Socket 缓冲区,节省了一次拷贝的过程。高级语言中对于 Sendfile 函数有封装.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值