分布式系统案例课
杨波
前携程 / 拍拍贷技术总监,微服务技术专家
11809 人已学习
新⼈⾸单¥59
课程目录
已完结/共 66 讲
第一章 课程介绍 (2讲)
时长 09:20
时长 04:42
第二章 如何设计一个分布式计数服务 - 系统设计面试案例 (7讲)
第五章 如何设计一个高并发无状态的会话缓存服务 - 携程SessionServer案例 (5讲)
第十章 课程回顾&结课测试 (1讲)
分布式系统案例课
登录|注册
留言
20
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 20 | 如何解决微服务的数据一致性分发问题?
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 | 结课测试&结束语
登录 后留言

全部留言(20)

  • 最新
  • 精选
hunterlodge
老师,为什么要引入reaper这么复杂的机制呢?如果reaper可以抢占,何不干脆让所有节点处理所有的事件呢?谢谢!

作者回复: 这里头有一个设计折中,如果所有节点无状态都采用抢占方式,那么当数据量大的时候,所有节点抢占DB造成的锁压力就会很大,这个无法线性扩展。所以killbill-queue采用粘性(sticky)处理方式 ~ 一个节点只处理从自己这个节点写入的事件,这样就没有争抢锁的问题,但是这样节点就有状态,节点有状态就会有节点挂的问题,节点挂了谁来负责原来由该节点负责的事件,这时候就需要一个单独的角色在后台监控处理,这个角色就是reaper。

2020-09-29
7
superFan
比较好奇老师是怎么检索到killbill-commons这个项目的

作者回复: 我记得我在google查找"DB based queue" 或者 "DB based event bus"时找到了killbill-commons这个项目。

2021-02-24
6
tenyears
忽然发现上家公司用的就是事务性发件箱模式,那时候还不明白为啥不直接写到mq

作者回复: 中小规模的企业应用,用基于DB的事务性发件箱来实现异步可靠消息,比较简单。

2021-02-27
3
Alan
事务双写问题 视频当中说网络抖动 那可以用事务性mq不就可以解决吗?例如rocktmq或者rabbitmq ?如果能解决 是不是直接发送到mq也可以解决?用canal解决和用mq有啥区别吗

作者回复: 用事务性MQ解决也是一种办法,也可以。 用canal/CDC解决的话,耦合性更低,性能会更好。

2020-07-26
3
高峰
老师,假如billing 或者 customer 微服务消费MQ数据的时候 处理业务报错了 如何处理?需要报警or人工处理? 感觉MQ应该不会再次发送同样的message给业务方消费了。

作者回复: 业务报错,具体情况还是需要根据业务上下文来处理,有些是可以立即重试的,有些立即重试也不行的,将消息发回死信队列,待后续再重试或人工干预。 MQ有主动推消息和消费端拉消息两种消费模式。对于消费端拉模式,例如Kafka,MQ中的消息始终存在,可以按需重复消费(调整偏移量即可)

2020-07-13
2
3
名贤集
感觉事物性发件箱直接读订单表也可以,可以加一个数据读取记录表,拆成两张表的目的是什么呢?

作者回复: 如果只有一张订单表,如果订单修改了,比如调整了单价,或者添加了购物项,这种数据的变更你怎么记录呢? 发件箱主要用于记录数据变更事件的,其它消费者感兴趣的也是数据变更事件。变更包括新建/更新和删除。

2020-07-09
3
3
pinocc
Spring 的 TransactionalEventListener 可以实现事务提交之后才抛出事件

作者回复: 但是对这个事件的处理可能会失败,如果要重试的话,还是需要DB来记录重试状态(否则机器挂状态就丢失了),所以光靠它也不能解决一致性分发问题。

2020-08-12
2
Jxin
1.本地消息表除了视频所述,还可以用rocketMq的事务消息实现(得写反查接口)。但业务侵入问题可能还更严重。

作者回复: 对。rocketMq的方式也可以采用,国内用得比较多的,能解决问题。虽然架构上不太优雅,对应用有侵入性,而且mq本身也会搞复杂。

2020-07-09
2
leehan
举例提到了写DB成功,但是发消息失败(实际成功)的例子,如果是第一步写DB就碰到类似的问题写DB的时候网络抖动认为超时了,但是实际又更新成功了,这种是否需要考虑或是解决呢?

作者回复: 写DB超时了,会抛出exception,这时候不管写DB成不成功,都会触发rollback回滚,不会commit提交。

2021-04-06
1
陈皮
Killbill Commons Queue 是嵌入到业务服务部署的,一般业务服务需要集群部署。 1. 多应用实例情况下,对于数据库的一个节点,每一个应用实例都会有一个 Dispatcher 线程消费,怎么保证消息不被重复消费? 2. create_owner 是在消息写入时定义的,消息消费慢的情况下怎么实现扩容?

作者回复: 1. 每一个应用实例上面的Dispather线程,只消费处理从本实例(creating_owner是自己)写入的事件,而且因为一个应用实例只有一个消费线程,消息取走后DB状态变成处理中,可以保证不会重复消费。 请看killbill common queue的文档说明: The claiming mechanism is lock free: a first query looks for entries to be processed (10 at a time by default, see getMaxEntriesClaimed in the config) then mark them as IN_PROCESSING. Because each node only looks at entries it created (creating_owner column), there is no conflict between several nodes processing the same entry. 2. 消费慢,就需要更多的消费者(Dispather),但是每一个应用实例只有一个Dispather,所以需要更多应用实例,也就是需要对整个集群进行扩容,以分摊消费负载。

2020-07-14
2
1
收起评论