CMU15-440-P0:Implementing a key-value messaging system

news/2024/10/25 12:47:43/

准备继续更新blog。

最近工作上一直在写业务,看些课程换换脑子。

15-440是CMU的一个分布式课程 http://www.cs.cmu.edu/~15-440/syllabus.html ,其实之前在学校的时候就上过分布式的课程,当时用的MIT 6.824的课件,可惜当时很多paper没有仔细去看,只是把作业做了下,除了lab1都没有写blog记录,导致后来有时间写blog的时候很多细节都不记得了。

这门课程的作业也是用的go语言,不过go语言在一些低版本中存在某些bug,所以如果使用 go的话尽量升级到最新


今年的P0是实现一个 kv messaging system,相对来讲是一个比较简单的系统。很久没有写过go,我也通过这个系统复习了下go语言中的一些特性,然后了解到了一些api的相关用法。

这个系统的要求是这样的:

有一个kv server, kv有两个接口, get 和put

有若干client,通过网络去调用kv server的这两个接口,去获取kv中某个key的value或者修改某个key的value。  

并且server还需提供一个接口count,返回的是当前与server连接的client个数。

要求单个server支持多个client的同时访问,并且线程安全

其中还有一个特殊的要求是,client当中可能会有一些是slow reading client,它的特性就是不会立即读取来自server的消息,如果server持续的向client写数据而client一直不读的话,会导致tcp连接的output buffer爆掉。这种情况需要server对每个client开一个message queue,如果message的数量超过一定数量就自动drop掉。


实现思路如下:

首先这个系统的要求只是单机server支持多client,因此我们要考虑的东西就少了很多。

最简单的实现思路就是生产者消费者模型,client是生产者,server是消费者,而go语言中实现这个模型最简单的就是使用channel,channel本质上就是一个加锁的队列。

具体实现中

最开始开启两个线程,一个线程为工作线程,另外一个线程为accept线程,用来监听端口获取新加入的client连接。

工作线程要处理5种操作,需要使用5种channel处理

1. 新client连接的接入:新连接的检测是通过accept线程监听端口来获得,然后将连接塞进相应的channel里。 对于每个新连接进来的client,在server本地维护该client 连接的状态,并且新建两个线程,分别用来从client读取数据和向client写数据, 读线程不断的从client连接中读取数据,而写进程不断的从client对应的message queue中拉数据写给client

2. client连接的退出:对于每个要退出的client,移除在本地的维护,关闭有关线程。

3. client 发来的具体请求:get或put, get得到的消息放入对应client的message queue中,如果message queue满了就drop掉

4. client连接总数的查询: 收到该请求后,将答案放入相关channel。

5. 关闭server的请求:  将所有连接关闭,每个连接的相关线程关闭,然后退出工作线程


其中在实现中需要了解的是net包中有关tcp连接的使用方法。

server端 listener := net.Listen("tcp", ":80")即可监听80端口的连接。

然后通过conn := listener.Accept()即可在服务端获取该连接

每次读取client发来的请求:

clientReader := bufio.NewReader(conn)   

message, err := clientReader.ReadBytes('\n')

即每次读消息读到换行符结束即可获取client发送来的单次请求


用go语言有时候就是对这些包不太了解所以会产生一些问题。

其他代码就先不贴了 




http://www.ppmy.cn/news/536908.html

相关文章

CMU 15-445/645 Homework #2

0.写在前面 Homework2的一些知识总结。题目和sol可以去cmu-15-445 2020上找到。 个人学习总结:https://github.com/kaniel-outis/CMU15-445 Question 1: Cuckoo Hashing cuckoo是布谷鸟的意思,这种鸟有一种即狡猾又贪婪的习性,它不肯自己筑…

CMM与CMMI的关系

cmm与cmmi的区别:CMMI比CMM多个I 这个I是intergration,集成的意思。 CMM适用于软件的组织成熟度测评。 CMMI适用于多种组织成熟度测评,其中CMMI_SW适用于软件。 CMMI相对CMM更完整,更适用于大环境。 过去有政策,过CMM3…

CMMI3 和 CMMI 4

CMMI 3. 0 2.1 SPP模型...0 2.2 SPP过程域的目的...4 2.3 SPP与CMMI的关系...5 2.4 SPP文档结构与规范细分...6 2.5 SPP角色与职责表...8 2.6机构软件过程改进的政策... 9 2.6.1目标... 9 2.6.2机构领导的支持... 9 2.6.3质量管理的政策... 10 2.6.4软件工程过程小组的政策... …

GM 8773C MIPI转双MIPI

1 产品概述 GM8773C 是一款 1:2 DSI 桥接芯片,可实现 4 路进 8 路出转换器功能、视频分离器功 能。芯片内集成了一个 4 路单一链路的 MIPI DSI 接收器和 8 路双链路 MIPI DSI 发送器。 接收器每路可以支持到 2.0Gbps/lane ,可以最高支持到 2…

从CMM的QA到CMMI的PPQA

以前的CMM的QA是只关心过程质量,由此也是众多的咨询师也是众口一词,对此也没有置疑。还是在2001年在做CMM的时候我就觉得至少在国内这些过程还不成熟甚至没有过程的软件企业(通过了N级并不代表过程真正的成熟)是难以实现的&#x…

wallys/IPQ8074a/2x(4×4 or 8×8) 11AX MU-MIMO DUAL CONCURRENT EMBEDDEDBOARD

IPQ8074A 4x4 2.4G 8x8 5G 802.11ax IPQ8074A 4x4 2.4G 8x8 5G 802.11ax DR8074A(HK01) ​​​​​​https://www.wallystech.com/Routerboard/DR8074A-HK01-wifi6-Qualcomm-IPQ8074A-4T4R-2-4GHz-and-8T8R-5GHz-support-OpenWRT-802.11AX-MU-MIMO-OFDMA.html Wallys Comm…

什么是cmm3规范?什么是CMMI5 呢?

cmm是项目管理 由美国卡内基梅隆大学的软件工程研究所(SEI)创立的CMM(Capability Maturity Model 软件能力成熟度模型)认证评估,在过去的十几年中,对全球的软件产业产生了非常深远的影响。CMM共有五个等级,分别标志着软件企业能力成熟度的五个…

CS5518 MIPI转2PortLVDS,替代GM8775C

CS5518是一款MIPI DSI输入与1或2Port LVDS输出转换芯片。Pin to Pin替换GM8775C!MIPI DSI最多支持4Lane,1Lane最大运行速率为1Gbps。LVDS支持18或24位像素,25MHz至154MHz,支持VESA或JEIDA格式。单路1.8V供电方式,可选配…