KV Server
MIT 6.824 课程的第二个 lab 是实现一个 key/value server,这里是官网的 实验说明。本篇文章是关于 key/value server 实验设计思路及实现过程。
实验概述本实验要求实现一个单机版的 kv server,支持 Put、Append 和 Get 三种操作。该服务保证所有的操作都必须是线性化(linearizable)的,确保操作顺序符合实时顺序,并且能够处理网络故障(例如消息丢失),保证操作只执行一次。实验目标是能够满足不同客户端以及不可靠网络等场景,确保服务器在并发和故障情况下都能够正常工作。
设计
线性化:通过使用 Go 的互斥锁(mutex)保护共享数据,确保并发访问时操作顺序一致。
网络故障处理:客户端为每个请求分配唯一序列号(sequence number),服务器通过客户端唯一标识(Client ID)和请求序列号检测重复请求,确保幂等性。
操作定义:
Put(key, value): 将键 key 的值设置为 value,覆盖原有值。需确保线程安全,并记录序列号以防重复。
Append(key, arg): 向键对 ...
MapReduce
MapReduce 是一种处理大量数据的编程模型以及实现,它使用 Map 和 Reduce 两个函数对于海量数据计算做了一次抽象,用于在集群上使用分布式算法处理和生成大数据集。MapReduce 最先由 Google 在 2004 年提出,并且在内部得到了大量的实践,简单说来,MapReduce 模型由一个 Map 函数处理一个基于 key/value pair 的数据集合,输出中间的基于 key/value pair 的数据集合,然后再由一个 Reduce 函数用来合并所有的具有相同中间 key 值的中间 value 值。
仔细分析发现,现实世界中有很多满足上述处理模型的例子,关于 MapReduce 的产生背景和详细的介绍本文不再详细叙述,强烈建议阅读 Google 的论文,一定会对 MapReduce 模型有更进一步的理解。
说起分布式系统,大家应该都知道 MIT 有一个明星课程 6.824,它是专门讲解分布式系统的,这个课程还设置了一系列非常有难度的实验来检验你对课程的掌握。为了进一步加深我对分布式系统的理解,前段时间我便开始完成 2024 年春季 6.82 ...
基于 WebRTC 实现一个文件传输工具(二)- 信令服务器的实现
上篇文章,详细介绍了 WebRTC 技术。我们知道,WebRTC 标准中并没有规定信令服务器的实现,它把这部分的实现交给了程序开发者本身,一方面基于 WebRTC 的应用形态和技术栈可能是多种多样的,这样不但保持了技术中立性,还最大限度的确保了技术的灵活性和开放性;另外一方面,协议的设计是极其复杂的,要兼顾的场景很多,这样也保证了技术标准的简洁性。因此,只要符合 WebRTC 的通信流程和架构设计理念,信令服务器的实现方案应该是非常灵活的。
本文是此系列文章的第二篇,介绍 WebRTC 中信令服务器的设计。
信令介绍在 WebRTC 的技术栈里,详细定义了一整套的规范,例如它的接口设计,使用 SDP 进行媒体协商、使用 ICE 收集网络地址并进行联通性检测等,这些规范使得客户端与客户端之间的数据交换变得非常容易和方便,但是我们发现 WebRTC 并没有对客户端建立点对点连接之前的过程定义规范,“空缺”的这部分,其实就是信令服务器在发挥作用的地方。
概括来说,WebRTC 信令是设备通信和交换点对点连接所需的信息的方式,包括交换应用程序之间的网络信息、协商媒体格式并处理通信会话的各个方面 ...
基于 WebRTC 实现一个文件传输工具(一)- WebRTC 详解
如题,最近在折腾一个文件传输工具,用于在多个不同设备间方便快速地传输文件。我的要求也很直接,这个文件传输工具,最好不需要繁琐的安装和配置过程,能够做到开箱即用,同时它还需要兼容我的 PC 设备和多个移动设备,经过一番调研之后,我决定把技术方案定为了 WebRTC。
本篇文章是此系列文章的第一篇,详细介绍 WebRTC 技术。
WebRTC 概述WebRTC(Web Real-Time Communication)是一个开源项目,旨在通过简单的应用程序接口(API)实现浏览器和移动应用之间的实时通信(RTC)。它允许网页浏览器进行语音通话、视频聊天和点对点文件分享,而无需用户安装特殊的插件或第三方软件。
简单来说,WebRTC 项目主要思想是定义 WebRTC API,该 API 允许浏览器安全地访问设备上的输入外设,如麦克风和网络摄像头,以点对点的方式与远程设备共享或交换媒体数据以及实时数据。借助 WebRTC,多个不同设备可以在一个平台上流畅地、安全地共享语音、视频和实时数据。
WebRTC 是 Google 在 2011 开源的项目,并将其纳入 Chrome 浏览器的开发计划,经过 ...
2023 年终总结
临近年末,最近陆陆续续看到不少人公开了自己的年终总结,我也跟个风,总结一下即将过去的我的 2023 年。
一开始我在总结过去的一年的时候,发现并没有太多值得总结的事情,出于博客网站的需要,我决定还是开个好头,写下了这篇文章。需要特别说明的是,这是一篇流水账式的文章,并没有特别的干货,写的真的很烂。
既然说到这里,先来说一下我的个人网站,2023 年是我正式开始写博客的第一年,正如我在这篇文章中所说,以前我总是记录的很杂、很随意,我希望通过写博客的方式让自己养成记录的好习惯,并且借此得以规范我的记录,希望这是一个好的开始。截止到现在,整个 2023 年我一共正式写了 12 篇文章,算很少的了,其中有不少时间还花在个人网站的建设上,一开始我使用的是 hugo 来构建我的网站,苦于我使用的主题文档缺少,加上 hugo 可自定义性不高,在 12 月份的时候我把个人网站改为了 hexo 构建,并且使用了全新的主题,这套主题文档很详细,可配置性很高,比较适合作为我构建个人网站的选择,最后也就是你现在看到的这个样子。
去年 12 月,我跟妹子摇中了一个不错的盘,也算正式上车,成为房奴大队的一员,今年 ...
GitHub 数据库升级过程
最近 GitHub 官方博客更新了一篇文章,讲述了将 GitHub 网站依赖的 1200+ 台 MySQL 主机升级到 8.0 版本的过程。
先前,Oracle 官方宣布,在 2023 年 10 月 21 日之后,MySQL 5.7 将达到其生命周期的终点,这意味着 Oracle 将不再为 MySQL 5.7 提供官方更新、错误修复或安全补丁,正是在这一背景下,才有了 GitHub 此次的升级。
根据 GitHub 官方介绍,GitHub 使用 MySQL 来存储大量关系数据,因此对于数据库这种底层的基础设施的升级绝非易事,为了升级到 MySQL 8.0,他们规划、测试和升级本身总共花费了一年多的时间,并且需要 GitHub 内部多个团队的协作。因此对于 GitHub 此次这种大规模的底层数据库的升级,我本身是抱有极大的兴趣,也想了解一下如此大规模的 MySQL 的集群采用了什么样的升级方案,所以我去阅读了 GitHub 官方博客,并且将原文翻译如下,以下是原文翻译全部内容。
15 年前,GitHub 开始于一个使用 Ruby on Rails(cczywyc 注:一个基于 Ruby ...
交换机和网络虚拟化
最近在公司负责几个二层网络、三层网络相关的项目,项目推进的过程中也掌握了一些交换机和网络虚拟化相关的知识。在之前我接触到的可能更多是三层、四层网络相关的知识,刚好借着这次项目经验总结梳理一下二层网络设备和云计算中网络虚拟化相关的知识。
交换机概述什么是交换机交换机是一种网络硬件设备,用于连接多台设备(如计算机、服务器、打印机等),使它们能够在一个局域网(LAN)内通过数据包进行通信,现如今,交换机是包括互联网在内的现代 IT 网络的基本组成部分之一,它解决了设备间通信的问题。
交换机接受一个设备的数据包,并且将数据包发送到指定的设备上去,从而实现设备间高效通信。交换机是如何知道它收到的数据包应该发往哪个设备呢?其实是通过 MAC 地址来实现的,交换机收到的网络报文头里包含了源 MAC 地址和目的 MAC 地址,然后交换机在它的地址表中找到对应的网络设备,从而将数据包发往指定的设备。关于交换机具体的工作原理,将在下面具体介绍。
交换机类型从网络模型上来看,我们说的交换机一般都是指的工作在二层网络模型上面的交换机,我们称为二层交换机,它通过检查数据帧的目标 MAC 地址,将数据帧发送到正确 ...
go feed 介绍
上篇文章记录了我在服务器上搭建了自己的 RSS 服务,经过一段时间的体验使用,我发现 RSS 这种信息获取的方式的确很适合我。在深入使用的过程中,也逐渐总结了一些 tt-rss 的优缺点,先说我认为好的方面:
丰富的主题
完善的插件系统
支持独立部署
功能齐全
同时我也认为它有不好的地方(个人主观观点):
PHP 驱动实现,稍有笨重,不够”现代化“
虽然有较为丰富的主题,但整体 UI 风格不是特别喜欢
用户系统不够完善,可玩性不高
不支持除 RSS 订阅以外的形态,例如:网页、文章阅读清单功能
基于上述,我决定自己开始探索这种类 RSS 阅读器的产品形态,自己做一个类 RSS 阅读器。
目前,大部分的博客网站都是支持 RSS 的,不支持 RSS 的网站,也有 RSS Hub 这样的产品帮助我们解决问题。RSS 文件订阅类型一般有 rss、atom、json类型,文件格式为 XML 和 JSON。网站将网站的内容信息整合到一个 RSS 文件中,这个文件我们一般称为 feed,也叫信源。在 RSS 文件里面具体包含了网站的标题、描述、作者信息、文章列表等信息,并且随着网站内容更新, ...
搭建了自己的 RSS 服务
先来简单说一下什么是 RSS 吧,RSS 全称叫做 Really Simple Syndication,中文叫做简易信息聚合,也叫聚合内容,它是一种消息来源格式规范,用以聚合多个网站更新的内容并自动通知网站订阅者。使用 RSS 后,网站订阅者便无需手动查看网站是否有新的内容,同时 RSS 可将多个网站更新的内容进行整合,以摘要的形式呈现,有助于订阅者快速获取重要信息,并选择性地点阅查看。说的简单点就是它可以把各种信息源整合起来,我只需要在一个 RSS 服务里面就可以获取到来自各种不同渠道的订阅更新,现在我们看到个很多技术博客和网站都提供了 RSS 订阅链接,细心的话你应该在很多地方就见过这个东西。
说来奇怪,RSS 本应是上个时代的产物,近些年缺被越来越多的人追捧,在目前这个信息爆炸的时代,各种信息流充满着我们的屏幕,不同的信息平台也有着不同的推送方式,导致信息获取破碎,无法筛选自己真正感兴趣的信息。如果你跟我有差不多同样的想法,那么,搭建一个自己的 RSS 服务就显的很有必要了。
我的信息获取来源,一方面是一些微信公众号,还有一些技术博客和刊栏,导致我的信息获取非常的分散不集中,于是 ...
聊聊 Java21 新特性
背景2023 年 09 年 20 日,Java21 正式发布,这是最新的 LTS 版本,官方预计会对此版本提供至少 8 年的维护。这一次 JDK 的升级是否会引起 Java8 项目升级暂不清楚,但是此版本带来了诸如虚拟线程等重量级功能更新,可能会导致 Java21 版本将会成为未来几年最经典的 JDK 版本,就像曾经的 Java8 一样。
新功能介绍此次 Java21 版本一共带来了 15 个新功能更新,具体可以见官方的发布页面,一眼望去,其中最重磅的更新摸过于 JEP444,也就是我们所说的虚拟线程,一般我们在其他语言(比如 golang)里面叫做协程。除此之外,还有诸如分代 ZGC、Switch 模式匹配等实用功能的更新,以下是 Java21 版本所有的新功能:
提案
标题
说明
JEP430
String Templates (Preview)
字符串模版。Java 语言现有字符串文本和文本块增加功能,其他常用语言均已提供相应的功能用法
JEP431
Sequenced Collections
序列集合。该 JEP 提议引入”一个新的接口族,用于表示集合的概念,这 ...