我对分布式计算框架的理解与设计

谢谢大家来看这篇文章,我想花点时间分享一下我对分布式计算的理解。
分布式服务有很多,比如hbase, hadoop, spark等,我所要讲述的重点不是这些服务的原理,而是用更浅显的话讲述更深刻的设计。
如何把多个的机器组合起来完成一件简单的计算任务,所以这方面的架构设计更多的关注服务器间的关系。
下面我们来设计一个框架,以进行简单的分布式计算。
我们假设计算目标有三类:
1.分布计算能力,简单多节点计算, 计算1万以内的质数。
2.map-reduce,以wordcount为例。
3.资源查询,分布式查询数据库

模块设计

在架构上, 可以将服务中的服务器分三个模块:

这里写图片描述

模块含义
config配置服务
service对外接口服务
server工作服务(worker)

我想让service接受请求,server进行计算, 流程会是怎样的呢。

流程设计

一条简单的请求过来,可能经过的处理过程:
这里写图片描述

实际的处理比这个要复杂,比如请求过期处理等。

抽象设计

在框架内通个上,service与server都会向config注册,通信以及获取节点情况等,因此会有很多
相似的逻辑实现,所以很自然地,我把节点的关系重新定义为 config-node

这里写图片描述

为了简单处理,抽象了一个node,service与server共同继承node, 由node负责与config通信。

功能设计

config在框架里起到分配资源与注册服务的功能。

这里写图片描述

node功能

这里写图片描述

整体功能

这里写图片描述

下面我将对系统设计的协议进行设计。

协议设计

为了简单方便,我将模块间的通信采用protobuf。
(实际上在通用对外服务是不能用protobuf的,请大家思考为什么。)

config:

message ConfigRequest{
    optional ConfigAuthReq auth= 1;
    optional ConfigGetNodesReq get_nodes= 2;
}
message ConfigResponse{
    optional ConfigAuthRsp auth = 1;
    optional ConfigGetNodesRsp  get_nodes= 2;
    optional ConfigNotifyNodes  notify_nodes= 3;
}

server

message ServerRequest{
    required ServerDiag               diags = 1;
    required ServerDiagNodeType       diag_type = 2;

    optional ServerAuthReq            auth = 3;

    optional PrimeQueryReq            prime = 4;
    optional ServerWordCountReq       wc = 5;
    optional ServerQueryReq           query = 6;
    optional ServerBGReq              bg = 7;

}

message ServerResponse{
    optional ServerAuthRsp               auth = 1;
    optional PrimeQueryRsp               prime = 2;
    optional ServerWordCountRsp          wc = 3;
    optional ServerQueryRsp              query = 4;
    optional ServerBGResponse            bg = 5;
}

下面来定义我们的代码结构

代码架构

下面的代码架构主要争对config-node而设计。
config请求处理:

class Config{
  public:
     void OnRequest(const TcpConnPtr& con, ConfigRequest& request);
}

相应的node接口

  class Node{
  protected:
      virtual void onConfigResponse(const TcpConnPtr& con,ConfigResponse& response);

  protected:
      void sendToConfig(const TcpConnPtr& con,ConfigResponse& response);
};

service与server继承node后实现onConfigResponse即可。
这里写图片描述

对外接口设计

为了接口方便,对外接口均设为http接口,并支持网页。

prime:

[get] http://dist.alibaba-inc.com/calc/prime

参数含义
start起始值
end结束值

例:http://dist.alibaba-inc.com/calc/prime?start=1&end=10000

wordcount

[post] http://dist.alibaba-inc.com/calc/wordcount

参数含义
data待计算的文件
tokenize分隔符

分布式查询
[post] http://dist.alibaba-inc.com/calc/query

参数含义
app应用名
db
collection连接
data查询条件

service与server程序架构

这里写图片描述

流程监控设计

为了方便了解每次请求的全链路情况,我在原架构中添加了日志与监控模块
这里写图片描述

功能显示设计

prime

这里写图片描述

wordcount

这里写图片描述

query

这里写图片描述

chart

这里写图片描述

业务流程图

prime

这里写图片描述

wordcount

这里写图片描述

对于map reduce运算,实际处理过程是这样的
这里写图片描述

query

这里写图片描述

这里的query在设计上是简化处理了的,生产上可能需要注意结果缓存,主从同步等。

从上面的设计上,我们可以发现,分布式处理的基础需要有一个config(配置服务器),及内部通信协议。
另外,节点的备份机制也很重要, 比如 config崩溃或者server崩溃的结果要做到不受影响。

崩溃恢复机制

config

对于config的功能,由于其核心功能是当前节点分布,是动态数据,因此数据安全可以采用的方法有很多,比如redis,mysql, mongo等。
这里写图片描述

其自身的功能崩溃恢复可以采用一种简单有效的方法。每个config节点都存有所有config的信息并且同步到各个node(service/server)。
每当新起一个config或者关掉一个,信息更新一次,node与config失联后再主动选择一个连接。

这里写图片描述

node

config提供node相互关注的能力, 即node A可以关注node B, 当node B断开后,config会通知像A一样所有关注它的node。

这里写图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 分布式计算是一个庞大且复杂的领域,要想学好分布式计算,建议以下几点: 1. 了解分布式系统的基本概念和原理,如分布式系统的架构、通信协议、一致性算法、数据分片和数据同步等。 2. 学习相关的技术栈,如分布式数据存储、分布式计算框架、分布式任务调度、分布式锁等。 3. 动手实践,搭建分布式系统的模拟环境,练习使用相关技术栈。 4. 参与开源项目,深入了解分布式系统的实际应用和经验。 5. 关注分布式系统的发展动态,不断学习新技术。 希望以上内容对你有所帮助! ### 回答2: 学习分布式计算的核心是理解分布式系统的原理和技术,并从实践中获得经验。以下是学习分布式计算的建议: 1. 建立扎实的计算机基础知识:分布式计算是在计算机科学基础上构建起来的,因此需要对计算机网络、操作系统、数据库等基础知识有一定的了解。 2. 深入理解分布式系统原理:学习分布式算法和协议,如一致性协议、故障容错、负载平衡、分布式事务等。了解这些原理将帮助你理解分布式系统的设计和运行机制。 3. 学习分布式计算框架和工具:熟悉当前流行的分布式计算框架,如Hadoop、Spark、Kafka、Zookeeper等。掌握它们的特点、使用方法和底层原理,能够帮助你在实践中解决分布式计算中的问题。 4. 实践项目和案例:通过参与实际的分布式计算项目或解决方案,积累经验。可以从构建简单的分布式应用开始,逐渐提高难度,掌握项目的设计、部署、调优等方面的技能。 5. 多读相关书籍和论文:阅读关于分布式计算的经典书籍和最新的研究论文,不断更新知识储备。这将帮助你了解分布式计算领域的最新发展和趋势。 6. 参与开源社区和技术讨论:积极参与分布式计算的开源社区,与同行交流、分享经验。参加技术讨论和会议,了解最新的技术动态和分享经验。 7. 不断实践和总结:分布式计算是一个不断演进的领域,需要不断学习和实践,同时总结经验教训,提升自己在分布式计算中的能力。 总之,学习分布式计算需要全面的知识储备、实践经验和与人交流的能力。通过不断学习和实践,你将能够更好地理解和应用分布式计算的原理和技术。 ### 回答3: 分布式计算是一种通过多台计算机协同工作来完成复杂任务的计算模型。对于学习分布式计算,可以从以下几个方面入手: 1. 理解基本概念:学习分布式计算的第一步是理解其中的基本概念,如分布式系统、节点、通信、协议等。可以通过阅读相关书籍、论文或者参加相关课程来深入了解相关概念和原理。 2. 学习分布式算法:分布式计算中的算法与传统的算法有所不同,涉及到分布式通信、数据共享、任务调度等问题。学习分布式算法可以通过阅读经典的分布式算法设计论文,如拜占庭将军问题、一致性协议等,从中了解常见的解决方案和策略。 3. 掌握分布式系统设计与开发:熟悉常见的分布式系统框架和工具,如Hadoop、Spark等。可以通过学习这些框架的官方文档和教程,参与相关的开源项目等方式来掌握相关技能。 4. 实践项目经验:分布式计算的学习离不开实践经验。可以通过参与实际的分布式计算项目,如构建分布式数据库、实现分布式图计算等,来了解实际应用中的挑战和解决方案。 5. 深入研究领域前沿:分布式计算是一个广泛的研究领域,涉及到数据存储、数据分析、人工智能等多个方面。在掌握基础知识后,可以深入研究分布式计算领域的前沿技术和研究方向,如区块链、边缘计算等。 总之,学习分布式计算需要综合运用理论学习、实践项目经验和深入研究,将基本概念与具体应用相结合,不断提升自己的技能和能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值