PoEAA笔记-7.分布策略
本文摘抄自PoEAA,详细信息请阅读本书
7.1 分布对象的诱惑
透明性非常有用,但虽然有很多东西在分布对象中可以是透明的,但性能却不在其中,尽管上面的架构师是为了提高性能而使用分布组件的,但他的设计只会影响性能,使系统难以构建或部署。
7.2 远程接口和本地接口
按类模型进行分布的方法不可行的主要原因与计算机的基本特点有关,进程内的过程调用非常快,两个独立进程间的过程调用就慢了一个数量级,不同机器间的过程调用又慢了一两个数量级。
本地接口最好是细粒度接口,但细粒度接口不能很好的用在远程调用中,当方法调用很慢时,应该把三次调用合并到一次调用的粗粒度接口,一旦某个对象会被远程访问到,就应该使用粗粒度接口,虽要付出更大的编程代价。显然,只有必要时才应该这么做,应该最小化夸进程的对象协作的数量。
分布对象设计的第一定律:不要分布使用对象。
那么如何有效利用多处理器资源呢?大多数情况下是使用集群系统,这样一来,每个处理器上的对象只会用到本地调用,从而运行更快。
7.3 必须使用分布的情况
总有一些需要分布到不同进程的情况。
- 客户机与服务器的划分是典型的跨进程划分
- 第二种划分出现在基于服务器的应用软件和数据库之间。
- 另一个进程划分出现在Web服务器与应用服务器之间的Web系统中,最好是在同一进程中运行Web服务器与应用服务器。
- 还可能由于厂商的不同而划分,使用的软件包可能需要在单独的进程中运行,这又会用到分布,至少一个好的软件包提供粗粒度的接口
- 最后,还可能有一些别的原因导致你必须去划分你的应用服务器软件。
7.4 关于分布边界
在设计系统时必须尽可能限制分布边界,但在必要的地方还得考虑他们,系统中每个地方都应极力减少远程调用,这样才能使性能开销最小。
然而,还是可以在一个进程内使用细粒度对象进行设计。关键记住只在进程内部使用他们,而在分布边界上放置粗粒度对象,它们唯一的目的是去提供一个到细粒度对象的远程接口,粗粒度对象实际上不做任何事情,从而充当细粒度对象的外观。这个外观只为分布需要而使用——因此称为远程外观。
使用远程外观能减少粗粒度接口引入的困难,这样那些真正需要远程服务的对象才使用粗粒度接口,这也使开发人员清楚所付出的代价,透明有它的好处,但不要期待一个潜在的远程调用透明。
然而,让粗粒度接口仅仅作为外观,可以让使用者无论何时只要他们知道自己运行于同一进程中就使用细粒度对象,这使得分布策略非常明显。通常和远程外观一起使用的还有DTO。因为不止是需要粗粒度的方法,还需要传输粗粒度的对象,当请求一个地址时,需要将信息放在一个数据块中发送出去。通常不能把领域对象本身直接发送出去,因为它们绑定到一个由细粒度的本地对象间引用组成的网络中。所以,应该将客户端需要的所有数据打包在一个特定的对象中,以便于传输,就成了所谓的DTO。传输双方都用到了D TO,很重要的就是要保证它们不能引用网络间任何共享的事物。事实上,一个DTO一般只引用其他的DTO和一些字符串等原始类型的对象。
运行分布的另一方式是使用一个代理在进程间迁移对象,这个思想用到了延迟加载方案来传递对象,不是用数据库的延迟读而是在网络之间移动对象。最困难的部分在于:要保证结果不会产生太多的远程调用,我没有看到谁真的在应用中使用这种方式,但用在一些O/R映射工具中,传来了一些较好的评价。
7.5 分布接口
由于历史原因,分布组件的接口都基于远程过程调用RPC。
还有一种将XML作为数据传输对象的方式。Web Service在不同平台相互交互时能提供便利,建议在无法使用更直接的方法时才使用Web Service。
所有到Web服务器的调用都被Http协议传给底层的面向对象接口处理,这在一定程度上能取得两者的长处,但由于需要Web服务器和主机远程面向对象接口,从而增加了系统复杂度,因此,应该在同时需要使用Http协议和远程面向对象的API时,或者在安全的事务处理机制的远程面向对象API的设施能比使用本地对象更容易地处理这些问题时才能使用这种方法。
我们已经假定了一个同步的,基于PRC接口的,虽然如此,我并不认为这这总是进行分布的最佳方法。逐渐地,我的偏好转向了基于消息的处理方式(它在本质上是异步的)。虽然看在的很多例子都是基于同步处理的,但我认为在Web Service中更适合使用异步方式。
相关文章:
PoEAA笔记-7.分布策略
本文摘抄自PoEAA,详细信息请阅读本书 7.1 分布对象的诱惑 透明性非常有用,但虽然有很多东西在分布对象中可以是透明的,但性能却不在其中,尽管上面的架构师是为了提高性能而使用分布组件的,但他的设计只会影响性能&…...

Spring Boot 整合 Redis 使用教程
作为开发者,相信大家都知道 Redis 的重要性。Redis 是使用 C 语言开发的一个高性能键值对数据库,是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」的首字母缩写,也就是「远程字典服务」。 Redis 以超…...

用友U8 Cloud ReportDetailDataQuery SQL注入漏洞复现(QVD-2023-47860)
0x01 产品简介 用友U8 Cloud 提供企业级云ERP整体解决方案,全面支持多组织业务协同,实现企业互联网资源连接。 U8 Cloud 亦是亚太地区成长型企业最广泛采用的云解决方案。 0x02 漏洞概述 用友U8 cloud ReportDetailDataQuery 接口处存在SQL注入漏洞,攻击者未经授权可以访…...

docker镜像命令
docker images 列表本机上的镜像 - REPOSITORY:表示镜像的仓库源 - TAG:镜像的标签 - IMAGE ID:镜像 - ID CREATED:镜像创建时间 - SIZE:镜像大小 同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本&am…...

通义千问上线春节新应用,AI帮你免费拍全家福
2月5日,春节将至年味渐浓,阿里云通义千问APP上线多项免费新应用,涵盖全家福、拜新年、万物成龙等图像生成的新玩法,共提供超300套照片模板,用户上传照片即可生成全家福、团圆照、拜年照、千里江山主题照;此…...

RabbitMQ 安装
下载erlang语言: erlang语言 下载RabbitMQ rabbitmq 安装erlang 1.以管理员身份安装erlang 2.弹出框选择next 3.选择安装路径,亦可以安装在默认路径 4.接下来一路点击下一步,无需任何修改,直到 install安装为止ÿ…...
如何让MySQL从部署到稳定运行?
如何让MySQL从部署到稳定运行? 1. 安装MySQL 8保姆级教程 2. 《从菜鸟到大师之路 MySQL 篇》 3. 关于MySQL的66个问题 4. MySQL 的学习资源史上最全 5. 掌握 SQL 这些核心知识点,出去吹牛逼再也不担心了...
go 内存二进制数据操作
go 内存二进制数据操作 go 内存二进制数据直接操作 以数字类型为例 int(linux/macos 为int32,windows 为int64). 如果不清楚可以使用unsafe.Sizeof函数来查看(函数出来的值*8就是int位数) 若不使用内存二进制数据操作,你需要在每次获取数字内容时调用binary.Big…...

Antd+React+react-resizable实现表格拖拽功能
1、先看效果 2、环境准备 在package.json 引入相关的依赖 "dependencies": {"antd": "^5.4.0","react-resizable": "^3.0.4",},"devDependencies": {"types/react": "^18.0.33","types…...

StringBuilder类常用方法(Java)
StringBuilder类常用方法 StringBuilder 是 Java 中常用的字符串缓冲区类,适用于频繁修改字符串的场景。 1. append(): 将指定字符串、字符、布尔值或其他数据类型的表示追加到字符串缓冲区的末尾。 StringBuilder sb new StringBuilder("Hello"); sb.…...

Iceberg从入门到精通系列之二十一:Spark集成Iceberg
Iceberg从入门到精通系列之二十一:Spark集成Iceberg 一、在 Spark 3 中使用 Iceberg二、添加目录三、创建表四、写五、读六、Catalogs七、目录配置八、使用目录九、替换会话目录十、使用目录特定的 Hadoop 配置值十一、加载自定义目录十二、SQL 扩展十三、运行时配置…...

Linux的进程信号
注意:首先需要提醒一个事情,本节提及的进程信号和下节的信号量没有任何关系,请您区分对待。 1.信号概念 1.1.生活中的信号 我们在生活中通过体验现实,记忆了一些信号和对应的处理动作,这意味着信号有以下相关的特点&…...
svn常用命令及过滤文件 global ignore pattern
SVN常用命令详解和global ignore pattern Subversion(SVN)是一个版本控制系统,广泛用于软件开发项目中。它能够追踪文件的变更,并且允许多人在同一个项目中协同工作。以下是一些常用的SVN命令及其用法。 1. 检出代码 要从SVN服…...
【QT+QGIS跨平台编译】之二十九:【HDF5+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
文章目录 一、HDF5介绍二、文件下载三、文件分析四、pro文件一、HDF5介绍 HDF5(层次数据格式第5版)是一种用于存储和组织大量数据的文件格式和技术集合。它由美国国家超级计算应用中心(NCSA)开发,旨在解决复杂数据的存储和分布问题。HDF5支持各种数据类型,能够有效地存储…...

React 中实现拖拽功能-插件 react-beautiful-dnd
拖拽功能在平时开发中是很常见的,这篇文章主要使用react-beautiful-dnd插件实现此功能。 非常好用,附上GitHub地址:https://github.com/atlassian/react-beautiful-dnd 安装及引入 // 1.引入 # yarn yarn add react-beautiful-dnd# npm npm…...

golang 引入swagger(iris、gin)
golang 引入swagger(iris、gin) 在开发过程中,我们不免需要调试我们的接口,但是有些接口测试工具无法根据我们的接口变化而动态变化。文档和代码是分离的。总是出现文档和代码不同步的情况。这个时候就可以在我们项目中引入swagge…...

Java开发IntelliJ IDEA2023
IntelliJ IDEA 2023是一款强大的集成开发环境(IDE),专为Java开发人员设计。它提供了许多特色功能,帮助开发人员更高效地编写、测试和调试Java应用程序。以下是一些IntelliJ IDEA 2023的特色功能: 智能代码编辑器&…...
LeetCode LCP 30.魔塔游戏:贪心(优先队列)
【LetMeFly】LCP 30.魔塔游戏:贪心(优先队列) 力扣题目链接:https://leetcode.cn/problems/p0NxJO/ 小扣当前位于魔塔游戏第一层,共有 N 个房间,编号为 0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于…...
Oracle的权限
通过用户登录plsql工具后,如果在创建视图(或其他对象)时,没有指明视图或对象的用户,该视图或对象将直接创建在当前登录用户下。 GRANT SELECT ON user2.table1 TO user1;//将用户2的表1的select权限给用户1 GRANT ALL ON user2.table1 TO u…...

20240206三次握手四次挥手
TCP和UDP异同点 相同点:同属于传输层的协议 不同点: TCP ----> 稳定 1> 提供面向连接的,可靠的数据传输服务 2> 传输过程中,数据无误、数据无丢失、数据无失序、数据无重复 1、TCP会给每个数据包编上编号ÿ…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...