在这期通讯中,我们将涵盖以下主题:

  • 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)来实现非阻塞队列。下图说明了该算法。

➡️ 优势

  1. 无线程挂起。线程 B 可以立即获得响应,然后决定下一步做什么。这样,线程延迟大大降低。
  2. 无死锁。线程 A 和 B 不等待锁释放,意味着不可能发生死锁。

本文为学习目的的个人翻译,译文仅供参考。

原文链接:EP13: TCP or UDP for Zoom? Also…

版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。