高并发系统设计40问
唐扬
美图公司技术专家
立即订阅
9202 人已学习
课程目录
已更新 38 讲 / 共 40 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么你要学习高并发系统设计?
免费
基础篇 (6讲)
01 | 高并发系统:它的通用设计方法是什么?
02 | 架构分层:我们为什么一定要这么做?
免费
03 | 系统设计目标(一):如何提升系统性能?
04 | 系统设计目标(二):系统怎样做到高可用?
05 | 系统设计目标(三):如何让系统易于扩展?
06 | 面试现场第一期:当问到组件实现原理时,面试官是在刁难你吗?
演进篇 · 数据库篇 (5讲)
07 | 池化技术:如何减少频繁创建数据库连接的性能损耗?
08 | 数据库优化方案(一):查询请求增加时,如何做主从分离?
09 | 数据库优化方案(二):写入数据量增加时,如何实现分库分表?
10 | 发号器:如何保证分库分表后ID的全局唯一性?
11 | NoSQL:在高并发场景下,数据库和NoSQL如何做到互补?
演进篇 · 缓存篇 (6讲)
12 | 缓存:数据库成为瓶颈后,动态数据的查询要如何加速?
13 | 缓存的使用姿势(一):如何选择缓存的读写策略?
14 | 缓存的使用姿势(二):缓存如何做到高可用?
15 | 缓存的使用姿势(三):缓存穿透了怎么办?
16 | CDN:静态资源如何加速?
加餐 | 数据的迁移应该如何做?
演进篇 · 消息队列篇 (6讲)
17 | 消息队列:秒杀时如何处理每秒上万次的下单请求?
18 | 消息投递:如何保证消息仅仅被消费一次?
19 | 消息队列:如何降低消息队列系统中消息的延迟?
20 | 面试现场第二期:当问到项目经历时,面试官究竟想要了解什么?
用户故事 | 从“心”出发,我还有无数个可能
期中测试 | 10道高并发系统设计题目自测
演进篇 · 分布式服务篇 (9讲)
21 | 系统架构:每秒1万次请求的系统要做服务化拆分吗?
22 | 微服务架构:微服务化后,系统架构要如何改造?
23 | RPC框架:10万QPS下如何实现毫秒级的服务调用?
24 | 注册中心:分布式系统如何寻址?
25 | 分布式Trace:横跨几十个分布式组件的慢请求要如何排查?
26 | 负载均衡:怎样提升系统的横向扩展能力?
27 | API网关:系统的门面要如何做呢?
28 | 多机房部署:跨地域的分布式系统如何做?
29 | Service Mesh:如何屏蔽服务化系统的服务治理细节?
演进篇 · 维护篇 (5讲)
30 | 给系统加上眼睛:服务端监控要怎么做?
31 | 应用性能管理:用户的使用体验应该如何监控?
32 | 压力测试:怎样设计全链路压力测试平台?
33 | 配置管理:成千上万的配置项要如何管理?
34 | 降级熔断:如何屏蔽非核心系统故障的影响?
高并发系统设计40问
登录|注册

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

唐扬 2019-11-01
你好,我是唐扬。
学完前面两节课之后,相信你对在垂直电商项目中,如何使用消息队列应对秒杀时的峰值流量已经有所了解。当然了,你也应该知道要如何做,才能保证消息不会丢失,尽量避免消息重复带来的影响。那么我想让你思考一下:除了这些内容,你在使用消息队列时还需要关注哪些点呢?
先来看一个场景:在你的垂直电商项目中,你会在用户下单支付之后,向消息队列里面发送一条消息,队列处理程序消费了消息后,会增加用户的积分,或者给用户发送优惠券。那么用户在下单之后,等待几分钟或者十几分钟拿到积分和优惠券是可以接受的,但是一旦消息队列出现大量堆积,用户消费完成后几小时还拿到优惠券,那就会有用户投诉了。
这时,你要关注的就是消息队列中,消息的延迟了,这其实是消费性能的问题,那么你要如何提升消费性能,保证更短的消息延迟呢?在我看来,你首先需要掌握如何来监控消息的延迟,因为有了数据之后,你才可以知道目前的延迟数据是否满足要求,也可以评估优化之后的效果。然后,你要掌握使用消息队列的正确姿势,以及关注消息队列本身是如何保证消息尽快被存储和投递的。
接下来,我们先来看看第一点:如何监控消息延迟。

如何监控消息延迟

在我看来,监控消息的延迟有两种方式:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《高并发系统设计40问》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(19)

  • leechanx
    sendfile 在linux 2.1的时候,是文件与socket两个内核缓冲区间copy
    在更高linux版本,已经能从文件缓冲区直接写到网卡了,socket缓冲区省掉了
    2019-11-04
    8
  • intomymind
    消费者接收到消息后,放入到线程池里面,那么在线程池里对消息处理完之后,如何实现返回ack给kafka呢

    作者回复: 为了性能可能要损失一些消息完整性

    2019-11-01
    2
    4
  • 陆离
    并行消费那块有数据丢失的风险吧。
    server接收到数据返回给队列ack,然后丢给线程池,数据还没处理完这个节点挂掉了,数据不就全丢了。

    作者回复: 会有这个风险,不过为了提升性能,需要一些权衡

    2019-11-01
    4
    4
  • 仙道
    老师,关于消息队列的一个重要东西,您还没有讲到。
    消息的顺序性。比如订单消息要在配送消息消费之前消费
    对于这种问题,有因果一致性来解决。因果一致性的一种做法是,消息的编号递增,小的号码先消费,大的号码要在后消费。
    但是在分布式集群环境下,每个消费者消费的时候要把它的最大消息编号广播给其他消费者。
    这样一来的话,代价就比较高了。

    作者回复: 也可以比如在Kafka下,把要求严格顺序的消息写到一个partition

    2019-11-06
    4
    1
  • hunterlodge
    老师,请问怎么采集每个consumer的JMX数据呢,让监控程序去连接每一个consumer应用吗?

    作者回复: 是的呢~

    2019-11-26
  • kjiker
    问一下,公司还在jdk6时代,但是用到了RocketMQ,上面的这些监控也能做吗·。

    作者回复: 可以的吧 ,RocketMQ也会提供一些工具

    2019-11-20
  • 刘伟
    能不能启用多个消费者放在同一个消费者组里来消费一个分区?这样是不是相当于启动多个消费者消费同一个分区了?

    作者回复: 对于Kafka来说是不行的

    2019-11-16
  • 云师兄
    请教老师kafka新版本offset通过主题方式替换zk,能提升多大的吞吐量,有没有量化的数据参考

    作者回复: 没有找到官方的benchmark

    2019-11-08
    1
  • 你净瞎说~
    老师,我想问一下,消息中间件的读写都是顺序的吗?写文件的时候会先写到pageCache中,然后往文件写,写文件的时候应该是一行一行写的吧?如果不写入pageCache直接写入文件,也是一行一行写的吧,有什么区别吗?比如说写到文件的第1万行了,再往后继续写,是可以快速定位到这个位置的吗?读取消息的时候也是读的文件,假如说读到了第1万行,再往后读,也是可以很快定位到这个1万行吗?java有没有api,比如说,我直接读取第1万行的数据?

    作者回复: 写文件一般都会写入pagecache 由操作系统来刷盘

    2019-11-05
    1
  • 旅途
    我想问一下老师发送特殊消息队列的那个 正常的消息里面不是有时间戳吗 用这个时间戳比较不行吗

    作者回复: 也可以

    2019-11-04
    2
  • chp
    老师,kafka的消费者端也是通过轮询的形式拉取消息?kafka是否也会出现空转的情况?

    作者回复: kafka本身不会空转,因为kafka消费端是拉模式,所以kafka是接受读取请求的

    2019-11-03
  • 电光火石
    零拷贝时,从内核缓冲区到socket缓冲区是否可以通过共享缓冲区的方式,再减少一次拷贝?谢谢!

    作者回复: 可以将描述符传输到socket缓冲区,这样可以减少一次拷贝

    2019-11-03
  • longslee
    打卡。嗯文中监控实战不错。 然后就是下面很多同学提到的丢给线程池处理丢失数据和线程池本身的堆积问题。 如果线程池方式不能避免丢失,那么客户端是否只有一条条的消费来处理消息呢,此时线程数完全受控与Kafka的partition数?

    作者回复: 消息处理程序一般是IO密集型的,所以可以提升线程数来提升并行处理能力

    2019-11-02
  • 边风
    生成监控消息来监控业务消息是否有延迟,这种方式里面,监控程序在消费到业务消息怎么处理呢?老师能再详细说明一下嘛,感觉监控消息跟业务消息混在一起,不晓得怎么监控消费进度了

    作者回复: 监控程序会放弃业务消息
    监控程序和业务的应用程序使用的是不同的consumer group

    2019-11-02
  • Omer
    你先定义一种特殊的消息,然后启动一个监控程序,将这个消息定时地循环写入到消息队列中,消息的内容可以是生成消息的时间戳,并且也会作为队列的消费者消费数据。业务处理程序消费到这个消息时直接丢弃掉,而监控程序在消费到这个消息时,就可以和这个消息的生成时间做比较,如果时间差达到某一个阈值就可以向我们报警。


    老师,这里有个问题,你这么做是问了判断当前队列的延迟时间对吧,但是这样子做的话定时生成的时间戳和正式的任务混在一起了,这样不就给正常执行的业务处理程序增加了很多负担,会不会导致太多的这种任务导致对于正式的业务延迟更大?

    作者回复: 不会的,这样比如1分钟发送一个消息,相比于业务动辄每秒几十或者几百次请求来说太微不足道了

    2019-11-01
  • 高源
    老师请教问题经过排查发现客户端发的消息,服务器收的比较晚,造成超时,双方之间tcp socket通讯局域网,这种情况怎样解决啊

    作者回复: 局域网应该不会有大量超时,可以抓包看一下,也可以看看网卡是否有丢包

    2019-11-01
    1
  • 小美
    监控程序看消息延迟有疑惑,我理解监控程序和正常业务程序不能是同一个消费组,既然不是一个消费组消费,监控到的消息延迟就没意义了啊。

    作者回复: 监控程序可以监控消息队列本身是否有问题

    2019-11-01
    2
  • 包子
    Kafka一个partition只能被一个consumer消费,这里和我使用kafka有点区别。
    不同的consumer不是应该都可以消费相同的topic相同的partition吗,各自有各自的消费offset,互不影响

    作者回复: partition只能被一个consumer group中的consumer消费

    2019-11-01
    1
  • 程序水果宝
    老师在之前的前面有提到消息队列能够削峰填谷,削峰老师已经讲的很清楚了,我想问一下消息队列填谷的作用是怎么体现的?

    作者回复: :( 其实总体的意思是让用户的请求可以更平缓,减少对于后端服务和资源的冲击

    2019-11-01
    4
收起评论
19
返回
顶部