分布式系统案例课
杨波
前携程 / 拍拍贷技术总监,微服务技术专家
11809 人已学习
新⼈⾸单¥59
课程目录
已完结/共 66 讲
第一章 课程介绍 (2讲)
时长 09:20
时长 04:42
第二章 如何设计一个分布式计数服务 - 系统设计面试案例 (7讲)
第五章 如何设计一个高并发无状态的会话缓存服务 - 携程SessionServer案例 (5讲)
第十章 课程回顾&结课测试 (1讲)
分布式系统案例课
登录|注册
留言
10
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 13 | PMQ 2.0的设计解析(下)
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | 需求收集和总体架构设计
04 | 存储设计
05 | 计数服务设计(上)
06 | 计数服务设计(下)
07 | 查询服务设计
08 | 技术栈选型
09 | 进一步考量和总结
10 | PMQ 2.0项目背景
11 | PMQ 2.0的设计解析(上)
12 | PMQ 2.0的设计解析(中)
13 | PMQ 2.0的设计解析(下)
14 | PMQ 3.0的演进
15 | Kafka的动态重平衡是如何工作的?(上)
16 | Kafka的动态重平衡是如何工作的?(下)
17 | 消息队列设计和治理最佳实践
18 | 第四章目录和大纲
19 | 微服务的四大技术难题是什么?
20 | 如何解决微服务的数据一致性分发问题?
21 | 如何解决微服务的数据聚合Join问题?
22 | 如何解决微服务的分布式事务问题?(上)
23 | 如何解决微服务的分布式事务问题?(下)
24 | 阿里分布式事务中间件Seata解析
25 | Uber微服务编排引擎Cadence解析
26 | 如何理解Uber Cadence的架构设计?
27 | 如何实现遗留系统的解耦拆分?
28 | 拍拍贷系统拆分项目案例
29 | CQRS/CDC技术在Netflix的实践
30 | 第四章总结
31 | SessionServer项目背景
32 | 总体架构设计
33 | 如何设计一个高性能基于内存的LRU Cache?
34 | 如何设计一个高性能大容量持久化的ConcurrentHashmap?
35 | 设计评估和总结
36 | SaaS项目healthchecks.io的背景和架构(上)
37 | SaaS项目healthchecks.io的背景和架构(下)
38 | 如何设计一个轻量级的基于DB的延迟任务队列?
39 | 如何设计一把轻量级的锁?
40 | 如何设计一个分布式限流系统?
41 | 如何设计一个分布式TopK系统实现实时防爬虫?
42 | 第七章目标和大纲
43 | 为什么说ServiceMesh是微服务的未来(上)
44 | 为什么说ServiceMesh是微服务的未来(下)
45 | 解析Envoy Proxy(上)
46 | 解析Envoy Proxy(下)
47 | Envoy在Lyft的实践
48 | 解析Istio
49 | K8s Ingress、Istio Gateway和API Gateway该如何选择?(上)
50 | K8s Ingress、Istio Gateway和API Gateway该如何选择?(下)
51 | Spring Cloud、K8s和Istio该如何集成?
52 | 第八章目标和大纲
53 | 拍拍贷案例:大型网站架构是如何演进的?
54 | 最小可用架构:Minimum Viable Architecture(上)
55 | 最小可用架构:Minimum Viable Architecture(下)
56 | 如何构建基于OAuth2/JWT的微服务架构?(上)
57 | 如何构建基于OAuth2/JWT的微服务架构?(下)
58 | 拍拍贷案例:如何实现数据中心机房的迁移?
59 | 携程/Netflix案例:如何实现同城双活和异地多活?
60 | 第九章大纲
61 | 学习开源项目的6个层次和8种方法(上)
62 | 学习开源项目的6个层次和8种方法(中)
63 | 学习开源项目的6个层次和8种方法(下)
64 | 百万年薪架构师是如何炼成的?
65 | 解读一份大厂的研发岗职级体系
66 | 结课测试&结束语
登录 后留言

全部留言(10)

  • 最新
  • 精选
Johar
波波老师,请教一下,1.PMQ怎么解决一组consumer消费一个topic的所有分区? 2.另外一个分区被多个consumer消费的时候,有先有后,db中的数据怎么进行处理? 3.db进行数据存储实际也是文件存储,删除已经消费的数据时,mysql是否会删除文件中的数据?还是将数据置为不可见?工作环境使用pg数据库,出现了表中的数据量不大,但是表文件达到十几个G,造成数据库操作很慢,这种场景有没有什么好处理方法,自动处理一下?

作者回复: 1. 一组consumer可以组成一个消费者组,共同消费一个topic中的多个分区,具体每个消费者消费哪一个或者几个分区,这个由动态重平衡算法来决定,一般是尽可能平均分配。 2. 对于同一个消费者组和同一个主题,每一个消费者可能会消费0个、1个或者多个分区,但是一个分区最多只能被一个消费者消费,不能被两个以上的消费者同时消费,会乱。但是对于不同消费者组的情况,同一个分区,可能被不同消费者组中的多个消费者同时消费,这时消费指针不同,不会乱。 3. PMQ定期删除MySQL中老数据,采用的是物理删除。关于pg的问题,我没有直接碰到过,建议可以看这个stackexchange上的帖子: https://dba.stackexchange.com/questions/123627/postgresql-data-files-have-size-more-than-data-itself

2020-07-04
3
3
小祺
1. 消息入库时有事务控制吗,特别是多生产者+批量写入的时候,如果有事务控制那性能为什么跟kafka接近? 2. 表内数据量越来越多达到千万级甚至亿级的时候,写入的速度不会降低吗? 3. 数据过期怎么做,难道要在亿级的表中做delete from xx where date_time < 7天前吗? 4. 千万以上的表在查找消息的时候,搜索biz_id还没有索引无法保证查询性能吧? 5. 物理数据库使用的是机械硬盘还是SSD,SSD的话作为消息队列来用成本有点高吧

作者回复: 1. 没有特别的事务控制,就是Auto Commit。 2. 因为只有自增id一个索引(mysql对自增id索引有优化),插入很快,即使到千万级,也未见明显性能下降。 3. 是的,后台定期任务删除超过7天的老消息,通过自增id去两分找时间点,再通过id范围删除也很快。 4. 是的,因为没有索引,通过biz_id的查询,仅限大致知道时间范围后,去做迭代遍历。实践中,可以考虑将消息写一份到ES建立索引,携程就是这么干的,效果还不错。因为是基于MySQL存储消息,可以考虑阿里Canal从MySQL的从节点去消费消息,再发送到ES建索引,这样对Master没有性能影响。 5. PPD的数据库是用SSD,消息的存储性能对业务太关键,这点钱是值得花的,不必因小失大。

2020-06-28
3
3
what if
波哥,mysql自增键的数据类型上限你是怎么处理的,考虑到日消息量级。比如int是21亿 bigint 是92000000000000000000+ 是否根据评估在有生之年不会达到id上限?

作者回复: 在PMQ的设计中,一张表设计的容量是700~1000万,七天后删除老消息,实际使用中一般每日消息量都是<=100万的(每日消息过多,可以进一步分区)。 你可以算一下bigint,每天100万,要多少年才能用完,应该是几辈子也用不完的,到那个时候这个系统早已被新技术淘汰。

2020-07-18
3
2
罗裕666
波波老师 我有一个疑问 在我的理解中(rocketmq下),同一个group下,一个消息分区messageQueue只能对应一个消费者实例 视频中说lag过大可以加入更多的消费者来提升消费的吞吐量,是怎么实现的呢

作者回复: lag过大,一般可以通过多增加分区来分摊负载,既然增加分区了,当然可以适当增加消费者组中的消费者。

2020-07-02
2
大维
消费者在使用线程拉消息,这里拉的策略是不是轮询定时拉?如果是定时拉的话,这个拉取的时间间隔的设定有什么策略吗?

作者回复: 对,采用轮训polling,和Kafka一样。 消息拉取采用一种简单退避策略,从50ms起步,然后以50ms为步长不断往上加,最大到5秒。步长和最大等待都是可以配置。

2020-06-30
2
空空如也
波哥,问两个问题 1.推送消息的数量和DB延迟的数据采集是怎么做的呢? 比如说DB延迟时间,需要在消息表中记录生产者产生消息时间戳,DB保存生产者消息时间戳,消费者成功提交偏移量时间戳吗?broker批量保存记录同时做聚合再保存到MySQL表中(如按分钟计算avg)还是有什么其他方案? 2.DB延迟偏高和消息堆积告警怎么做的? 是有一个监控程序轮序查询数据库还是通过grafana的alert功能做阈值的告警,触发邮件和短信通知 谢谢老师

作者回复: 1. 在生产端,PMQ主要统计DB写入延迟,这个主要在Broker上埋点统计的。在消费端,PMQ主要统计DB读取延迟,这个主要在Consumer端埋点统计的。 你说的那个方法,可以用来统计消息从生产进入DB到被消费者消费的延迟。这个在实践中我们发现意义并不大,因为只要消息不堆积(生产和消费速度匹配,或者消费速度>生产速度),基本上都是最多几十个ms的延迟。真正有价值的是最好消息堆积监控,也就是消费速度<生产速度的情况,这个需要告警扩容。 2. 堆积监控一般是后台线程异步去扫描数据库做的,发现异常则发邮件告警。当然可以发数据到Prometheus等监控系统,通过AlertManager或者Grafana等告警。

2020-06-28
2
何凌
MySQL主从之间不是strong consistent的,如果没有partition之间的replication还是有丢数据的风险吧

作者回复: 严格来讲是这样的。 但是完全强一致的HA成本太高,对于PPD这个量级规模,MySQL主从HA/最终一致是可以接收的。大不了挂了人肉修复一下,毕竟MySQL主挂是小概率事件。总体评估,人肉成本比完全强一致方案要低。

2020-06-26
2
不忘初心
多个Broker之间是怎么协调的,这块没讲呢。比如同一个ConsumerGroup的多个Consumer分别连接上了多个Broker,在竞争Partation的时候是怎么实现的。

作者回复: 关于重平衡这块,PMQ 2.0做得是比较简单的,竞争协调就是就是通过元数据库DB记录状态来实现的,Broker都是状态的。 后面有一节会讲PMQ 3.0的重平衡实现,有一个集中式协调器负责协调。

2020-06-25
3
2
Jxin
1.后续会有关于任意延迟时间的延迟消息的内容吗? 2.这里用mysql相对于时序数据库有什么好处吗,毕竟查消息时经常是时间区间的。然后key值索引没有,但key值查找的场景应该都会有的,如何去处理这个矛盾的?让业务方自己根据key值在业务系统定位到大致消息的时间区间再查?想想都有点蛋疼呀。 3.消息存储用mysql实际上是一种存储分离,我也觉得mq往后应该是这个方向。让专业的人做专业的时。基于组合而不是造轮子。 4.思路清晰接地气,棒。

作者回复: 1. PMQ3.0是支持延迟消息的。基本思路就是添加到期时间字段,然后消费者拉的时候看时间有没有到。 2. 消息主要按顺序插入和拉取,自增id是唯一主键,如果再加biz key索引,插入就会变慢。这个问题Cassandra/HBase也是一样的,你用了id做主键,再弄其它主键就需要二级索引机制,会变慢。而且引入Cassandra/HBase整个系统又变重了。如果真的需要高级查询,可以利用MySQL主从/阿里Canal机制,按需把消息再发到ES建立索引就好了,携程就是这样玩的。 3. Broker和存储的分离,Broker无状态可以水平扩展,是最大好处。另外MySQL的HA机制已经有成熟方案。 4. 谢谢!

2020-06-25
7
1
写点啥呢
请问老师,消费者偏移量保存在MySQL中的话,在高吞吐下是如何做的写入优化的呀?特别是消费者很多,吞吐量很大的时候对MySQL写入压力会很大。谢谢老师

作者回复: 后台线程异步批量写入的。中间即使由于故障集群重启,消费者可能重复消费(因为之前的消费偏移可能没有及时保存),所以是at lease once语义

2021-04-27
收起评论