写点什么

实体服务的模式反模式之争

  • 2007-06-19
  • 本文字数:1292 字

    阅读完需:约 4 分钟

一些人认为实体服务(Entity Services)或以业务为中心的实体是面向服务架构的基本要素。这一观点并没有得到所有人的认同。那么,实体服务是 SOA 模式,亦或反模式?上个月, Shy Cohen ,在文章“面向服务架构中服务的本体和分类”中定义实体服务如下:

“实体服务揭示并显露出系统中的业务实体。它们可以被认为是业务过程中以数据为中心的组件(名词),如:雇员、顾客、销售订单等。实体服务的例子包括,管理顾客信息的客户服务,或管理顾客所下订单的订单服务。”

Shy 还写道:

“实体服务有一个普遍的特点:在实体级别支持增、查、改、删(CRUD),同时为了解决问题领域、支持应用特性和用例的需要,添加了领域特定的操作。领域特定操作的一个例子是:客户服务暴露一个名为FindCustomerByLocation的方法,它可根据顾客的地址定位顾客的 ID。”

Thomas Erl(即将出版的“ SOA: Principles of Service Design ”的作者,同时他还是其它几本 SOA 书籍的作者),以类似的方式定义实体服务

几乎在每个企业中,都将会出现业务模型文档,它用来定义组织相关的业务实体。业务实体的例子包括顾客、雇员、发票和索赔等。实体服务模型表示一个以业务为中心的服务,它基于一个或多个业务实体的功能边界或上下文。由于对大多数父业务过程不可知,它被认为是一个高度可复用的服务。结果是,多个父业务过程可利用实体服务实现自动化。实体服务也被认为是以实体为中心的业务服务业务实体服务。右图展示了一个实体服务的例子。它的一些能力让人想起传统的 CRUD(增、读、改、删)方法。

看起来并不是每个人都同意此观点。John Evdemon,Shy 的同事(同样工作于微软),认为 CRUD 接口是 SOA 的反模式

“对 web 服务而言,CRUD 操作是错误的代理级别。CRUD 可能在服务内部或横跨几个服务实现,但它们不应该以这种方式暴露给消费者。这是服务将内部(私有)能力渗透到服务的公共接口的例子。”

同样,在谈及 CRUD 时, Steve Jones (“企业SOA 实施策略”的作者,该书由InfoQ 出版)总体上相当直率,并断定:“ CRUD 是垃圾”。最近, Nick Malik Jack Van Hoof Udi Dahan 同样在讨论实体服务的问题,而且他们的结论是(来自 Udi 的博客):

“实体服务属于应用架构领域。它们并不是服务的成员,服务是 SOA 分解的基本单元。 一个 SOA 服务既可以使用实体服务实现,也可不使用。如果是,那些实体服务就不能在 SOA 服务边界之外被访问。这样,它们就是 SOA 的实现细节。在这种情况下,我们可以就实体服务优于其它事物(如领域模型模式)的相对价值,进行非常有趣的讨论。”

或者正如 Nick Malik 总结的:

“那么,实体服务是反模式吗?从企业的视角来看,是的。从应用的视角来看,则不是。(两者之间并不冲突)。我认为,这依赖于你站在哪个角度来看。”

尽管如此,仍然还有服务粒度的观点 —— 即使在应用级别。如果服务的粒度太细,就几乎不违反“分布式计算的 8 个谬论”,并且如同 Peter Deutsch 当初定义这些谬论时所说的:

[当你做出错误假定的时候]“所有东西最后被证明是错误的,所有东西导致了麻烦及痛苦的学习经历。”

你有何高见?

查看英文原文 Entity Services - Pattern or Anti-pattern?

2007-06-19 03:45930
用户头像

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

关注

评论

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

1500字讲懂单体架构和微服务架构的区别

Java架构历程

三周年连更

如何进一步提高AI输出质量?

石云升

AI ChatGPT 三周年连更

【程序猿未来之路】作为互联网技术人的“我们”该如何破局 | 社区征文

洛神灬殇

4月日更 AIGC 三周年征文 三周年连更 生存指南

设计一个即时群聊天系统软件(采用华为云ECS服务器作为云服务端 )

DS小龙哥

三周年连更

自动化运维工具一览

穿过生命散发芬芳

自动化运维 三周年连更

音视频八股文(9)-- flv的h264六层结构和aac六层结构

福大大架构师每日一题

音视频 ffmpeg 福大大

面对“失业焦虑”我们可以做些什么?| 社区征文

莪是男神

三周年征文

vue2.x中keep-alive源码解析以及LRU缓存策略使用

不叫猫先生

缓存 Vue LRU keep-alive实现原理 三周年连更

技术分享:如何将JSON中的日期格式字符串替换为占位符

IT蜗壳-Tango

三周年连更

Qz学算法-数据结构篇(顺序存储二叉树、线索化+遍历)

浅辄

数据结构 三周年连更

KubeShark: Kubernetes的Wireshark

俞凡

Kubernetes 云原生

为什么 Go for-range 的 value 值地址每次都一样?

AlwaysBeta

Go 面试

粉丝提问:区块链与大数据开发读研方向怎么选?

千与编程

区块链、 大数据 开源

什么是软件开发领域的 obsolete 或者 deprecated 含义

汪子熙

软件工程 软件开发 三周年连更

深入理解vue2.x中Object.defineproperty()和vue3.x中Proxy

不叫猫先生

Vue 三周年连更

Django笔记二十之手动编写migration文件

Hunter熊

Python django migration

算法题每日一练:无重复字符的最长子串

知心宝贝

数据结构 算法 前端 后端 三周年连更

Prometheus监控神器-自动发现篇

乌龟哥哥

三周年连更

Windows下 IDE工具常见编译错误FAQ下

鸿蒙之旅

OpenHarmony 三周年连更

【Python实战】Python采集代理IP信息

BROKEN

三周年连更

10分钟打造基于ChatGPT的Markdown智能文档

俞凡

人工智能

算法题每日一练:螺旋矩阵 II

知心宝贝

数据结构 算法 前端 后端 三周年连更

重磅!算能公司算丰SG2042斩获第六届数字中国建设峰会“十大硬核科技”

Geek_2d6073

如何实现网站访问量的统计?

海拥(haiyong.site)

三周年连更

C++ STL容器和算法:详解和实例演示

小万哥

c++ 容器 算法 后端 stl

Django笔记十九之manager用法介绍

Hunter熊

Python django Manager

什么是 RUM JavaScript

汪子熙

JavaScript 前端开发 三周年连更

一文了解Spring Framework 5 新 Web 框架:Spring WebFlux

Java架构历程

三周年连更

2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109

福大大架构师每日一题

golang 算法 rust 福大大

为什么说:Linux中一切皆文件?

wljslmz

Linux 三周年连更

OpenGL入门一:基础知识及概念

轻口味

opengl 图形图像 三周年连更

实体服务的模式反模式之争_SOA_Arnon Rotem-Gal-Oz_InfoQ精选文章