一种分布式框架设计(二)

本篇主要介绍分布式框架的模块和其主要使用的通信方式zmq。

首先,对于任意的上游结点,它都有可能会把处理的结果发送到任意的一台下游结点中,同时如果下游结点有新增的结点,上游结点还能自动感知并处理。另一方面,任意的下游结点也会要和所有的上游结点保持心跳。如果使用原始的socket,解决上述的问题会比较麻烦,所以我们运用了zmq来解决上述的问题。Zmq具有下述的优点:1. 是一个跨协议的通信方式,目前支持inproc, ipc, tcp, tpic, multicast;2. 具有丰富且功能强大的设计模式,如req-reply,
pub-sub, push-pull, and router-dealer; 3. 高速异步的通信引擎。以上的三点优势均对我们整体的分布是系统产生了至关重要的影响。首先,之前提到过只有在node间传输的消息量不大的情况下,才对整体性能影响不大;但如果node间的传输信号量不能忽略,那么我们可以把两个服务放到一台机器上,通信协议由tcp改为ipc;其次,下游结点给上游所有结点的心跳可以通过push-pull的方式发送,而上游根据下游的负载来分发则可以使用router-dealer模式,丰富的传输模式极大简化的编程。最后,经本人实际测量发现,在不同机器之间zmq的通信传输速度几乎等同于socket。Zmq还有网络异常情况自动连接,可以先启动客户端再启动服务端等优势,增强了整体系统的可靠性。

下图是整个框架的模块示意图。其中,蓝色的方框为任一线程,socket send和worker线程可以是多个,而其它的只能为单线程(在config文件中配置);菊黄色的箭头是不同结点的传输,采用的是zmq方式通信,示意图中指画出了上游往下游的传输,下游往上游的心跳并没有显示在该示意图中;红色的箭头表示线程和数据存储单元的消息传输;黄色的方框则是线程间公用的数据存储单元。工作时,整个node的输入来源于两处,一是socket get模块的http请求,当获得请求后会记录socket号到socket
list中去,同时把具体的请求放到downstream list模块中;另一处是上游node给本node分派的任务,直接写到proxy模块中去。Worker线程会自己去downstream list里面去取任务,它的操作方式是执行完成一个再去取一个。Worker线程执行完一个任务后会根据情况分派输出,要么分发给下游的Node,要么传递给upstream list通过http协议发送回客户端;socket send从upstream list中获取处理的结果,通过http协议传递出去,socket send的处理方式也是执行一个再获取另一个。Socket
clean模块的作用是定期清理(close)socket list中的没有处理的socket,以免系统的文件描述符用尽。

该框架具有以下特点:1. 可以运用在整体服务中的任意结点,而不需要根据结点的不同位置或功能再添加其它结构;2. 整体框架无锁,性能优异;3. 部分模块可根据线上情况来配置数量,如worker等;4. 高可靠性和智能化。

下面我们来进一步观察两大核心模块,proxy和worker。

先来看proxy模块。它与其它结点有三个通信端口。Pub的作用是和所有的上游结点保持心跳,同时告知上游结点自己当前的负载量;sub的作用和pub相对,它能接收下游结点传来的心跳和负载信息;dealer的作用是接收上游结点分配的任务。RecordMessege()记录当前需要处理的任务,Where2PutProxy(message) 则根据情况分派消息给不同的公共数据模块。

再来看看worker模块。它只有一个router端口连接下游结点,并把本node处理后的任务分派出去,以便后续的处理;HandleRequest(message) 是业务处理的核心接口,RecordMessage()也是记录信息,Where2PutWorker(message) 则判断数据的流向,ChooseChildNode()则起到了负载均衡的作用。

最后提一下不同结点间的通讯协议,我采用的是zmq中自带的frame来区分不同的信号逻辑。

在一种分布式框架设计(三)中,我会分享上述两种类型的无锁数据模块的设计。

时间: 2024-10-07 06:55:31

一种分布式框架设计(二)的相关文章

一种分布式框架设计(一)

通常,当服务涉及到的数据量大到一定程度以后,我们会考虑拆分数据.在这种分布式架构中,每个结点只拥有总数据量的其中一部分,而最终的输出结果会汇总所有结点的结果.这种Map-reduce思想的架构,是尽量不去查分程序,而只是拆分数据来支持大数据的处理,如下图所示.这种框架对每个worker结点的可靠性要求比较高,如果某一个worker结点挂掉了,那么最后的输出结果将是不全的. 我设计的这个分布式框架解决的是另一个问题.比如一个程序中含有A, B, C, D四个逻辑,它们在程序中是串行执行的,彼此之间

一种分布式框架设计(三)

本文讨论在分布式框架中使用到的两个数据结构.为了实现高性能,这两个数据结构都是无锁的. 第一个数据结构存储的是客户端发过来的socket.由于我们的框架只有一个线程接受用户的请求,所以很容易对每一个socket创建一个unique number(稍候我们再来看unique number包含了哪些信息).框架中有一个线程专门来做清理工作,同时关闭没有返回给客户端的socket.最后框架中有多个线程去查询所需的socket,由于是根据unique number进行查找,那么它保证了每一个socket

一种分布式框架设计(四)

我们设计的分布式系统,在正常工作时呈现出网状.服务有层次性,客户的请求会逐步经历各层服务进行处理,当遍历完所有服务后才会完成一次请求.每层服务会有若干台机器,上游节点的机器可以把输出结果传递到下游节点的任意一台机器上. 当服务所依赖的数据需要更新时,我们需要做好同步工作,并保证在数据更新过程中服务是可用的.这儿介绍两类更新的操作方式,它们都需要用到zookeeper来实现. 第一类更新只局限于一个服务的所有机器.我们需要给它们的更新设定一个顺序,避免出现该服务所有机器同时更新这种极端情况.Zoo

游戏UI框架设计(二) : 最简版本设计

最简版本设计 --最简版本设计 为降低难度决定先讲解一个最简版本,阐述UI框架的核心设计理念.这里先定义三个核心功能: 1:UI窗体的自动加载功能. 2:缓存UI窗体. 3:窗体生命周期(状态)管理. UI框架设计主要目的,就是尽可能的完成一些与具体游戏功能逻辑无关的一些底层事务性的功能实现.这些功能最好是自动或者是半自动的实现,无须客户程序(调用框架的程序)过多处理与关心. 对于以上功能,笔者定义了UI框架的相关四个核心类: BaseUIForms    基础UI窗体脚本(父类,其他窗体都继承

net 搭建分布式框架(二)Windows 下的.net 连接 Linux 下的 Redis

接着上节讲 一.修改reids配置文件 // 修改reids配置文件中的ip bind 127.0.0.1 改成 0.0.0.0 vi /etc/redis/6379.conf // 关闭redis 服务 service redisd stop //重启redis 服务 注意:如果用 service redisd start 启动可能会有问题,所以用如下命令启动 redis-server /etc/redis/6379.conf & 二.防火墙端口设置 //开放6379端口 firewall-c

.net 搭建分布式框架(二)CentOS下安装Redis

开始之前 先用SecureCRT连接CentOS 7,连接步骤过于简单就不多介绍了,如果不知道CentOS上的ip 可以用命令 ip addr 查看 一.下载redis安装包 1.输入命令: //进入目录cd usr/local/src //创建redis文件夹mkdir redis //进入刚刚创建好的redis目录 cd redis //用wget命令下载redis安装包 wget http://download.redis.io/releases/redis-4.0.9.tar.gz 结果

Glide框架设计<二>-------Glide复用池、磁盘缓存、图片资源加载手写实现

继续接着上一次https://www.cnblogs.com/webor2006/p/12313876.html的缓存进行编写. 复用池: 27:45 磁盘缓存: 图片资源加载: 原文地址:https://www.cnblogs.com/webor2006/p/12322227.html

个人学习分布式专题(二)分布式服务治理之Dubbo框架

目录 Dubbo框架 1.1 Dubbo是什么 1.2 Dubbo企业级应用示例(略) 1.3 Dubbo实现原理及架构剖析 1.4 Dubbo+Spring集成 Dubbo框架 1.1 Dubbo是什么:Dubbo是一个分布式服务框架,致力于提高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的.告别web service模式中的WSdl,以服务者与消费者的方式在dubbo上注册. dubbo可满足的基本需求

niubi-job:一个分布式的任务调度框架设计原理以及实现

niubi-job的框架设计是非常简单实用的一套设计,去掉了很多其它调度框架中,锦上添花但并非必须的组件,例如MQ消息通讯组件(kafka等).它的框架设计核心思想是,让每一个jar包可以相对之间独立的运行,并且由zk辅助进行集群中任务的调度. 接下来,咱们就一步一步的来看下niubi-job整个的框架设计与实现. 框架设计概述 讲解之前,让我们先来看一张niubi-job的框架设计图.如下: 可以看到,该图的结构非常简单,只有四个部分组成. web控制台:负责发布任务,监控任务的状态信息,上传