1.前言
最近在学习ZeroMQ,并准备用ZeroMQ写个简单版的类TFS系统,该系统的主要消息通讯和数据的传输采用ZeroMQ,目前这个的框架基本完成,整体的框架很简单,初步已经完成了master和slave节点的开发,这个版本中,master节点主要包含了两类东西:1>Slave 节点的负载信息,2>文件到salve的映射表,设计思路很简单,而slave节点主要存储文件内容,客户端直接通过指定的端口向master节点发送文件请求(发送文件和接收文件),master节点收到客户端发来的请求后,根据请求的类型,返回指定的slave节点的地址,而后客户端即可跟相应的slave节点通讯,而master节点则会实时地发送心跳信息给slave节点以获取每个slave节点的负载情况,并实时更新负载列表。
2.架构
本系统所采取的架构类似与传统的分布式文件系统架构,即分为了主节点和从节点,而主节点主要负责收集从节点的基本信息,并且也接收客户端发送的相关请求,架构图如下所示
3. 消息交互流程如下:
4. 所使用的一些基本结构定义
struct command_t
{
command_t()
{
bzero(command,sizeof(command));
bzero(filename,sizeof(filename));
nsize = 0;
}
char command[COMMAND_SIZE];
char filename[FILENAME_SIZE];
size_t nsize;
};
struct file_t
{
file_t()
{
bzero(filename,sizeof(filename));
nsize = 0;
}
char filename[FILENAME_SIZE];
size_t nsize;
};
struct context_t
{
context_t()
{
context = NULL;
sender = NULL;
}
void* context;
void* sender;
//char server[FILENAME_SIZE];
};
enum responseType
{
DIST_NONE = 1,
DIST_GET,
DIST_ADD,
DIST_DELETE
};
struct response_t
{
response_t()
{
type = DIST_NONE;
bzero(server,sizeof(server));
bzero(filename,sizeof(filename));
}
responseType type;
char server[FILENAME_SIZE];
char filename[FILENAME_SIZE];
};
struct request_t
{
request_t()
{
type = DIST_NONE;
bzero(filename,sizeof(filename));
}
responseType type;
char filename[FILENAME_SIZE];
};
enum slaveType_t
{
SLAVE_NONE = 0,
SLAVE_ONLINE = 1,
SLAVE_OFFLINE = 2,
SLAVE_HEARTBEAT = 3
};
struct slave_t
{
slave_t()
{
type = SLAVE_NONE;
nsize = 0;
bzero(server,sizeof(server));
}
slaveType_t type;
size_t nsize;
char server[FILENAME_SIZE];
};
struct msg_t
{
msg_t()
{
nsize = 0;
total_size = 0;
bzero(buffer,sizeof(buffer));
bzero(server,sizeof(buffer));
}
union
{
slaveType_t slaveType;
responseType responType;
};
size_t nsize;
size_t total_size;
char buffer[BUFFER_SIZE];
char server[BUFFER_SIZE];
};
5.封装的一些基本函数
这部分主要是参考ZeroMQ手册上的一些基本函数,并稍作修改,使其支持任意类型结构传输
std::set<std::string> serverList;
typedef std::set<std::string>::iterator serverList_iter;
std::map<std::string,std::string> fileMap;
typedef std::map<std::string,std::string>::iterator fileMap_iter;
std::map<int,std::string> ser