每日一 R「16」实践课之 kv-server(二)
今天仍然是实践课,目标是基本实现 KV server。让我们开始吧!
01-系统架构
在开始之前,我们先大概了解下课程中要构建的 kv server 的基本架构:
与 Redis 一样,kv server 是 C/S 架构的程序,使用 TCP 连接。Client 与 server 之间的协议通过 proto 定义。Disruptor 负责识别并将 client 发来的命令分发给各个命令处理单元。 Storage 负责键值的存储。
整个系统的接口可以分为三个部分:
客户端和服务器的接口或者说协议(proto,9 个命令)
服务器和命令处理流程的接口(CommandService trait)
服务器和存储的接口(Storage trait)
其中第一部分在昨天的 example 示例中已经学习过了,今天的主要内容是其余的两部分。
02-CommandService
在当前版本里,proto 消息中总共定义了 9 种命令,而且将来非常有可能会扩大命令支持的范围。所以,对于命令处理,很有必要定义一个 trait 来规范命令处理的流程。CommandService trait 的定义如下:
然后我们来看一个具体的命令(Hget)处理过程实现:
课程示例代码只实现了 Hget / Hgetall / Hset 命令,其他的实现作为了课后作业。我们自己来实现一下 Hdel 命令(逻辑可能不太完善,无论 storage 中是否包含 key,只要最终结果是 storage 不包含 key 了即返回成功):
按照这个思路,如果我们后面要增加对新命令的支持,也只需要为其实现 CommandService trait 即可。新增的命令可以很平滑地融入之前的代码中。
03-Storage
在前一节的实现中,table 和 key 都是从某个实现了 Storage trait 的结构中获得。Storage trait 是对存储的抽象。
我们可以以内存作为存储介质,这样只需要为其实现 Storage trait,它就能与程序集成在一起;当那天需要持久化到磁盘时,可以以文件作为存储介质,再为其实现 Storage trait,程序就可以无缝切换到支持持久化的介质了。同样,如果要存到数据库中,也可以按照这个范式实现。
课程示例中定义了一个基于 DashMap 的数据结构,MemTable。
本节课程链接:《21|阶段实操(1):构建一个简单的KV server-基本流程》《22|阶段实操(2):构建一个简单的KV server-基本流程》
版权声明: 本文为 InfoQ 作者【Samson】的原创文章。
原文链接:【http://xie.infoq.cn/article/1778ab5d65d6107e201fdc951】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论