10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

在实现 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:351953
用户头像

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

关注

评论

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

途牛科技与火山引擎数智平台合作 打造企业大数据系统“降本”新范式

字节跳动数据平台

大数据 云服务 企业号 8 月 PK 榜 数据支持

基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v7.0版已发布

JackJiang

网络编程 即时通讯 即时通讯IM

精彩回顾|【ACDU 中国行·杭州站】数据库主题交流活动成功举办!

墨天轮

数据库 oracle AntDB oceanbase 国产数据库

2023大健康博览会|2023广州国际健康产品展会

秋硕展览

对话英特尔院士Tom Petersen:持续优化锐炫驱动,游戏性能强劲提升

E科讯

使用秘籍|如何实现图数据库 NebulaGraph 的高效建模、快速导入、性能优化

NebulaGraph

图数据库 NebulaGraph

pycharm pro v2023.2最新中文+激活码安装

胖墩儿不胖y

代码编辑器 代码编辑 编辑代码 代码编辑工具

智能窗帘展-2023广州国际智能晾衣架展会

秋硕展览

展会

大规模块存储 EC 系统构建

Baidu AICLOUD

分布式存储 块存储 纠删码

阿里云大语言模型(LLM)实战训练营,火热开营中!

阿里云大数据AI技术

LLM模型

徐州堡垒机采购选择哪家?行云堡垒可以吗?

行云管家

网络安全 堡垒机 徐州

小灯塔系列-中小企业数字化转型系列研究——BI测评报告

向量智库

“产业应用创新奖2023”启动征集

飞桨PaddlePaddle

人工智能 百度飞桨 文心大模型

用友BIP重磅升级,发布新品:用友BIP|商业网络

用友BIP

2023全球商业创新大会

【腾讯云 TDSQL-C Serverless 产品体验】 使用 Python 向 TDSQL-C 添加读取数据 实现词云图

全栈若城

Python 腾讯云 Serverless 词云图 tdsql

利用 Databend 助力 CDH 分析 | 大参林

Databend

GaussDB技术解读系列:高级压缩之OLTP表压缩

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 8 月 PK 榜

我的心血全在这了,这种方式讲@Async原理,你别再不懂Spring了

java易二三

Java spring 程序员 计算机

【专家观点】数智化组织模型大力驱动全球化

用友BIP

27. Pandas

茶桁

Python pandas

2023年徐州等级保护测评公司还是只有一家吗?电话多少?

行云管家

等保 徐州

铜锁 SM2 算法性能优化实践(三)|快速模逆元算法实现

铜锁开源密码库

开源 开发者 算法 性能优化 密码学

企业数字化转型,财务规划与分析(FP&A)团队应该如何应对

智达方通

数字化转型 智达方通EPM 财务规划与分析

科技新秀巅峰决战,百度商业AI技术创新大赛圆满收官

百度Geek说

人工智能 企业号 8 月 PK 榜

多款国产服务器、操作系统与摩斯隐私计算完成兼容性互认

科技热闻

当小白遇到FullGC | 京东云技术团队

京东科技开发者

企业号 8 月 PK 榜 Full GC TP99

一次性搞清楚,Java并发编程在各主流框架中的应用,保证看懂

java易二三

Java spring 程序员 计算机

MongoDB中国用户大会北京站及深圳站火热报名中

极客天地

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