04 2024 档案
摘要:我们知道目前的 HTTP/1.1 采用的是标准的请求-响应模型,客户端主动发请求,服务端被动地返回响应。这种模型在客户端需要实时获取结果的场景下是不合适的,因为这意味着客户端需要不断地轮询,所以最好的做法是服务端生成结果之后,主动推送给客户端。比如 ChatGPT,它在生成内容时,也是生成一部分,就
阅读全文
摘要:楔子 当服务端返回 HTTP 响应时,会带有一个状态码,用于表示特定的请求结果。比如 HTTP/1.1 200 OK,里面的 HTTP/1.1 表示协议版本,200 则是状态码,OK 则是对状态码的描述。 由协议版本、状态码、描述信息组成的行被称为起始行,服务端返回的响应报文中的第一行便是它,然后是
阅读全文
摘要:Bitcask 设计原理解析 Riak 是一个专注于分布式存储的公司,他们想打造一个新的存储引擎,该引擎要能实现以下几个目标: 读写数据时,延迟要低; 高吞吐量; 能够在不降低性能的前提下,处理超过内存容量的数据集; 具备从崩溃中快速恢复的能力,并且不丢数据; 简单的备份和恢复策略; 代码结构和数据
阅读全文
摘要:楔子 先来思考一个问题:首先我们的业务数据都存储在 MySQL 中,现在我们要使用大数据框架(如 Hive、Spark)来对 MySQL 中的数据进行分析,那么最关键的一步是什么呢? 没错,就是数据同步,我们首先要将 MySQL 中的数据同步到 HDFS 上,而搞过数仓的小伙伴肯定知道可以采用 Sq
阅读全文
摘要:本文来自于极客时间:《消息队列高手课》 为什么需要消息队列? 消息队列是最古老的中间件之一,从系统之间有通信需求开始,就自然产生了消息队列。我们知道消息队列的主要功能就是收发消息,但是它的作用不仅仅只是解决应用之间的通信问题这么简单,那么都有哪些问题适合使用消息队列解决呢? 异步处理 大多数人在面试
阅读全文
摘要:楔子 在介绍微服务的时候,我们提到过网关,它是流量的入口。而提到网关,那么就离不开 Lua 脚本,因此为了后续学习网关能够更加方便,本篇文章先来一起学习一下 Lua 这门语言。 Lua 是一门脚本语言,解释器由 C 语言编写,源码总共两万多行,可以说非常的少,就冲源代码的数量,就决定了这门语言难不倒
阅读全文
摘要:楔子 之前在介绍 Kafka 的时候我们提到过 RabbitMQ,它具有性能好、社区活跃度高、功能完善健壮、稳定易用等非常多的优势,对于很多中小型公司来说,RabbitMQ 是一个非常不错的选择。 下面我们来详细介绍一下 RabbitMQ 的架构以及相关用法。 RabbitMQ 整体架构和核心概念
阅读全文
摘要:楔子 假设有这样的一个场景,你去 B 站面试架构师的职位,面试官让你设计一个计数服务,该服务能够对每个视频的观看数量进行实时的计数统计,或者对某个 UP 主的粉丝、获赞数进行统计等等。 当然很多服务其实都可以抽象成计数服务,比如采集系统、监控系统等等,所以计数问题是一个很普遍的问题。那么面对这样一个
阅读全文
摘要:微服务概览 在项目开发初期,秉承着怎么简单怎么来的原则,我们一般都会选择单体架构,比如最经典的 MVC。 传统的 Web 应用就如上图展示的那样,所有的功能模块都被打包在一个单一的代码库中,形成一个所谓的巨石应用。在早期业务量不大、代码量不复杂的时候,这种模式在测试、开发、部署等方面都非常方便。但随
阅读全文
摘要:当我们打开浏览器访问页面的时候,其实就是一个不断发送 HTTP 请求的过程,客户端发送 HTTP 请求,服务端返回响应。这里的客户端可以是浏览器,也可以是我们使用 Python 编写的代码,而服务端则是使用 Web 框架编写的应用程序。 说到这儿,补充一个知识点,很多搞 Python 的小伙伴可能分
阅读全文
摘要:楔子 我们知道当客户端和服务端建立连接时,会进行三次握手。客户端先向服务端发送 SYN 报文,表示想要建立连接,这是第一次握手;然后服务端收到 SYN 之后会给客户端回复 SYN + ACK,表示同意建立连接,也就是第二次握手。 但如果第二次握手的时候,服务端没有回复,那么说明客户端发送的 SYN
阅读全文
摘要:楔子 随着工作经验的积累,你会越来越意识到 TCP/IP 协议的重要性。比如时刻在使用的 HTTP 协议其实只负责包装数据,并不负责数据传输,真正负责传输的是 TCP/IP 协议;再比如 Web 框架,本质上就是一个 Socket,而 Socket 又是对 TCP/IP 协议的一个封装,可以让我们更
阅读全文