华盛顿大学-分布式系统课设-lab0
前言
无意间发现一个华盛顿大学分布式系统的课程实验,感觉课程组设计得非常用心。不同于一般实验仅仅给出若干测试样例并判断程序的输出是否正确,实验中的验证环节通过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 {
//...
}
PingClient
和 Server
都继承于父类 Node
。 Node
是定义于课程组提供框架中的一个类,具有类成员有地址(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的更多相关文章
- 在西雅图华盛顿大学 (University of Washington) 就读是怎样一番体验?
http://www.zhihu.com/question/20811431 先说学校.优点: 如果你是个文青/装逼犯,你来对地方了.连绵不断的雨水会一下子让写诗的感觉将你充满. 美丽的校园.尤其 ...
- C语课设心得分享(二)
咱们今儿说说IDE的事儿. IDE是「集成开发环境」的意思,比如咱们常用的VC6.0,就是开发C语言所用的IDE的一种.对于IDE的认识,可能有些朋友有点儿模糊,咱们捋一捋,我也会给出一些IDE方面的 ...
- C语课设心得分享(三)
调试. 以前咱们写课后习题,一般也不需要使用调试,如果程序编译error,根据错误信息就可以改好:如果是结果错误,那么在稿纸上过几遍基本也可以得出结果. 但咱们这个课设比较大,就需要很多调试的过程,尤 ...
- C语言课设心得分享(一)
今儿上完课设,老师果然讲的比较少,周四还不用去,看来还是学生自己折腾.我在做课设的过程中,攒了一些心得/体会,希望能和大家分享分享,也希望能一起探讨探讨.如果是我能回答的问题,我很乐意能够提供帮助. ...
- 将C语课设传到了Github和Code上 2015-91-18
一直听说Git好使,以前捣鼓过没弄成,现在考完试了终于可以静下心来研究研究. 哎,我要是当时做课设的时候就用Git,也能省下不少事呢. 使用的Git教程,刚看个开头: 廖雪峰的Git教程 http:/ ...
- JAVA课设---五子棋
1.团队博客链接 JAVA课设-五子棋-团队博客 2.个人负责模块: ①对鼠标事件的处理 , 此模块需处理五子棋的放置问题.颜色转换问题.以及当五子连线时弹出窗口显示结果. ②对MainFrame中主 ...
- JAVA课设个人博客--多源数据教学管理系统
JAVA课设个人博客--多源数据教学管理系统 1.团队课程设计博客链接 https://www.cnblogs.com/hq9-/p/10278470.html 2. 个人负责模块或任务说明 主要模块 ...
- 【js课设】电子画板01
这学期web开发课的课设选了电子画板课题.(人家本来想做富文本编辑器的嘛然鹅老师在第二版里把这题删掉了。゚ヽ(゚´Д`)ノ゚。) 主要考虑的有[界面美观][画笔类型][画布分层]这三个点了. [界面美 ...
- C语言课设——电影院选票系统
C语言课设--电影院选票系统 1.课题介绍 大家都爱看电影,现请参考一个熟悉电影票预订系统,实现C语言版的订票系统.了解订票如何实现的.系统主要有2类用户:管理员用户和顾客用户. 管理员用户 1.电影 ...
- 利用python完成大学刷课(从0到完成的思路)
i春秋作家:tllm 原文来自:利用python完成大学刷课(从0到完成的思路) 最近刚刚开学,学校总是有很多让人无语的课要修,还不能不修.然后我想写一个自动修课的脚本.大佬们不要笑我 是边面向百度学 ...
随机推荐
- 轻量数据库管理工具之adminer
github: https://github.com/vrana/adminer 官方文档:https://www.adminer.org/#download Supports: MySQL, Mar ...
- AtCoder Beginner Contest 379
Contest Link C 妙妙贪心题,居然需要高斯求和公式. Submission D 妙妙套路题,维护全局 lazytag,easy to solve. Submission E 妙妙拆贡献题, ...
- jQuery 元素信息
先贴出元素模型信息 1.获取内容区大小 css():返回值是带单位的(getComputedStyle(node).width) <script> $(function(){ consol ...
- Astro v5 x DevNow
先介绍下 DevNow DevNow Github 体验网站 DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论.搜索等功能,欢迎大家体验.同时也支持 Follow ...
- CentOS 更换国内源
前言 centos默认为官方yum源,国内使用的下载速度完全随缘,且不稳定,一般都需要更换国内源 过程 了解版本 通过cat /etc/redhat-release 可以获取当前centos的版本 知 ...
- Envoy 官网,中文指南,Envoy 实现 .NET 架构网关
收集一些 Envoy 的资料 Envoy 实现 .NET 架构的网关系列 Envoy实现.NET架构的网关(一)静态配置与文件动态配置 Envoy实现.NET架构的网关(二)基于控制平面的动态配置 E ...
- [SQL]null值被比较的结果问题
场景还原 有一个字段是 已删除 deleted 如果0 则是未删除 如果1 则是已删除 我写的where条件是 deleted != 1 然后数据库里面这个字段的值都是null 我当时就想,null值 ...
- 【信号与系统】求使系统稳定的常数K的范围
- java - 正则表达式替换Spring @RequestMapping URL中的@PathVariable值
我在接口(只是为了保存常量)中有Spring MVC URL的定义,例如: String URL_X = "/my-url/{id:[0-9]*}"; String URL_Y = ...
- 揭秘企业微信是如何支持超大规模IM组织架构的——技术解读四维关系链
本文由序员先生分享,原题"技术解读企业微信之四维关系链",本文有修订和改动. 1.引言 3年疫情后的中国社会,最大的永久性变化之一,就是大多数的企业.教育机构或者政务机构,都用上了 ...