云账单服务

一个用于云环境的支持 SOA 的账单服务模块

云账单流程使用一套预定义的账单策略根据资源使用量数据生成账单。作者定义了一个适用于面向服务体系架构的云账单服务模块,它能够满足功能性需求(报价服务、转换函数和策略、支付方案和用户识别)和基本的非功能性需求(比如安全性、可伸缩性、标准和容错)。

Hans-Dieter Wehle, 著名 IT 专家, IBM

http://www.ibm.com/developerworks/i/p-wehle.jpgHans-Dieter Wehle 是 IBM 在云计算方面著名的 IT 专家。他是德国 Boeblingen 的 IBM R&D Design Center 的成员,具有超过 20 年的计算机行业经验,涉及领域支持、软件开发和咨询等方面。Wehle 于 1999 年加入 IBM R&D;自 2006 年以来,他主要从事绿色 IT 和云计算解决方案,参与过多个 IBM 开发项目。



2011 年 5 月 09 日

开发针对云优化的账单组件的目的是提供用于生成使用量账单的接口。云账单流程使用一套预定义的账单策略根据资源使用量数据生成账单。根据云计算策略不同,账单可以表示需要支付的真实金额,也可以是更抽象的交易表示法 — 这无所谓,因为这个账单服务没有规定必须使用某种经济模型。

本文简要讨论如何定义为面向服务的体系架构环境设计的云账单服务模块。它能够满足报价服务、转换函数和策略、支付方法和用户识别等功能性需求。它还能够满足安全性、可伸缩性、标准和容错等基本的非功能性需求。

云账单服务模块的组成部分

首先,介绍这个云账单模块的架构。然后,我将解释账单策略背后的思想以及使用的语言和语法。还要讨论规则/推论引擎及其作用,最后讨论工作流和冲突解决战略。

有效的模块:形式取决于功能

通用的云账单服务模块应该提供端口类型以支持所有功能性需求(见下一节):

  • 账单服务根据从账单策略存储库获取的策略生成账单。
  • 账单存储在账单存储库中,供经理使用。

图 1 显示会计和账单服务的基本架构。

图 1. 模块的架构
模块的架构

账单生成流程并不是自动的,需要由经理启动。服务的所有功能在一个 web 服务中实现。

图 2 显示模块的技术视图,展示各个子组件和这些不同技术之间的交互。

图 2. 模块的技术视图
模块的技术视图

这个账单服务通过一个 PHP 接口连接 web 服务器,从使用量记录 (UR) 存储库获取记录文档。

账单策略、账单语法和语言

账单策略的简单示例如下:

  • 1 CPU/h(使用小时数)等于 1 个代币
  • CPU/h 大于 20h 时优惠 20%

无论账单策略是简单还是复杂,资源经理有时候希望修改它们。提前考虑到所有情况是不可能的,每次添加新策略时都修改源代码当然也是不可行的。

一定要明确区分账单逻辑和账单策略,账单逻辑计算最终的账单,而账单策略指定如何生成账单。账单策略并不是账单服务的组成部分;它们是账单服务使用的外部元素。它们由资源经理编写并存储在一个存储库中。账单服务使用这个存储库提取必需的策略以生成最终的账单。

假设希望把前面提到的两个策略示例形式化。可以这样表示:cpu_h(x)x 个 CPU 小时,token(x)x 个代币,那么:

(1)# bill = token(cpu_h(x));
(2)# if 
         cpu_h(x) > 20
     then
         bill = bill*.8;

这种表示法能够表达这两个策略;但是,它有两个主要问题:

  • 它不是自然语言。
  • 它无法表达所有情况。

请记住,设置账单策略的人不一定是程序员,让他们编写这样的表示法可能很困难。使用比这种表示法更自然的语言表达账单策略要容易得多。

第二个问题是使用这种表示法表达许多复杂的策略非常困难。业务规则可能会非常快地变动,账单规则必须相应地改变。只能使用健壮的规则语法满足未来策略的需求。

还有两种语言可以用来描述策略;它们各有优缺点。

自然语言允许用一般的英语表达策略,比如:
When the event is VM Assignment and the client's type is Platinum, then the cost per second is 0.0002 euros.

自然语言容易使用,便于掌握。这一点对于非技术用户最有吸引力。

还可以用领域特定语言(DSL)(使用规范文档中使用的语法和语义)描述上面的策略,如下所示:
EVENT = "VM Assignment", CLIENT_TYPE = "Platinum", RESOURCE_TYPE = "BLADE Type 4", RESOURCE_AGE > 240 * 60 * 60 (seconds), SERVICE_LEVEL = "Platinum", COST_PER_SECOND = 0.0002 (Euros, Pounds, etc.)

与自然语言相比,领域特定语言(DSL)更具有结构化,更容易快速编辑和修改。

前向链

当使用根据前提返回结论的推论规则、句法规则或函数时,前向链(即数据驱动的推论)是两种主要推理方法之一,它基于肯定前件式 推论规则:如果 P,那么 Q;如果 P 是真的,那么 Q 就是真的。前向链从可用的数据开始,反复向前尝试提取更多(新的)数据,直到到达目标。(另一种方法是反向链,也就是从目标开始反向推论,检查细粒度的数据是否支持目标;这两种方法都基于肯定前件式规则,但是反向链是目标驱动的推论。)

与反向链相比,前向链的优点是新数据的获得可以触发新的推论;这让引擎能够更好地适应条件可能会变化的动态场景。

规则/推论引擎及其作用

系统中的规则/推论引擎根据系统状态或用户输入演算规则。光有策略语法是不够的:还需要通过一种机制判断策略的有效性并演算策略。这就是设计规则引擎的目的。

这里介绍的引擎是一个使用增强的 Rete 算法实现的前向链规则引擎。在这个开发阶段,我的同事和我评估了几种规则引擎,其中两种引起了我们的注意:

  • IBM 的 ACEL (Autonomic Computing Expression Language) 最初是作为 Autonomic Computing Policy Language 的组成部分开发的,用来描述策略什么时候应该应用于管理的系统。
  • 如果要想使用行业标准,就必须使用 Java™ Rule Engine API (JSR94) 作为编程接口。

通过一个简单的 web 前端输入和修改账单规则。看一下规则/推论引擎的结构。

图 3. 规则/推论引擎
规则/推论引擎

Rete 算法和模式匹配

Rete 算法(读音为 RAY-tee 或 REE-tee)是一种高效的模式匹配算法,它用于实现生产性规则系统,已经发展成许多流行的专家系统 shell 的基础。Rete 来自于 这个词的拉丁语。

Rete 算法通过牺牲内存使用量提高速度;它的速度比数据-规则检查快。数据-规则检查首先检查数据是否符合规则,如果不符合,就放弃规则,如果符合,就保留规则;然后转到下一个规则;循环/迭代回规则的开头。而 Rete 算法构建节点的网络("Rete" 部分),网络中的每个节点对应于规则的条件 "if" 部分中的一个模式。Rete 的做法是把数据-事实信息存储在工作内存中。这让系统能够共享节点中的数据以消除某些数据重复;当联结不同的事实类型时存储部分匹配(这让系统不必在每次出现变化时重新检查所有事实);当从工作内存中删除事实时,高效地删除内存元素)。

根据生产规则匹配新的或现有的事实称为模式匹配。规则引擎可以使用多种算法执行模式匹配。规则存储在生产内存中,推论引擎匹配的事实存储在工作内存中。

在修改或取消事实的地方,把事实插入工作内存中。如果系统有大量规则和事实,可能导致许多规则对于同一事实断言都是真的;这些规则是冲突的。使用冲突解决战略管理这些冲突的规则的执行次序。

工作流和冲突解决战略

在这里,工作流是指演算规则时的规则优先次序(应该先演算哪个规则?)冲突解决是指,如果多个规则的演算结果都是真,那么应该触发哪个规则。这两者都很重要,在成功的账单服务模块中必须实现它们。

接下来,简要讨论功能性需求。


账单模块的功能性需求

现在,简要地介绍在云账单模块中要考虑的功能性需求。

报价服务

云代理实例应该支持报价服务,让用户能够在使用资源之前查询报价。例如,“如果我在这个计算站点上运行某某东西,要花多少钱?” 报价不应该是固定的,应该只在短期内有效。

转换函数和策略

云代理实例必须实现一个转换函数,它根据基本的转换方案(比如一个 CPU 小时的费用等于一个代币)把使用量记录转换为代币数量,并根据经济模型和需求商定代币的实际货币价值。云代理实例应该允许资源所有者向它提供定制的转换模型,从而更好地为用户提供服务。

消费者(实体)识别流程

云代理实例必须能够识别出要为使用资源付费的实体。用户可能属于不同的虚拟组织并运行多个作业;在这种情况下,一定要识别出谁应该为哪个作业付费。另外,可能要用不同预算项目中的资金支付作业费用,例如根据资金的可用性选择预算项目。

支付方案和策略

云代理实例必须支持至少一种支付方案。例如,后付费、预付费(比如在预订服务时付费)或连续付费方案。

云服务在定价方面应该具有灵活性(可以随时间变动),应该有不同的价格表,比如使用量费用、固定费用、一次性费用和折扣。策略可以像下面这样:

EVENT = "VM Assignment", 
CLIENT_TYPE = "Platinum", 
RESOURCE_TYPE = "BLADE Type 4", 
RESOURCE_AGE < 240 * 60 * 60 (seconds), 
SERVICE_LEVEL = "Platinum", 
COST_PER_SECOND = 0.0002 (Euros)  

EVENT = "ONE_OFF SERVICE 1", 
RESOURCE_TYPE = "BLADE Type 4", 
ONE_OFF_COST = 1

基本的非功能性需求

为了满足云账单模块的基本非功能性需求,模块应该至少具有以下功能:

  • 保证事务的安全性。
  • 基于角色的身份验证。
  • 通过审计跟踪进行活动分析。

尤其是,必须采取措施防止没有经过身份验证或授权的客户或冒名顶替者发送事件或触发账单流程。


结束语

通过分析一个云环境账单模块,您了解了在开发自己的云账单模块时应该考虑的一些事项。我解释了这个模块如何适应会计和账单服务,以及它如何适应整个云基础设施。您看到了账单策略的示例以及语法和语言,了解了规则/推论引擎的工作原理。我还简要介绍了对于账单模块需要考虑的功能性需求和基本的非功能性需求。

参考资料

学习

获得产品和技术

  • 在 IBM Smart Business Development and Test on the IBM Cloud 上查看可用的 产品映像

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing, SOA and web services
ArticleID=657817
ArticleTitle=云账单服务
publish-date=05092011