文档章节

分布式模式之Broker模式

solar.xie
 solar.xie
发布于 2015/10/29 09:55
字数 1555
阅读 9914
收藏 11

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

分布式模式之Broker模式

问题来源:

创建一个游戏系统,其将运行在互联网的环境中。客户端通过WWW服务或特定的客户端软件连接到游戏服务器,随着流量的增加,系统不断的膨胀,最终后台数据、业务逻辑被分布式的部署。然而相比中心化的系统,复杂度被无可避免的增大了,该如何降低各个组件之间的耦合度。

挑战:

需要保证可伸缩性、可维护性、可更新性,需要将服务划分为各个相对独立的组件,组件被分布式的部署,它们之间通过进程间通信方式实现交互。服务的增加、删除、改变都应该被支持。理想情况,以开发者的角度看,集中化的系统和分布式的系统在中心逻辑上没有什么不同。为实现这个目标:

可以远程的访问服务,而对于访问者,服务的位置应该是透明的。

提供服务的组件可以增加、删除、改变,而且这些在运行期同样应该被支持。

访问服务的客户端不应该关心服务的实现细节。

解决方案:

引入一个Broker组件,解耦客户端和服务端。服务端注册自己到Broker,通过暴露接口的方式允许客户端接入服务。客户端是通过Broker发送请求的,Broker转发请求道服务端,并将请求的结果或异常回发给客户端。通过使用Broker模式,应用可以通过发送消息访问远程的服务。

这一架构模式允许动态的改变、添加、删除服务端,从客户端的角度,这些都是透明的。

结构:

Broker模式定义了6中类:Client,Server,Client_Proxy,Server_Proxy,Broker,Bridge。

Server

责任:处理特定领域的问题,实现服务的细节,注册自己到Broker,处理请求并返回结果或异常。

协作类:Server_ProxyBroker

Client

Client是需要访问远程服务的应用程序,为此,Client发送请求到Broker,并从Broker上接收响应或异常。ClientServer只是逻辑上相关而已,实际上Client并不知道Server的确切位置。

责任:1. 实现用户端功能,2. 发送请求到Broker3. 接收相应和异常。

协作类:BrokerClient_Proxy

Broker

Broker可以被看成消息转发器。Broker也负责一些控制和管理操作。它能够定位服务端的位置,若发生异常,能够将异常捕获传给ClientBroker需要提供注册服务的接口给Server。如果请求来自其他的Broker,本地的Broker需要转发请求并最终将结果或异常回应给相应的远程BrokerBroker提供的服务和name service非常相像(如DNSLDAP)。

责任:1. 注册服务。2. 提供服务API3. 转发消息。4. 容错处理。5. 与其他Broker的交互。6。 定位服务。

协作类:Client_Proxy,Server_Proxy,Bridge

Client_Proxy

连系ClientBroker,这一层保证了通讯的透明性,使Client调用远程服务就像调用本地的服务一样。

责任:1. 封装特定的系统调用。2. 封装通讯的参数、控制信息等。

协作类:Client,Broker

Server_Proxy

Server_proxy是与Client_Proxy相对应的,它接受请求,解包消息,解析出参数并调用服务的实现接口。

责任:1. 封装特定的系统调用。2. 封装通讯的参数、控制信息等。3. 调用server的服务接口。

协作类:Server,Broker

Bridge

Bridge用来连接各个Broker,一般这个组件是可选的。当系统是发杂的网络组成时,有可能需要这一角色。

责任:1. 封装特定的网络特性。2. 传递Broker之间的通讯。

协作类:Broker

应用场景一:

直接通讯方式。ClientServer相互理解他们之间的通讯协议。Broker主要完成ClientServer之间的握手。之后所有的消息、异常都是由ClientServer直接交互。(想象DNS)。简单对象交互如图:

应用场景二:

Broker启动,完成自身的初始化,之后进入事件循环,等待消息到来。

Server启动,首先执行自身的初始化,然后注册自己到Broker

Broker接收Server的注册请求,将其加入到可使用服务的列表,并回应AckServer

Server接收Ack,进入事件监听循环,等待消息到来。

Client调用远程服务对象的方法,Client_Proxy封装消息请其发送给Broker

Broker查询可使用的Server,将请求转发给Server

Server_Proxy解析消息,分离出参数和控制信息,并调用特定的Server实现接口。Server处理完的结果通过Server_proxy封装成消息转发到Server

Broker将相应消息转发给正确的Client_ProxyClient受到响应继续其他逻辑。

简单对象交互如图:

应用场景三:

Broker A接收到请求,交由Server处理,但是发现该Server位于其他的网络节点

Broker A将请求转发给Bridge A,Bridge A将请求进行必要的格式化,传送给Bridge B。

Bridge B将请求进行必要的格式化,转化成Broker B可以理解的格式,并转发给Broker B。Broker B执行场景二中的过程,处理的结果按如上逆序返回。

简单对象交互如图:

部署示意图:


总结:

优点:

1. 服务的位置透明性。

2. 组件的可变性及扩展性。由于Server是注册到Broker上的,所以Server可以动态的增加、删除、改变。

3. Broker之间可交互。

4. 可重用性。

5. 由于组件的耦合度较小,调试和测试的工作也是可控的。


缺点:

1. 效率;增加了一层Broker的消息转发,效率有所降低。

2. 容错能力必须要特别考虑。

3. 调试和测试的工作加大。

本文转载自:http://blog.chinaunix.net/uid-23093301-id-90459.html

solar.xie
粉丝 22
博文 110
码字总数 25844
作品 0
珠海
高级程序员
私信 提问
加载中

评论(1)

小王爷_2019
小王爷_2019
谢谢分享63
kafka原理及Docker环境部署

技术原理 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka为处理实时数据提供一个统一、高吞吐、低延迟的平台。其持久化层本质上是一个“按照分布式事务日志架...

kekefund
2018/10/26
0
0
RocketMQ实战(一)

阿里巴巴有2大核心的分布式技术,一个是OceanBase,另一个就是RocketMQ。在实际项目中已经领教过RocketMQ的强大,本人计划写一个RocketMQ实战系列,将涵盖RocketMQ的简介,环境搭建,初步使用...

zfz_linux_boy
2017/04/09
0
0
面试题剖析,如何保证消息队列的高可用?

面试题 如何保证消息队列的高可用? 面试官心理分析 如果有人问到你 MQ 的知识,高可用是必问的。上一讲提到,MQ 会导致系统可用性降低。所以只要你用了 MQ,接下来问的一些要点肯定就是围绕...

李红欧巴
03/18
121
0
说说MQ之RocketMQ(一)

原文出处:Valleylord RocketMQ 是出自 A 公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进,消息可靠性上比 Kafka 更好,目前,RocketMQ 的文档仍然不够丰...

Valleylord
2018/10/12
0
0
RocketMQ基本概念及原理介绍-适合初学者

原文档地址:http://pan.baidu.com/s/1geL6h6F RocketMQ使用 版本 时间 操作 作者 v0.1 2014-06-30 创建初始版本 何鹏 (hepenglff@163.com) 基本概念 ProducerGroup 通常具有同样属性(处理的...

tantexian
2016/05/10
3.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

密码加密与微服务鉴权JWT详细使用教程

[TOC] 1.1、了解微服务状态 微服务集群中的每个服务,对外提供的都是Rest风格的接口,而Rest风格的一个最重要的规范就是:服务的无状态性。 什么是无状态? 1.服务端不保存任何客户端请求者信...

庭前云落
17分钟前
6
0
Xamarin.FormsShell基础教程(9)Shell相关类体系

Xamarin.FormsShell基础教程(9)Shell相关类体系 在Shell中,最为主要的类是Shell类。Shell类实现了大多数应用程序所需的基本UI功能的页面。除此以外,常用的类还有ShellContent、Tab、Fly...

大学霸
19分钟前
4
0
聊聊MVC、MVP、MVVM吧

先来介绍下本文结构: 三种框架的具体概念 在安卓开发上的写法、优缺点 1.概念 1.1 MVC MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模...

二营长的意大利炮手
36分钟前
4
0
如果解释Python,什么是.pyc文件?

我已经了解Python是一种解释型语言......但是,当我查看我的Python源代码时,我看到.pyc文件,Windows将其识别为“编译的Python文件”。 这些来自哪里? #1楼 Python代码经历了两个阶段。 第...

javail
41分钟前
4
0
.NET Core初览

初览的应用场景为游戏服务器开发。所以测试在侧重点上更强于IO和密集型计算 TODO

梦想游戏人
44分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部