写点什么

在实现 XML 和 Web 服务时要避免的三种常见错误

  • 2009-03-15
  • 本文字数:1520 字

    阅读完需:约 5 分钟

IBM 的 Kyle Brown 在其评论文章开始描述了一种常见的情景:“许多人因以不恰当的方式使用Web 服务和XML 而给他们自己挖了一个坑”。在他的评论中,Kyle 介绍了三个常见的痛点,解释了它们为何会发生并提供了一些替代方法。

我的消息吃了我的服务器! Kyle 指出,通常,Web 服务开发者开始经历“内存溢出”的错误或者奇怪的“性能问题”时,总是会发现服务器拥有极高的处理负载,CPU 使用率接近 100%,以及较低的吞吐量和高网络延迟。导致这些症状的典型原因是非常大的(有时会达到 50 MB 或者更大)消息。而且,这些大消息往往包含了非常大的、作为 XML 消息主体的、采用 base-64 编码的二进制编码信息。导致其发生的原因通常是:

……开发者不理解技术的局限性:XML 处理对解决许多问题都有用,但是你必须认识到消息是要被解析的——并且在大多数……产品中,这就意味着许多或者所有的消息都会驻留在内存中。

Kyle 建议采用如下方法来改善这种情况:

  • 不要发送冗余信息。在许多情况下,发送二进制数据时,你可能会发现消息高度重复。如果是这样,你可能就要考虑在 HTTP 层面使用压缩技术来改善你的网络延迟。虽然这不会帮助你处理负载,但可能有助于减轻其中一个问题。
  • 在 XML 消息体中,根本不要嵌入二进制信息。这是较好的解决方法,还有几种不同的途径可以实现这一效果。比如,你可以使用带有附件的 SOAP 或者消息传输优化机制(MTOM)绕过解析开销,尽管这无助于网络延迟问题。
  • ……还有一个更好的办法,使用 SOAP 根本不发送大的二进制 blob。替代方法,通过受控的文件传输系统,使用一个“带外数据”传输……或者“声明标签(claim Check,参见《EIP 模式》或这里)”模式,避免在 SOAP 和 HTTP 上发送大的二进制文件。

不好意思,你的数据正在显示。根据 Kyle 所说,另一个典型的 Web 服务的“性能问题” 是,使用 Web 服务的层面非常、非常低——通常 Web 服务跟一个 SQL 语句相关,这是因为:

误解了 SOA 架构原则。一个优秀 SOA 架构的关键原则是你的服务应该具有高复用性。

根据 Kyle 所说,这些情况通常发生在:

……如果设计是根据现有代码“自上而下”衍生出服务,这类服务就会出现;通常,开发者会看着他们现有的架构图并且决定将架构中的每一层(包括表现层)转变成服务集。

相反,在 SOA 架构的正确位置使用粗粒度的 Web 服务会更好。再次强调,检查一个架构的标准分层模型,通常在架构中会有一个明确定义的地方已经封装了系统业务逻辑。可以使用“远程门面模式(Remote Facade Pattern)”来包装这些服务,以便用合适的方式来暴露基于模型的服务。

模式(Schema)?我们不需要任何发臭的模式! Kyle 指出,通常开发者试图重用现有代码来生成和解析作为 Web 服务实现基础的 XML。这些实现通常使用 XML 解析器来编组 / 解组消息,同时使用 Java HTTP 类来发送和接收 XML 文档。使用 Web 服务时,通用的方法是,创建使用模式元素的 WSDL 文档,使 XML 不受阻地通过,然后在现有代码中对它们进行解析。

这个问题的症状是组织没有看到 SOA 承诺的好处,而且维护他们的解决方案似乎比以前使用 Web 服务的时候更难(而不是更容易)

简单的解决方案是,每当写 Web 服务时,不管使用 WS-* 标准还是使用 REST 方法,都要确保你创建了代表你文档结构的完整准确的 XML 模式。

如果你正在构建 WS-* Web 服务,那么这个 XML 应该被包含在描述你的 Web 服务的 WSDL 之中。即使你在使用 REST 方法,拥有易于访问的 XML 模式将鼓励你的服务被重用。

避免 Kyle 描述的陷阱似乎是个常识。不幸的是,我们的业界证明了,除非很好的理解和治理 SOA 实现,否则我们会继续一次又一次地重复犯同样错误。

查看英文原文 Avoiding Three Common Mistakes when Implementing XML and Web Services

2009-03-15 23:351630
用户头像

发布了 255 篇内容, 共 56.6 次阅读, 收获喜欢 10 次。

关注

评论

发布
暂无评论
发现更多内容

性能工具之15个常用的Linux文件系统命令

zuozewei

Linux Shell 12月日更

Spring Boot 最核心的 25 个注解,都是干货!

CRMEB

龙蜥操作系统通过工信部电子标准院首批开源项目成熟度评估

OpenAnolis小助手

国产操作系统 龙蜥社区

通过 LSM 架构设计一个数据库引擎

码哥字节

数据库 LSM树

Java&Go三种HTTP服务端端性能测试

FunTester

性能测试 Fasthttp 测试框架 FunTester HTTP服务

Python代码阅读(第72篇):回文

Felix

Python 编程 字符串 阅读代码 Python初学者

低成本、低功耗、小体积433MHz数字量无线控制器

不脱发的程序猿

DIY 无线通信 智能硬件 创客开发

57 K8S之自动弹性缩放

穿过生命散发芬芳

k8s 28天写作 12月日更

助力前端开发的 5 个实用网站

开源之巅

前端 提升能力

语音信号的频域分析

轻口味

28天写作 12月日更

前端规范落地,团队级的解决方案

德育处主任

前端 代码规范 规范 eslint git规范

OPPO大数据计算集群资源调度架构演进

安第斯智能云

大数据 后端

ClickHouse 存算分离架构探索

Juicedata

hdfs Clickhouse 分布式文件系统 云储存

接口文档Swagger接入统一授权中心IdentityServer4

为自己带盐

swagger dotnet 28天写作 12月日更

淘特 Flutter 流畅度优化实践

阿里巴巴终端技术

flutter 移动端 flutter 调试工具

从产品角度探索采控的快速交付

鲸品堂

交付工具

福建省等保测评机构有哪几个?机构名称叫什么?

行云管家

网络安全 等保 等级保护 等保测评

【大咖说*数据Cool谈——数据库寻路,开源有态度】

大咖说

开源 大咖 #数据库

从元宇宙到平行员工,人工世界推动的虚实分工利好RPA

王吉伟频道

RPA 机器人流程自动化 元宇宙 人机协作 虚实分工

openEuler高琨:积极推动开源合规 助力供应链安全

科技热闻

物联网资产管理系统解决方案

低代码小观

物联网 资产管理 CRM 企业管理系统 CRM系统

几个超火的编程网站,别错过!

程序员鱼皮

CSS JavaScript html 前端 后端

安全的IT自动化运维工具用什么好?可以节省时间吗?

行云管家

IT运维 自动化运维

ShardingSphere Mode 模式新起航:运行模式详解

SphereEx

开源 ShardingSphere SphereEx 运行模式 分布式治理

都在说边缘计算,它到底是用来干啥的?

火山引擎边缘云

云计算 边缘计算 虚拟化 算力

首颗云原生边缘计算卫星升空,与KubeEdge一起探索“智慧太空”

科技热闻

敏捷、协作与研发管理

LigaAI

敏捷 研发效能 SaaS 内容合集 技术专题合集

蚂蚁自研移动端 xNN-OCR 技术演进与能力开放

阿里巴巴终端技术

OCR 移动端 端智能

Rainbond通过插件整合ELK/EFK,实现日志收集

北京好雨科技有限公司

Kubernetes PaaS ELK Stack rainbond

新一代人工智能院士高峰论坛-视觉预训练大模型及其在智慧城市中的应用分论坛顺利举办

OpenI启智社区

人工智能 智慧城市 预训练大模型

年末福利!专业级研发项目管理工具CORNERSTONE开源版正式上线!

优秀

项目管理工具

在实现XML和Web服务时要避免的三种常见错误_SOA_Boris Lublinsky_InfoQ精选文章