写点什么

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

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

关注

评论

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

FastDFS 可观测性最佳实践

观测云

fastdfs

ECRobot 深耕 AI 应用场景落地!伊克罗德信息成功签约两大行业标杆客户

伊克罗德信息科技

云栖实录 | 从多模态数据到 Physical AI,PAI 助力客户快速启动 Physical AI 实践

阿里云大数据AI技术

阿里云 nvidia PAI

语音识别技术实战:从iOS到GPT的优化之路

qife122

自然语言处理 语音识别

在AI技术快速实现创意的时代,挖掘邮件营销系统新需求成为关键突破点

qife122

开源项目 需求分析

从零开始:手把手教你在 AskTable 中连接和管理数据源

察言观数 AskTable

数据库 大数据 数据分析 数据管理

为何底层数据湖决定了 AI Agent 的上限?

字节跳动数据平台

商城程序搭建B2B2C平台的物流轨迹信息展示之在途监控API

快递鸟

金融级稳定性:ETLCloud如何保障千万级数据的准确同步

谷云科技RestCloud

kettle 数据传输 数据同步 ETL 数据集成工具

英特尔联动「扣子 AI 工坊」启动高校计划——让校园创意一键开挂

新消费日报

传帮带 人才梯队建设经验总结(13)

万里无云万里天

人才培养 工业 工厂运维

追觅的想象空间:以技术为翼,向生态无垠

慢点科技SlowTech

“一切皆文件”:揭秘LINUX I/O与虚拟内存的底层设计哲学

poemyang

Linux RPC I/O模型

征程 6 | BPU trace 简介与实操

地平线开发者

自动驾驶; 算法工具链 地平线征程6

在VS Code IDE中通过LocalStack集成加速无服务器测试

qife122

AWS LocalStack

OAuth/OpenID Connect 渗透测试完全指南

qife122

网络安全 Oauth

吃透 DolphinScheduler 负载均衡:3 大核心算法 + 底层逻辑全解析

白鲸开源

大数据 开源 算法 Apache DolphinScheduler 数据调度

用了天润融通AI之后才知道,原来以前的客服真苦

天润融通

全国独家线下面授 | 大规模敏捷LeSS认证上海12月18-20日【报名享多重福利优惠】

ShineScrum

LeSS认证 CLP认证 LeSS认证实践者

DolphinScheduler 3.1.9 单机版重启后,项目、流程定义等数据全部丢失

白鲸开源

大数据 开源 Apache DolphinScheduler 工作流任务调度

代码·创想·未来——百度文心快码创意探索Meetup来啦

Comate编码助手

工程师 AI 编程 文心快码 AI编程助手

java遍历hdfs路径信息,报错EOFException

刘大猫

人工智能 云计算 大数据 算法 物联网

高性能智算网关打通 GPU 集群与 AI 存储高速链路,硬件成本直降 95%

Baidu AICLOUD

工业管理 团队建设经验总结(5)

万里无云万里天

团队建设 工业 工厂运维

最佳实践:基于Apache SeaTunnel从MySQL同步到PostgreSQL

白鲸开源

MySQL postgresql 大数据 开源 Apache SeaTunnel

敏捷VMO:打通战略到成果的桥梁,驱动企业规模化敏捷转型

ShineScrum

敏捷 PMO VMO

SpringBoot 3.x 集成 Flowable 7.x:流程设计、部署、启动及完成实战

Geek_e3e86e

编程 java面试

新兴数据湖仓手册·从分层架构到数据湖仓架构(2025):数据仓库分层的概念与设计

白鲸开源

大数据 数据仓库 数据湖 白鲸开源 WhaleStudio

Dify 企业版 3.2.0 重磅发布:开启智能应用构建新纪元!

伊克罗德信息科技

AI Coding实现X2SeaTunnel的设计、开发与落地

白鲸开源

大数据 开源 数据同步 Apache SeaTunnel AI编程

“全球金牌课程”11月08-09日·上海线下·CSM认证【提前报名特惠

ShineScrum

Scrum Master CSM CSM认证 CSM认证培训

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