和Google互补的搜索引擎Wolfram|Alpha
Wolfram|Alpha与Google究竟是什么关系,Wolfram|Alpha自己是如何定位的?Wolfram|Alaph在多大程度上是语义网搜索呢?InfoQ中文站就等等这些问题采访了Wolfram研究公司中国区商务经理王翔。

作者 Boris Lublinsky 译者 张善友 发布于 2008年6月16日 上午3时29分
虽然Windows workflow是实施业务流程处理的一个优秀框架,但它却缺乏对人工活动的直接支持。 微软虽然发布了 [1、2]几种方法来解决这个问题,但这些方法却显得不够通用。本文将定义一种完全通用的方法,在WF中实现对人工活动的支持。
支持人工交互的复杂性带来众多的挑战,如下所列,可见一斑:
业界已经认识到了这些问题,并制定了两个主要的规格来解决这些问题 [3、4]。我们将根据以下思想来构建人工活动的实现,而不是纸面上的规格说明书。
整体解决方案的主要组件如图1所示。
图1 解决方案组件
解决方案的核心是一个工作队列管理器。这是一个集中的服务,负责跟踪系统所有用户的所有任务。任何需要人工交互活动的工作流程(或者服务/应用程序所包含的工作流程),都去调用一个自定义的工作流活动[5],以通过它将请求提交到工作队列管理器,并对其进行持久化,同时允许系统的其他组件与这些请求一同协作。这样,工作队列管理器就成为了工作流引擎和人工活动执行之间的解耦层。在工作流执行期间,如果用户并不存在于系统中,这种方法同样提供了支持。同时,工作队列管理器通过形成的集中服务,可以将所有任务与指定的用户结合,而不用考虑是从哪里初始化的流程。因为不同的用户任务可以要求不同的输入信息以及产生不同的输出,工作流和人工活动之间的通信采用了XML进行输入输出,从而可以处理任何可能的请求和响应。虽然使用XML似乎会增加实现上的复杂度,但.NET对XML序列化的良好支持,使得XML和对象之间的映射易如反掌。工作队列查看器是一个GUI应用程序,允许用户直观地查看输入的已经准备就绪的所有任务。该应用程序是通用的,仅仅显示了任务的基本要素,包括名称,类型,优先级,创建者等等。根据队列中的这些信息,用户可以决定执行某一项特定的任务。任务的实际处理过程是通过一个在功能上支持给定任务的任务应用程序来完成的。一个工作流队列管理应用程序提供了一个用户界面,用来支持对工作队列管理器的管理。它可以查看和修改现有的人工任务,查看它们的历史记录等。最后,一个人工活动就是一个自定义活动(参看边栏“Windows Workflow Foundation 组件模型”,它实现了与任务队列管理器的通信,并为工作流开发人员展现了一个非常简单的针对人工任务执行的编程模型。从人工交互的角度来看,这与常规的服务调用并无二致。
Windows Workflow Foundation 组件模型
正如[11]所描述的,Windows Workflow Foundation (WWF)的实现不同于当下主流工作流实现的可执行工作流语言(域语言)。在WWF中,“过程图中的活动关联了一个实现该活动运行时行为的组件,组件由一种通用编程语言实现。过程语言中的每一个活动都对应一个实现组件。例如,一个Web服务调用活动,一个人工任务活动或一个电子邮件活动都对应一个实现组件 ”。
因此,我们能够非常容易地通过引入新的活动类型扩展WWF,以实现特定情况下的(在我们的案例中,就是人工任务的活动)运行时行为,通过实现新的活动这种方法,使得构建或者扩展现有的过程语言非常简单。
组件之间的整体交互如序列图所示(图2)

图2 序列图
我们可以看到,上面的整体解决方案里包含两种类型的组件:
本文只讨论通用组件的解决方案。
正如我们在前面所定义的那样,工作队列管理器是一个集中的服务。它的功能基于数据契约,如图3所示。
图3 工作队列管理器数据契约
这个数据模型的主要组件包括:
图4 任务状态迁移图
当任务提交到工作队列管理器中时,它的状态是Ready。一旦应用将请求提交,状态就迁移到Ready状态,而在应用程序处理完任务之后,任务状态则迁移到completed状态,它标志着工作队列管理器将任务完成的响应信息返回给人工活动。如果任务被取消或者超时,任务则退回到Ready状态。除了数据类型,数据模型还定义了故障数据类型,参见图5。

图 5 故障数据类型
工作队列管理器公开了三组服务──工作流服务,用户服务和维护服务。
工作流服务节(图6)定义了一个服务,人工任务活动可以利用它为一个执行提交一个任务,同时还定义了一个工作流服务公开的接口,该接口被工作队列管理器用来标识执行完成。这两个服务提供了人工活动之间的集成,并运行在工作流和工作队列管理器中。

图 6 工作流服务
提交给由工作队列管理器实现的执行服务,从作为不同工作流其中一部分的人工活动处接收请求。一旦接收到请求,就会存储到数据库里做进一步的处理。
completeExecution契约虽然在此处定义,但却是在工作流中实现的。这个服务用于通知工作流一个特定任务的执行已经完成,工作流可以执行了。
用户服务(图7)用于支持用户与工作队列管理器之间的交互。WorkWithItems 服务支持三种操作:
图 7 用户服务
维护服务(图8)用于支持工作队列管理器的维护应用程序。
图8 维护服务
查看任务方法使用MaintenanceQuery 数据类型定义的过滤器返回现有任务的一个列表。在看到任务之后,这些任务可以被修改和改变,可以通过更新任务方法将任务返回给工作队列管理器。
服务的数据库设计(图9)包含表,以及用于持久化与人工任务相关的所有信息的必要内容。主表为人工任务表,包含了所有人工任务的基本信息,包括任务名称,ID(由服务分配),优先级和任务生命周期事件,以及规定执行事件的主体和时间的补充信息。
图 9 工作队列管理器数据库
额外的表包含任务的额外信息,包括:
为了优化数据的访问,我们还实现了几个存储过程和视图。存储过程是:
AddTaskCallback 存储过程能够添加回调信息和分配人工任务(使用下面的InsertTaskCallback存储过程)。它首先检查是否已经有回调存在,如果存在则使用存在的回调记录,否则在Callback表中创建一个回调记录,然后调用InsertTaskCallback 存储过程创建一个连接。 InsertTaskCallback存储过程用于生成TaskCallback表,这样就能够创建给定回调与人工任务之间的关系。 AddTaskType存储过程用于添加任务类型信息和关联它与给定人工任务的关系(使用下面的InsertTaskTypeTask存储过程)。它首先检查是否已经存在任务类型,如果存在则使用存在的任务类型记录,否则在TaskType表中创建一条新的记录,然后调用InsertTaskTypeTask创建一个连接。 InsertTaskTypeTask存储过程用于生成TaskTaskType表,这样就能够创建给定任务类型和人工任务之间的关系。 AddTaskPotentialOwner 存储过程负责添加潜在用户信息,以及将用户信息与给定的人工任务建立关联(使用下面的InsertTaskPotentialUser存储过程)。它首先检查是否存在一个潜在的用户,如果存在则使用已经存在的用户记录,否则在PotentialUser表中创建一条记录,然后调用InsertTaskPotentialUser创建一个连接。InsertTaskPotentialUser存储过程用于生成TaskPotentialUser表,这样就能够创建用户和人工任务之间的关系。使用这些存储过程通过两方面的因素减少了数据库的访问次数,同时通过消除重复数据以减少数据库的数据量。
数据库视图(图10)简化了数据库数据的读取。分配给用户的所有任务信息(包括任务类型)可以从单个视图获得。
图 10 完成任务视图
持久层类图实现了仓储模式(repository pattern),参见图11。
图 11 持久层类图
服务的整体实现非常直接。一旦某个特定方法被调用了,它就会执行委派给实现了所有必须的数据库访问的仓储类(图11)。
人工活动是一个实现了人工交互的自定义工作流活动。这个活动隐藏了工作流设计器与工作队列管理器的通信,并允许象调用普通服务那样处理用户交互。
这个活动的实现基于工作流队列[7] 提供的活动同外部交互的异步通信:活动注册到队列的接受消息中,服务则通过队列发送消息。一个自定义活动可以使用这个模型处理外部事件以及与异步活动执行完成的通信。它允许一个活动执行到一个点,然后等待触发使得它可以继续执行。这种实现的整体交互参见图12。
图12 使用工作流队列实现活动
一旦启动,只要允许,活动执行就会继续。随着到达需要外部执行的活动点,活动就会注册到工作流队列中。然后工作流实例进入等待状态,并可能会被钝化(持久化)。一旦外部执行完毕,它就会将信息压入到队列中。此时,运行时就可以重新激活工作流,继续执行。
人工活动的实际实现包含两部分──活动本身和一个回调服务。
一个人工活动发送一个消息到人工任务管理器去启动一个新的人工任务开始处理。如果该服务的调用是成功的,活动会将自身注册到工作流队列中,并进入等待状态。如果执行服务出现任何错误,活动会抛出一个工作流故障,它能够被工作流处理。
当服务接收到答复时,它会将回复消息压入活动的工作队列中。队列消息唤醒一个活动,弹出回复消息并完成它的执行。
回调服务实现完成执行契约(图6),同时必须被一个实现了工作流的服务/应用程序所启动。为了使服务正确工作,WorkflowRuntime必须被设置,可以使用executionComplete类的一个公共静态变量来实现。
人工活动的执行需要几个参数 - 任务类型,优先级等等。这些参数被定义为DependencyProperty[8]。暴露的DependencyProperty 可以被工作流设计器设置 [9],从而使得设置活动参数可视化,而无需编程(参见图13)。
图13 配置活动参数
一个工作队列查看器是作为一个用户控件(图14)实现的,可以将它放到任一表单中。该控件使用了一个dataview控件,并接收一个委托作为参数。当行的任意单元格被点击,委托就会传递一个任务ID和任务类型而被调用。图14显示了一个简单的委托,弹出一个消息框。
图 14 工作队列查看器
尽管推动了业务流程的完全自动化,但人工活动依旧不可或缺,并仍然会在业务流程实现上继续扮演着重要的角色。正如我们在文章前言一开始所定义的那样,引入用户的交互会带来许多额外的关注点,这些关注点与工作流的实现没有直接的关系。本文介绍的彻底解耦的实现方法,能够将工作流开发与用户交互开发之间的关注点进行分离。此外,在人工任务管理器中对人工任务支持的集中化减少了对给定用户的任务管理的聚合。
非常感谢 Paul Rovkah 和 Rob Sheldon 为本文提供的帮助。
1 Jeremy Boyd. Integrating Windows Workflow Foundation and Windows Communication Foundation. MSDN January 2007.
2 Windows Workflow Foundation Web Workflow Approvals Starter Kit?. Microsoft Downloads.
3 Web Services Human Task (WS_HumanTask).
4 WS BPEL extensions for People.
5 Matt Milner. Build Custom Activities To Extend The Reach Of Your Workflows MSDN Magazine, December 2006,
6 Dare Obasanjo XML Serialization in the .NET Framework. January 2003,
7 Serge Luca. Using the Windows Workflow Foundation Queuing system.
8 Glenn Block Attached Properties and the Workflow Designer.
9 Dennis Pilarinos. Getting DependencyProperty RegisterAttached properties to appear in the Property Browser redux.
10 B.Lublinsky, Implementing a Service Registry for .NET Web Services. January 2008, InfoQ,
11 Tom Baeyens. Process Component Models: The Next Generation In Workflow? February 2008, InfoQ.
Wolfram|Alpha与Google究竟是什么关系,Wolfram|Alpha自己是如何定位的?Wolfram|Alaph在多大程度上是语义网搜索呢?InfoQ中文站就等等这些问题采访了Wolfram研究公司中国区商务经理王翔。
Vijay Narayanan在这篇文章中对数据服务的几个方面进行了介绍,它们都是SOA实践者和数据架构师感兴趣的内容。本文对数据服务的几个方面进行了介绍,包括需求定义,基本原理和好处、范围、开发以及消费模式。
罗马不是一天建成的,豆瓣的技术架构也是随着用户规模的增长一直在持续变化中。在本次演讲中,豆瓣的首席架构师洪强宁将与大家一起分享从上线时的单台服务器架构开始一直到现在的豆瓣架构变迁历程。
Billy McCafferty展示了S#arp架构,它在ASP.NET MVC框架的基础上,荟萃了当今的最佳实践,应用在ASP.NET Web应用程序的架构设计中。
中国作为新兴市场中的新兴市场,是Sun在美国之外实施SSE(SUN Startup Essentials)项目重点关注的地区。在QCon Beijing 2009期间,InfoQ中文站有幸对此项目的负责人王雷先生进行了采访,探讨了关于开源、新兴市场、SSE等话题。
HTML5 是由 WHATWG发起的,最开始的名称叫做Web Application 1.0,而后这个标准吸纳了Web Forms 2.0的标准,并一同被W3C组织所采用,合并成为下一代的HTML5标准。
没有回复
关注此讨论 回复