写点什么

数据服务简介

  • 2009-06-30
  • 本文字数:3591 字

    阅读完需:约 12 分钟

数据服务是一种软件服务,它封装了企业相关的关键数据实体的操作。企业数据被存储在多个系统中,要想与之交互需要多个接口或多种机制。此外,数据服务还要给不同渠道(分支机构、在线业务、呼叫中心)和机制(事件驱动、随需应变、批处理)提供服务,这也给数据服务带来了挑战。对于数据消费者,要是没有一个抽象层将之与这种复杂性相隔离,企业中数据源和数据消费者之间的集成将会以一种意大利面式的点对点集成而收场。

数据服务让消费者无需去访问或者更新多个数据源,更重要的是,当消费者需要操作多个数据源时,数据服务有助于维持数据的完整性。此外,它们还能够帮助构建可被多个项目和创新利用的可重用数据服务。数据服务还能够执行关键的治理职能——它们有助于度量指标的集中化、监视、版本管理、数据类型的重用,以及执行数据可视化和访问规则。

数据服务带来的额外好处有:数据源抽象、聚合数据提供者、重用(以通用的、可互操作的、灵活的消费模式)、与逻辑数据模型保持一致、支持服务的多版本、提供增值特性,以及单点交互。因此,数据服务为企业改进业务需求提供了一个可持续的基础。

a. 数据服务的基本原理:前文已经介绍了数据服务给企业带来的几个关键好处。本节将对其每项进行详细地解释:

  1. 数据源的抽象:数据服务将消费者和物理数据源隔离了开来。这使得数据提供者改变数据结构(添加 / 删除表、列或其他数据库对象)、数据格式(从纯文本变到 XML)、数据持久化机制(从单个数据库变到多个数据库、改变数据库提供商、添加表分区)、数据交换协议(从 ODBC 驱动改到 OLE DB 驱动),都不会对每个消费者产生不利影响。任何这些参数的变化都只会影响数据服务的代码,不会要求每个消费者改变其数据访问逻辑。
  2. 聚合:数据服务允许提供者使用一个或多个数据源来构造业务实体。这种思想不仅适用于同构数据源,也适用于异构数据源。例如,聚合可以在两个数据库之间进行,亦可以在一个数据库和一个 XML 文档之间进行。这让数据服务可以将结构化的数据和半(或非)结构化的数据组合起来。例如,数据服务能够聚合文本数据(如来自某个数据源的免责信息)和来自另一个数据源的 Party Profile 数据。针对消费者的需要,提供者还可以使用不同数据源构造出 Party 或者 Account 数据消息,然后跟目标消息聚合在一起。这让消费者不需要查询、访问多个数据源和执行聚合就可以得到自己想要的信息。而且,通过执行聚合,数据服务为消费者提供了更简单的编程接口去完成数据的访问、错误处理和维护。
  3. 重用:数据服务可作为操作企业数据的可重用构建单元。在企业数据上执行 CRUD(增、查、改和删)和查找操作的数据服务本来就是可以跨多个项目重用的。数据服务(又称实体服务 [Entity Services])因为几个特性使其具有可重用性:通用的天性、平台互操作性,以及支持多种消费模式。数据服务逻辑可应用于多个业务流程,这极大地推动了重用。例如,Find Party 服务可以应用于:在给零售账户上已授权个人进行委派时查找 Party,以及在数据合并活动中合并重复资料时查找 Party。数据服务既具有跨平台的互操作性,也可以通过多种传输协议(如 HTTP 和 JMS)使自己被其他消费者使用。它们还可以通过主流的信息交换模式被访问:即发即弃,请求 - 应答和发布 - 订阅。因而,消费者可以根据自己的需要来访问这些服务,如通过用户界面或需要可靠消息传输的异步流程。
  4. 跟逻辑数据模型保持一致:通过保持数据结构和各种数据属性行为中的一致性,数据服务提供了与逻辑数据模型实体(如 Profile、Account 等)保持一致的能力。若没有数据服务,每个消费者就只能以自己特有的方式来解释物理数据属性,随之而来的额外风险就是消费者和底层数据结构的提供者直接耦合在了一起。数据服务允许跨模式重用数据类型和跨服务操作重用模式。由于模式是根据信息架构定义 / 支配的逻辑数据模型而定义的,数据服务提供了与这些逻辑模型的对齐。这就允许数据服务可以使用逻辑数据值和逻辑数据属性(而不是系统特定的值和属性)。为什么这很重要?因为在使遗留系统退役的过程中,最大的障碍是多个消费应用程序中到处散布和使用的物理遗留值和属性。这让数据的每个消费者都和遗留系统发生了紧耦合。数据服务通过跟逻辑数据模型保持一致,有效地将消费者和遗留值与属性进行了解偶。
  5. 支持服务的多个版本:数据服务允许提供者选择暴露服务的一个或者多个版本。这使得数据服务提供者可以给规模较小的目标消费群提供试点服务或者服务的新版本。这也可以让数据服务提供者方便地在服务新版本中提供新特性,不用强迫所有消费者同时升级。同理,这也允许数据服务消费者可以优雅地迁移到数据服务的新版本上去。
  6. 提供增值功能:除了操作数据实体的基本功能之外,数据服务还提供了增值服务,例如数据缓存(为频繁访问的数据提供高效 / 快速的访问)、过滤(例如,客户只想接收某数据实体相关的发布信息),以及订阅管理(针对客户的发布注册管理)。
  7. 交互单点:对消费者来说,数据服务扮演了与数据实体交互的单点。它们可以使用一致的隐喻 / 机制来操作不同数据域中的企业数据(Profile 数据,Account 数据,交叉引用,关系等)。这也简化了认证(验证消费者的证书)和鉴权(如,消费者是否有权执行服务?消费者能否看到机密数据的属性?)的执行。这种交互单点也允许组织在多个数据服务中拥有可重复的消费者集成流程。

b. 数据服务的范围:数据服务主要关注数据实体上的动作——仅此而已。由此,数据服务的范围包括:数据实体上的各种操作,聚合多个不同数据源的数据,使用多种协议简化消费多个平台的数据接口,逻辑接口和物理提供者接口之间的映射,以及数据服务错误的优雅错误处理。数据供给和大数据提取的转换也能够使用数据服务,尽管这些领域一般会使用 ETL 和数据 profiling 工具。业务流程编排逻辑和业务规则执行路线不在数据服务范围之内,因为它们抑制重用。特殊用户界面屏幕 / 应用相关的逻辑也超出了数据服务的范围。

c. 数据服务的开发:数据服务的开发奉行“契约优先”的方法,服务契约——输入模式和输出模式——是根据需求开发出来的。模式设计需要遵循几个指导方针和最佳实践,在此有必要重温其中的关键内容:

  1. 模式属性 / 类型 / 元素的设计要结合信息架构功能发布和治理的逻辑数据模型。这保证了系统或技术相关的标识符 / 值不会暴露到公共模式契约之中。为了确保模式和组织的战略方向保持一致,需要使用标准的编码值,在适当时可增加新的标准遍码值。
  2. 检查现有契约是否有重用的机会。业务实体模式也能由信息架构功能治理,标准的企业数据实体要尽可能的被重用。例如,Get Product 和 Create Product 数据服务 Web 方法都能够使用同一 Product 模式。这同样适用于发布服务的设计——在发布数据实体时重用模式,其过程不同于应调用请求而暴露模式。这不仅能够节省时间,还能够保证数据服务消费者在准备数据服务的输入或解析数据服务的输出时,对数据实体有一个一致的定义。
  3. 在为数据服务消费者设计 WSDL 契约时,需要导入模式,其目的是为了让 WSDL 文档和被用来实现数据编配的接口保持一致。这也保证了 WSDL 文档是轻量级和模块化的。
  4. 应该使用工具(如 Web 服务互操作 [WS-I]WSDLValidator)来验证模式和 WSDL 文档,确保数据服务契约没有使用妨碍互操作性和数据服务重用的平台 / 提供商 / 技术相关的结构。
    一旦确定契约,为了实现它,就要设计数据编配。数据编配将包含以串行、并行或者二者组合执行的数据服务提供者组件模块。在开发流程中的这一步将确切决定所需调用、调用顺序,哪些调用并发进行,以及哪个调用依赖之前的调用等。

d. 数据服务的消费模式:数据服务的消费需要从几个角度来审视:

  1. 计算环境:数据服务可在多数平台上被消费。大多数消费者会使用:.NET 公共语言运行时(CLR),java 虚拟机运行环境(JRE),大型机系统和 Unix/Linux。总而言之,这种计算环境可以是任何能执行 Web 服务调用的环境;可靠队列中的消息能够被发送或者接收的环境。
  2. 传输协议:数据服务可以通过可靠的(如 MQ Series 上的 JMS)或非可靠的(如 HTTP)消息传输协议被消费。某些数据服务可能只能由基于这种功能的某些传输工具提供。
  3. 消息交换模式:数据服务可以通过四种主要的消息交换模式被访问:请求 - 应答(严格 SLA)、请求 - 应答(宽松 SLA ),即发即弃和发布 - 订阅。

作者简介

Vijay Narayanan 就是我,目前是软件开发团队的队长,负责为金融服务公司构建可重用的数据服务和业务流程自动化组件。我从事过多个软件项目,从单独的用户系统到大型、分布式、多服务的多用户平台。在 http://softwarereuse.wordpress.com/ 上,我有一个关于软件重用的博客。

查看英文原文: Introduction to Data Services


感谢马国耀对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2009-06-30 01:2813188
用户头像

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

关注

评论

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

【LeetCode】找到需要补充粉笔的学生编号Java题解

Albert

算法 LeetCode 9月日更

Jira API的踩坑记

FunTester

接口测试 API Jira FunTester 缺陷管理

一分钟带你了解Huawei LiteOS组件开发指南

华为云开发者联盟

curl 内核 组件 Huawei LiteOS 组件开发

数据库连接池

邱学喆

聊聊Java运算符的那些事

Bob

Java 9月日更

【Flutter 专题】51图解动画小插曲之 Flare 动画

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 9月日更

WGCLOUD新特性,新增指令下发批量执行能力

王逅逅

DevOps Grafana #zabbix linux面板 linux监测

15. 弱人工智能、强人工智能、超人工智能

Databri_AI

人工智能

Python代码阅读(第26篇):将列表映射成字典

Felix

Python 编程 Code Programing 阅读代码

Java从入门到升仙的书单推荐,附带读书笔记

Silently9527

Java书籍推荐 Java进阶书籍推荐 Mysql读书笔记

官方披露 TDSQL 十年自主可控之路

腾讯云数据库

数据库 tdsql

TDSQL(MySQL版)之DB组件升级

腾讯云数据库

数据库 tdsql

TDSQL分布式数据库的HDFS和LOCAL备份配置

腾讯云数据库

数据库 tdsql

什么是可中断锁?有什么用?怎么实现?

王磊

9月日更

有个码龄 10 年的程序员跟我说:“他编程从来不用鼠标”,我说:

梦想橡皮擦

9月日更

Vue进阶(幺零五):elementUI 实现表格行列拖拽

No Silver Bullet

Vue 9月日更

手撸二叉树之二叉树的所有路径

HelloWorld杰少

9月日更

计算机工业的生态链(二)

姬翔

9月日更

解决网卡“Device eth0 does not seem to be present, delaying initialization”

耳东@Erdong

9月日更 网卡

让Chrome爽到飞起的5款小众插件!

Jackpop

观测未来,携手同行!驻云诚邀您参加2021 OSCAR 开源产业大会!文末报名福利!

观测云

开源 可观测

为什么 Golang 正在接管软件行业

云原生

云计算 Kubernetes 云原生 编程语言 Go 语言

编程基础:硬件同步原语

正向成长

CAS 硬件同步原语 FAA

云随想一:企业为什么要上云?

FLASH

原生云

Golang 中的整洁架构

baiyutang

架构 DDD Go 语言 9月日更

Rust 从 0 到 1

rust

缓存核心知识小抄,面试必备,赶紧收藏!

博文视点Broadview

一次带宽拉满引发的百分百超时血案!

Gopher指北

Go 语言

重放浏览器单个请求性能测试实践

FunTester

性能测试 接口测试 测试框架 测试开发 FunTester

代码工具:VSCode

正向成长

vscode

深入理解rtmp(二)之C++脚手架搭建

轻口味

android 音视频 直播 RTMP 9月日更

数据服务简介_SOA_Vijay Narayanan_InfoQ精选文章