前言

无意间发现一个华盛顿大学分布式系统的课程实验,感觉课程组设计得非常用心。不同于一般实验仅仅给出若干测试样例并判断程序的输出是否正确,实验中的验证环节通过DFS搜索来遍历分布式系统可能的状态,以此判断学生对分布式协议的实现是否正确。 实验一共有五个,第一个实验lab0是课程组给出的做完了四个实验,决定来写一个总结经验的帖子。

整个项目的文件树如下:

需要关注的由framework和labs两个文件夹。其中framework包含了整个测试框架代码,而学生需要完成的是labs文件夹下面的lab,其中lab0作为例子给出,lab1-4难度逐渐加大。

从Ping-Pong开始

很多通信实验都会以Ping-Pong来作为演示或者验证通信是否成功的一个例子,本次实验也不例外。Ping-Pong就是两个节点间进行通信,通信不携带信息,只是简单地进行发送和接收。以节点A、B为例,节点A发送Ping到节点B,节点B收到后,就回复Pong到A,A再继续发送Ping,如此重复下去就是Ping-Pong过程。

Lab0的主要目的是让人熟悉一下实验的框架代码和测试方法,类似于很多课程都有环境配置、Hello World程序一样。

Lab0中关于client和server的定义如下:

class PingClient extends Node implements Client {
//...
} public class PingServer extends Node {
//...
}

PingClientServer 都继承于父类 NodeNode 是定义于课程组提供框架中的一个类,具有类成员有地址(Address),几个主要被使用的类方法有:

  /**
* The address of this Node.
*
* @return the address
*/
public final Address address() {
return address;
} /**
* Send a message to a Node with the given {@link Address}. The message will be cloned or
* serialized immediately as it is sent; there is no need to deep copy data structures when
* creating messages.
*
* @param message the message to send
* @param to the destination address
*/
protected void send(Message message, Address to) {
send(message, address, to);
} /**
* Sends a message to all Nodes in the array.
*
* @param message the message to send
* @param to the destination addresses
*/
protected void broadcast(Message message, Address[] to) {
broadcast(message, address, to);
} /**
* Sets a {@link Timer} to be tracked by the environment. The Timer will be re-delivered to the
* setting {@link Node} after timerLengthMillis milliseconds. Timers may be cloned by the testing
* infrastructure before being re-delivered.
*
* @param timer the timer to set
* @param timerLengthMillis the timer duration
*/
protected void set(Timer timer, int timerLengthMillis) {
set(timer, timerLengthMillis, timerLengthMillis, address);
}

这几个方法包括获取本节点的地址,向某一地址的节点发送消息,向列表中的地址广播消息以及设置定时器等。这反映了节点模型具有的特征:一个根据接收消息队列和定时器队列来进行状态转换的有限状态机。

在分布式领域的奠基之作,Lamport的论文《Time, Clocks, and the Ordering of Events in a Distributed System》中将分布式系统抽象为一系列具有定时器,彼此之间互相发送和接收消息的有限状态机的集合。因此后来的分布式协议中一般都采用类似的节点模型。注意,分布式系统中消息的传输是不可靠的,可能丢失,乱序,节点将定时器消息和接收到的消息排成一个队列作为有限状态机的输入序列。

在lab0的Ping-Pong协议里,我们定义了消息的发送、接收和超时处理逻辑:

  /* -----------------------------------------------------------------------------------------------
* Client Methods
* ---------------------------------------------------------------------------------------------*/
@Override
public synchronized void sendCommand(Command command) {
if (!(command instanceof Ping)) {
throw new IllegalArgumentException();
} Ping p = (Ping) command; ping = p;
pong = null; send(new PingRequest(p), serverAddress);
set(new PingTimer(p), RETRY_MILLIS);
} /* -----------------------------------------------------------------------------------------------
* Message Handlers
* ---------------------------------------------------------------------------------------------*/
private synchronized void handlePongReply(PongReply m, Address sender) {
if (Objects.equal(ping.value(), m.pong().value())) {
pong = m.pong();
notify();
}
} /* -----------------------------------------------------------------------------------------------
* Timer Handlers
* ---------------------------------------------------------------------------------------------*/
private synchronized void onPingTimer(PingTimer t) {
if (Objects.equal(ping, t.ping()) && pong == null) {
send(new PingRequest(ping), serverAddress);
set(t, RETRY_MILLIS);
}
}

这里定义的方法都是由测试框架来调用,测试框架会处理节点之间的发送、接收和超时器的注册和到期处理。上面代码的核心就是在发送消息时设置超时器,在发送超时后进行消息的重传。

服务端的逻辑更加简单,对于接收到的消息直接回复即可:

  /* -----------------------------------------------------------------------------------------------
* Message Handlers
* ---------------------------------------------------------------------------------------------*/
private void handlePingRequest(PingRequest m, Address sender) {
Pong p = app.execute(m.ping());
send(new PongReply(p), sender);
}

我们可以在lab0的下面的tst文件夹找到测试,里面包含了若干个测试点,在idea中点击单测即可进行测试。

华盛顿大学-分布式系统课设-lab0的更多相关文章

  1. 在西雅图华盛顿大学 (University of Washington) 就读是怎样一番体验?

    http://www.zhihu.com/question/20811431   先说学校.优点: 如果你是个文青/装逼犯,你来对地方了.连绵不断的雨水会一下子让写诗的感觉将你充满. 美丽的校园.尤其 ...

  2. C语课设心得分享(二)

    咱们今儿说说IDE的事儿. IDE是「集成开发环境」的意思,比如咱们常用的VC6.0,就是开发C语言所用的IDE的一种.对于IDE的认识,可能有些朋友有点儿模糊,咱们捋一捋,我也会给出一些IDE方面的 ...

  3. C语课设心得分享(三)

    调试. 以前咱们写课后习题,一般也不需要使用调试,如果程序编译error,根据错误信息就可以改好:如果是结果错误,那么在稿纸上过几遍基本也可以得出结果. 但咱们这个课设比较大,就需要很多调试的过程,尤 ...

  4. C语言课设心得分享(一)

    今儿上完课设,老师果然讲的比较少,周四还不用去,看来还是学生自己折腾.我在做课设的过程中,攒了一些心得/体会,希望能和大家分享分享,也希望能一起探讨探讨.如果是我能回答的问题,我很乐意能够提供帮助. ...

  5. 将C语课设传到了Github和Code上 2015-91-18

    一直听说Git好使,以前捣鼓过没弄成,现在考完试了终于可以静下心来研究研究. 哎,我要是当时做课设的时候就用Git,也能省下不少事呢. 使用的Git教程,刚看个开头: 廖雪峰的Git教程 http:/ ...

  6. JAVA课设---五子棋

    1.团队博客链接 JAVA课设-五子棋-团队博客 2.个人负责模块: ①对鼠标事件的处理 , 此模块需处理五子棋的放置问题.颜色转换问题.以及当五子连线时弹出窗口显示结果. ②对MainFrame中主 ...

  7. JAVA课设个人博客--多源数据教学管理系统

    JAVA课设个人博客--多源数据教学管理系统 1.团队课程设计博客链接 https://www.cnblogs.com/hq9-/p/10278470.html 2. 个人负责模块或任务说明 主要模块 ...

  8. 【js课设】电子画板01

    这学期web开发课的课设选了电子画板课题.(人家本来想做富文本编辑器的嘛然鹅老师在第二版里把这题删掉了。゚ヽ(゚´Д`)ノ゚。) 主要考虑的有[界面美观][画笔类型][画布分层]这三个点了. [界面美 ...

  9. C语言课设——电影院选票系统

    C语言课设--电影院选票系统 1.课题介绍 大家都爱看电影,现请参考一个熟悉电影票预订系统,实现C语言版的订票系统.了解订票如何实现的.系统主要有2类用户:管理员用户和顾客用户. 管理员用户 1.电影 ...

  10. 利用python完成大学刷课(从0到完成的思路)

    i春秋作家:tllm 原文来自:利用python完成大学刷课(从0到完成的思路) 最近刚刚开学,学校总是有很多让人无语的课要修,还不能不修.然后我想写一个自动修课的脚本.大佬们不要笑我 是边面向百度学 ...

随机推荐

  1. Golang之数据库转换结构体工具table2struct

    另外一个根据json生成对应结构体在线工具: https://mholt.github.io/json-to-go/ 安装: go get github.com/gohouse/converter 或 ...

  2. 案例 | 某药企引进正也科技S2P系统 整合营销业务

    为了获取更大的市场空间,医药健康行业正迎来一波前所未有的产业升级.尽管不少企业取得了许多成绩,但仍面临诸多挑战. 天津某医药公司是集医药研发.药品生产.医药商业.大健康产业于一体的大型企业.敢为人先开 ...

  3. 微软中文输入法带来的一点小坑,导致arcgispro输入中文异常

    有同事反映,在Pro中新建要素类时,没办法设定名称为"新建",会自己变成不完整的拼音. 查看了一下,确有此事. 在相同的界面里还有其他输入框,却没有这种情况. 研究了一下,发现是输 ...

  4. Oracle无法远程连接的原因及解决办法

    前提 虚拟机Linux(centos7)下静默安装Oracle数据库,本地能访问.文章参考:Linux-CentOS7下安装Oracle11g - sankuoshu - 博客园 (cnblogs.c ...

  5. PPT保存报错:某些字体无法与演示文稿一起保存

    WPS做的PPT,用的会员,高级的那种,很高大上很好看,但是用微软的PowerPoint编辑保存,报错:某些字体无法与演示文稿一起保存. 解决方案:移除嵌入的字体 打开演示文稿文件. 在"文 ...

  6. k8s pod错误的排查步骤和处理方法

    查pod kubectl get pod -n amadeus -o wide 查pod日志 kubectl logs -f --timestamps -n amadeus weyo-server-6 ...

  7. 09C++选择结构(3)——教学

    一.求3个整数中最小值 (第20课 初识算法) 题目:输入三个整数,表示梨的重量,输出最小的数. 方法1:经过三次两两比较,得出最小值. a<=b && a<=c min= ...

  8. 数据湖加速器GooseFS,加速湖上数据分析性能

    数据湖加速器 GooseFS 是由腾讯云推出的高性能.高可用.弹性的分布式缓存方案.依靠对象存储(Cloud Object Storage,COS)作为数据湖存储底座的成本优势,为数据湖生态中的计算应 ...

  9. element 表格增加多选框 ,增加多选

    1. el-table 增加如下代码,就会出现多选框 <el-table-column type="selection" class="checkbox-inp&q ...

  10. MybatisPlusException: can not find lambda cache for this entity[]异常解决

    文章目录 场景说明 解决方案 场景说明   简单来说,我们系统中许多数据都是树状结构的,所以我定义了一个实体类父类BaseTreePO,并且想封装一个通用的树状对象的Service类,部分代码如下: ...