手写分布式存储系统v0.1版本

引言

这是手写分布式存储系统v0.1版本,只有一个目标就是支持通过tcp接收数据并落地到磁盘文件(单机模式),那接下来就开始吧

设计

实现一个系统,设计是最过瘾的过程没有之一,类似你搭积木前在脑海设计构建一副大致的“雏形”,只有有了这个东西之后才能够指导最终实现的方向以及确保不会偏离的太差。这里我对v0.1的预期是如下的,只要客户端能够通过tcp将数据请求到Linux机器的端口,咱们的v0.1版本就能够监听到并且将数据落地到磁盘,只需要实现这个功能就可以了。
在这里插入图片描述

代码实现

这个功能中会跟网络和写磁盘打交道,那直接用Netty现成的包就好了,至于写磁盘的话用JDK原生自带的就够了。大致抽象出两个对应的接口以及实现,如下

public interface NetService {void start();void stop();
}public class NetServiceImpl implements NetService{private static final Logger LOG = LoggerFactory.getLogger(NetServiceImpl.class);private EventLoopGroup bossGroup = null;private EventLoopGroup workerGroup = null;public void start() {//bossGroup就是parentGroup,是负责处理TCP/IP连接的EventLoopGroup bossGroup = new NioEventLoopGroup(1);//workerGroup就是childGroup,是负责处理Channel(通道)EventLoopGroup workerGroup = new NioEventLoopGroup(30);try {ServerBootstrap bootstrap = new ServerBootstrap().group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)//初始化服务端可连接队列,指定了队列的大小128.option(ChannelOption.SO_BACKLOG, 128)//通过NoDelay禁用Nagle,使消息立即发出去,不用等待到一定的数据量才发出去.option(ChannelOption.TCP_NODELAY, true)//保持长连接.childOption(ChannelOption.SO_KEEPALIVE, true).handler(new LoggingHandler(LogLevel.INFO)).childHandler(new ServerInitializer());ChannelFuture future = bootstrap.bind(8888).sync();future.channel().closeFuture().sync();} catch (Exception e){}finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}public void stop() {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}
}

再写下数据存储相关的接口和类如下

public interface DataStorage<T> {void save(T t) throws Exception;
}public class LocalDataStorageImpl implements DataStorage<String>{private static MappedByteBuffer mappedByteBuffer;private static Integer _1Gb = 1024*1024*1024;private static Integer _1MB = 1024*1024;public LocalDataStorageImpl() {try {FileChannel fileChannel = new RandomAccessFile("./testWrite", "rw").getChannel();mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, _1MB);} catch (Exception e) {e.printStackTrace();}}@Overridepublic void save(String data) throws Exception{System.out.println("start writeDataToFile data is :"+data);mappedByteBuffer.put(data.getBytes());System.out.println("writeDataToFile end!");}
}

再实现Netty相关的逻辑

@ChannelHandler.Sharable
public class ServerHandler extends SimpleChannelInboundHandler<String> {private static final Logger LOG = LoggerFactory.getLogger(ServerHandler.class);private DataStorage dataStorage = new LocalDataStorageImpl();@Overridepublic void channelActive(ChannelHandlerContext channelHandlerContext) throws Exception {channelHandlerContext.write("Welcome to sherlock home!");channelHandlerContext.write("It is "+ new Date()+"\n");channelHandlerContext.flush();}@Overridepublic void channelRead0(ChannelHandlerContext ctx, String request) throws Exception {LOG.info("========readdata, request is {}=========", request);//异步通过专门的EventLoop线程池进行处理dataStorage.save(request);String response;boolean close = false;if (request.isEmpty()) {response = "Please type something.\r\n";} else if ("bye".equals(request.toLowerCase())) {response = "Have a good day!\r\n";close = true;} else {response = "Did you say '" + request + "'?\r\n";}ChannelFuture future = ctx.write(response);if (close) {future.addListener(ChannelFutureListener.CLOSE);}}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx) {ctx.flush();}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {cause.printStackTrace();ctx.close();}
}public class ServerInitializer extends ChannelInitializer<SocketChannel> {private static final Logger LOG = LoggerFactory.getLogger(ServerInitializer.class);private static final StringDecoder DECODER = new StringDecoder();private static final StringEncoder ENCODER = new StringEncoder();private static final ServerHandler SERVER_HANDLER = new ServerHandler();@Overridepublic void initChannel(SocketChannel socketChannel) throws Exception {ChannelPipeline pipeline = socketChannel.pipeline();pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));pipeline.addLast(DECODER);pipeline.addLast(ENCODER);pipeline.addLast(SERVER_HANDLER);}
}

最后,咱们再来实现主函数逻辑

public class Main {public static void main(String[] args) {NetService netService = new NetServiceImpl();netService.start();}
}

基本上就差不多了,代码优化往后放放,现在嘛,能跑就行☺️

运行调试

启动服务后,咱们通过下列指令往接口插入数据

(echo 'hello'; sleep 2) | telnet 127.0.0.1 8888
(echo 'sherlock'; sleep 2) | telnet 127.0.0.1 8888
(echo 'thanks'; sleep 2) | telnet 127.0.0.1 8888
(echo 'are you ok?'; sleep 2) | telnet 127.0.0.1 8888

通过下面控制台的信息能够看到接收到完整的数据了,说明v0.1版本通过socket端口读取数据的链路是正常的
在这里插入图片描述

再看看本地磁盘文件,通过打印出来能够看到数据是已经落到磁盘的
在这里插入图片描述

小结

以上就是实现的整个过程,代码不可谓不粗糙,不过咱们讲究的就是一个莽,快速闭环看到效果才是最重要的,至于优化嘛,放到后面的版本慢慢优化~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/249119.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣hot100 最小路径和 多维DP 滚动数组 一题多解

Problem: 64. 最小路径和 文章目录 思路&#x1f496; 朴素版&#x1f496; 空间优化版 思路 &#x1f468;‍&#x1f3eb; 路飞 &#x1f496; 朴素版 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) &#x1f30e; 空间复杂度: O ( n m ) O(nm) O(nm) class Solution {public …

查看Windows 所有账户方法

目标 了解Windows查看所有账户的方法 方法 方法1&#xff1a;本地和用户组 按下Win X键&#xff0c;选择“计算机管理”。在计算机管理界面的左侧面板中&#xff0c;展开“系统工具” -> “本地用户和组” -> “用户”。在右侧窗口中&#xff0c;查看列出的所有用户账…

数据结构+算法(第01篇):走下神坛吧!算法

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

科技云报道:新趋势下,国产数据库或“春山可望”

科技云报道原创。 从540亿元到1286亿元——这是中国通信标准化协会大数据技术标准推进委员会针对中国数据库行业给出的一份预测报告。 报告指出&#xff0c;未来五年&#xff0c;中国数据库行业将从百亿级市场跨越成为千亿级市场。 最近两年&#xff0c;中国的数据库行业似乎…

Docker核心教程

1. 概述 官网&#xff1a;https://docs.docker.com/ Docker Hub 网站&#xff1a;https://hub.docker.com/ 容器较为官方的解释&#xff1a; 一句话概括容器&#xff1a;容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立…

leetcode—跳跃游戏—贪心算法

1 跳跃游戏1 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&a…

Codeforces Round 922 (Div. 2)补题

Brick Wall&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;规定砖的大小为1*k&#xff08;k>2&#xff09;,现在有一面n*m的砖墙&#xff0c;n是墙高&#xff0c;m是墙宽&#xff0c;砖在砖墙中有两种放法&#xff0c;水平放置和竖直放置&#xff…

注册亚马逊店铺用动态IP可以吗?

注册亚马逊店铺可以用动态IP&#xff0c;只要是独立且干净的网线就没问题&#xff0c;亚马逊规则要求一个IP地址只能出现一个亚马逊店铺&#xff0c;若使用不当会导致关联账户。 固定ip可以给我们的账户带来更多的安全&#xff0c;要知道关联问题是亚马逊上的一个大问题&#…

《动手学深度学习(PyTorch版)》笔记4.8

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

人工智能基础-Numpy.array基本操作

基本属性 查看维度 x.ndim查看维度&#xff08;元组形式&#xff09; x.shape元素个数 x.size数据访问 子矩阵 内容同步修改 加是copy&#xff08;&#xff09;则不同步修改 Reshape 修改维度 参数为-1时自动识别个数 合并 np.concatenate([x, y])沿着列合并 np.co…

第十四届蓝桥杯大赛软件赛省赛(C/C++ 大学B组)题解

尝试再做一次&#xff0c;我记得还是有点难&#xff0c;我会尽量多写一点解析&#xff0c;尽量让基础比较弱的友友也能看懂&#xff0c;希望能给你带来帮助 目录 1. 日期统计 题目描述 解题思路 具体代码 2. 01 串的熵 题目描述 解题思路 具体代码 3. 冶炼金属 题目…

如何编写具有完备性的测试用例 ? 具体思路是什么 ? 全套解决方案打包呈现给你 。

设计测试用例应该算是测试人员最为主要的工作之一 &#xff0c;好的测试用例往往具有覆盖性强 &#xff0c;扩展性高以及复用性好等特点 。该如何设计出好的测试用例 &#xff1f;是我们每一位测试人员需要重点思考的问题 &#xff0c;下面是我对设计测试用例设计的思考 &#…

#RAG|NLP|Jieba|PDF2WORD# pdf转word-换行问题

文档在生成PDF时,文宁都发生了什么。本文讲解了配置对象、resources对象和content对象的作用,以及字体、宇号、坐标、文本摆放等过程。同时,还解释了为什么PDF转word或转文字都是一行一行的以及为什么页眉页脚的问题会加大识别难度。最后提到了文本的编码和PDF中缺少文档结构标…

如何输入手机验证码才能查询?确保本人查询!

易查分的手机验证码功能可以通过预留手机号&#xff0c;让用户查询时输入验证码&#xff0c;确保是本人进行查询。本次就来介绍如何开启【手机验证码功能】。 &#x1f4cc;使用教程 01准备电子表格 在准备表格时&#xff0c;建立查询时&#xff0c;查询条件必须设置两个或者两…

ElementUI 组件:Container 布局容器实例

ElementUI安装与使用指南 Container 布局容器 点击下载learnelementuispringboot项目源码 效果图 项目里el-container-example.vue代码 <script> export default {name: el_container_example,data() {const item {date: 2024-01-31,name: 国龙,address: 上海市某区…

Mac 终端可以使用yarn,但是vscode里面报错segmentation fault

Mac 终端可以使用yarn 但是vscode里面报错segmentation fault 查阅官网https://www.yarnpkg.cn/getting-started/install 在vscode运行corepack enable即可解决该问题

网络异常案例五_SYN被丢弃

问题现象 公司同事使用的时候&#xff0c;反馈系统不稳定&#xff0c;访问的时候&#xff0c;有时候会出现白屏&#xff08;连接超时&#xff09;&#xff0c;或者系统页面点击没有响应&#xff0c;过一会之后刷新系统又可以正常展示了。之前未收到过类似反馈&#xff0c;一直…

20240131在WIN10下配置whisper

20240131在WIN10下配置whisper 2024/1/31 18:25 首先你要有一张NVIDIA的显卡&#xff0c;比如我用的PDD拼多多的二手GTX1080显卡。【并且极其可能是矿卡&#xff01;】800&#xffe5; 2、请正确安装好NVIDIA最新的545版本的驱动程序和CUDA。 2、安装Torch 3、配置whisper http…

2024年数学建模美赛 分析与编程

2024年数学建模美赛 分析与编程 1、本专栏将在2024年美赛题目公布后&#xff0c;进行深入分析&#xff0c;建议收藏&#xff1b; 2、本专栏对2023年赛题&#xff0c;其它题目分析详见专题讨论&#xff1b; 2023年数学建模美赛A题&#xff08;A drought stricken plant communi…

k8s Sidecar filebeat 收集容器中的trace日志和app日志

目录 一、背景 二、设计 三、具体实现 Filebeat配置 K8S SideCar yaml Logstash配置 一、背景 将容器中服务的trace日志和应用日志收集到KAFKA&#xff0c;需要注意的是 trace 日志和app 日志需要存放在同一个KAFKA两个不同的topic中。分别为APP_TOPIC和TRACE_TOPIC 二、…