在这期通讯中,我们将涵盖以下主题:
- Zoom 用 TCP 还是 UDP?
- 为什么 Kafka 快?(YouTube 视频)
- 分布式 SQL
- 阻塞 vs. 非阻塞队列
TCP vs. UDP
Zoom 使用哪种协议进行视频流传输,TCP 还是 UDP?
让我们先回顾一下区别。
🔹 TCP 和 UDP 之间的主要区别是 TCP 基于连接,而 UDP 无连接。
- 基于连接:意味着所有消息都会到达并且按正确顺序到达
- 无连接:不保证顺序或完整性
🔹 第二个区别是 UDP 比 TCP 更快。
- UDP 不需要 ACK 消息返回
- UDP 没有流量控制
- 接收端没有重复验证
- 更短的头部
UDP 为了速度牺牲正确性。用户通常更喜欢流畅的视频通话,UDP 确实是 Zoom 的默认选择。
思考题:HTTP 协议曾经基于 TCP,但最新协议 HTTP/3 基于 UDP。你知道为什么吗?
为什么 Kafka 快?
主要谈了两种技术:顺序 I/O 和 零拷贝。
分布式 SQL
什么是分布式 SQL?为什么我们需要它?
Google 的 Spanner 在 2012 年普及了”分布式 SQL”数据库术语。分布式 SQL 数据库自动跨多个节点复制数据,并且是强一致的。Paxos 或 Raft 算法通常用于在多个节点之间达成共识。
分布式 SQL 数据库示例:
- Google Spanner
- Amazon Aurora
- CockroachDB
- YugabyteDB
- TiDB 等
术语
- OLTP = 在线事务处理
- OLAP = 在线分析处理
- HTAP = 混合事务/分析处理
OLTP 查询的生命周期(用蓝色序列号标记)
步骤 1:客户端发送 MySQL 查询,查询由 TiDB 解释,TiDB 是解释 MySQL 协议的无状态 SQL 层。
步骤 2:TiDB 从放置驱动(PD)请求数据映射/放置信息。
步骤 3:PD 响应数据映射/放置指令和时间戳。
步骤 4:TiDB 在 TiKV 服务器(基于行的存储)上执行查询。
步骤 5、6:查询结果发送回客户端。
复杂 OLAP 查询的生命周期:用黄色序列号标记
思考题:你认为 OLTP 和 OLAP 术语已经过时还是仍然非常相关?我们应该何时使用分布式 SQL 数据库 vs. 传统关系数据库?
阻塞 vs. 非阻塞队列
我们如何实现非阻塞队列?阻塞和非阻塞算法之间有什么区别?
我们讨论阻塞和非阻塞算法时使用的术语可能令人困惑,所以让我们先用图表回顾并发领域的术语。
🔹 阻塞(blocking)
阻塞算法使用锁。线程 A 首先获取锁,如果线程 A 在持有锁时被挂起,线程 B 可能等待任意长时间。这种算法可能导致线程 B 饥饿。
🔹 非阻塞(non-blocking)
非阻塞算法允许线程 A 访问队列,但线程 A 必须在一定步数内完成任务。像线程 B 这样的其他线程仍可能因拒绝而饥饿。
这是阻塞和非阻塞算法之间的主要区别:阻塞算法阻塞线程 B 直到锁释放。非阻塞算法通知线程 B 访问被拒绝。
🔹 无饥饿(starvation-free)
线程饥饿意味着线程无法获取对某些共享资源的访问并且无法继续。无饥饿意味着这种情况不会发生。
🔹 无等待(wait-free)
所有线程都可以在有限步数内完成任务。
无等待 = 非阻塞 + 无饥饿
➡️ 非阻塞队列实现
我们可以使用比较和交换(CAS)来实现非阻塞队列。下图说明了该算法。
➡️ 优势
- 无线程挂起。线程 B 可以立即获得响应,然后决定下一步做什么。这样,线程延迟大大降低。
- 无死锁。线程 A 和 B 不等待锁释放,意味着不可能发生死锁。
本文为学习目的的个人翻译,译文仅供参考。
原文链接:EP13: TCP or UDP for Zoom? Also…。
版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。