用于对事件进行计费的函数模型的制作方法

xiaoxiao2020-9-10  6

用于对事件进行计费的函数模型的制作方法
【专利摘要】提供了用于实现计费引擎的技术,所述计费引擎对关于使用信息的事件进行处理,所述使用信息关于由产品/服务的客户所使用的产品或服务。所述计费引擎表示对象的连接图,该对象的函数将接受输入(如果必要的话)、执行一个或多个操作、并且产生用于确定要执行哪个另一对象的结果。所述输入可以包括关于“事件”的信息,所述“事件”指示特定客户对于产品/服务的使用信息。因为确定对于一些事件的适当响应并不需要执行全部的对象,所以可以使用许多计算资源来对后续事件进行处理。
【专利说明】用于对事件进行计费的函数模型

【技术领域】
[0001]本发明涉及对反映客户对服务或产品的使用量的事件进行计费。

【背景技术】
[0002]“计费”通常是指确定产品或服务使用的成本或价格的过程。计费还可以是指分配或共享费用和变更(或折扣)。例如,许多电信运营商允许客户(或订户)选择特定计划(Plan),所述特定计划可以是预付费计划或后付费计划,诸如包月或包年计划。客户对于电信运营商提供的服务的任何使用被报告给计费引擎。计费引擎可以由运营商或第三方维护。计费引擎基于客户的计划和客户的使用来计算向客户收取的金额或多少钱以报告给客户的账户。所述金额可以从总剩余使用金额扣除(例如,按分钟或千兆字节)。
[0003]在电信背景下,计费引擎可能考虑多种因素,诸如使用的时间(例如,在7PM太平洋标准时间之后)、使用的持续时间(例如,5分钟呼叫)、呼叫的目的地(例如,内陆、海外、朋友或家人)、以及呼叫的起源或呼叫者的位置(例如,移动网络漫游)。在互联网背景下,因素可以包括下载内容的量(例如,5千兆字节)、流传输内容的类型、内容的质量、以及下载的时间。
[0004]计费计划正在变得越来越复杂,并且频繁改变。计费引擎因此必须被配置为对照这样的复杂的不断变化的计费计划对使用信息进行处理。通常,计费计划设计者(例如,电信运营商的雇员)在显示用户界面的用户终端(例如,台式计算机、膝上型计算机或平板计算机)上提供输入。该输入反映一套规则,该规则用于计算使用量(例如,按分钟、货币或数据使用)以跟踪用户的使用。用户界面接受该输入,并且可以产生反映该输入中所反映的所有规则的XML文档(或表格格式的其他文档)。这样的以数据为中心的表示的一个问题是,它们不适合于表达计费计划。单单这样的表示不能容易地表达计费计划的函数方面,诸如如果-则-否则(if-then-else)条件。结果,常规的计费引擎需要实现如稍后描述的对数据进行处理的附加函数模块(诸如一组模块、硬编码逻辑器或规则引擎)。
[0005]“事件”是响应于客户使用产品或服务而产生的数据。例如,当客户结束电话呼叫时,事件被创建。另外,当客户开始呼叫时,以及可选地,在呼叫期间的一个或多个时刻,事件也可以被创建。
[0006]计费引擎可以实时地或离线地对事件进行处理。当客户例如发起呼叫或者访问互联网时,通常要求实时处理,并且计费引擎需要实时地授予访问权,以使得客户使用服务不需等待。产品或服务提供商(诸如电信运营商)由于至少两个原因期望实时地(或者尽可能快地)对某些事件进行处理:收益漏损和机会损失。收益漏损是指允许客户的使用量多于该客户有权享用的使用量。机会损失是指当客户有权享用使用量时未将该使用量授予客户。例如,在预付费电话背景下,客户使用电话进行沟通的分钟数有限。客户与其订立合同或向其订阅的电信运营商不想客户使用的分钟数多于该客户有权享用的分钟数(即,基于客户的合同)。因此,如果客户已经“用完”他/她的分钟数,则电信运营商不想允许客户在没有首先为额外分钟数付费的情况下发起另一个呼叫。为了防止客户超额使用他们的分钟数,电信运营商可以拒绝使用请求,并且等待尚未计费的所有事件被计费。然而,对所有尚未支付的事件进行计费可能花费时间,并且对于有权享用服务的客户拒绝该服务将导致欠佳的客户满意度。对于运营商,该机会损失转化为金钱损失。
[0007]另举一例,在后付费电话背景下,客户不想晚一天或更多天才发现她不仅“用完了 ”她的分钟数,而且她还超过了她的限额大约一个小时,该超额以明显更高的费率收费。因此,必要的是,尽可能快地对事件进行处理,以使得客户对于产品或服务的使用量不会多于该客户有权享用的使用量,并且类似地,使得不会在客户有权享用的范围内阻止该客户使用产品或服务。
[0008]一些事件可以进行离线处理(诸如每月结算)。这些事件不需要实时处理。然而,电信提供商需要及时地生成账单。例如,提供商可能必须在每月的第一天产生数亿张账单。快速计费引擎将提供更好的用户体验(按时生成账单),并且可以防止提供商不得不买进昂贵的服务器基础架构(因为需要更少的服务器来对所有事件进行处理)。对于实时的在线处理,不能及时地(例如,在几毫秒左右)对事件进行处理可能引起超时、错误、故障等。为了避免系统的彻底崩溃,当系统超载时,提供商允许系统在降级模式下运行。在这种模式下,基于一些配置的策略,系统可以生成服务的悲观拒绝(机会损失)、或服务的乐观授权(收益漏损)。
[0009]然而,当前对事件进行处理的方法证明是有缺陷的。在一种方法中,计费引擎包括一系列的多个(例如,插件)模块。对于客户的每个使用事件,这些模块均被配置为基于该事件和客户的计费计划来做出某一决策并且将结果提供给该系列中的下一个模块。例如,在对电话呼叫进行计费时,一个模块可以被配置为检查当前日期是否是客户的生日,另一个模块可以被配置为确定呼叫目的地是否在客户的“朋友和家人”群组中,如果是,则确定该呼叫的费率是多少钱,并且另一个模块被配置为确定在当天中的时间,并且犹如不存在例外那样对呼叫进行计费,所述例外诸如生日、或目的地是某些朋友或家人。然而,使用这样的方法有许多缺点。例如,每次所述系列中的一个模块完结并且执行另一个模块时,必须执行背景切换。另举一例,即使一些模块可能不是必要的,也执行所述系列中的每个模块。因此,必须利用可以用于对后续事件进行处理的计算资源(例如,CPU周期和存储器)来对当前事件进行处理。当在短时间窗口内创建了数十万个事件时,这样“浪费”的计算资源变得极其珍贵。
[0010]在另一种方法中,计费引擎包括对照其对事件进行评估的一大套规则。换句话讲,对于在计费引擎处接收的每个事件,计费引擎对照每个规则对该事件进行评估。然而,对于许多事件,对照每个规则对每个事件进行评估可能不是必要的。例如,如果对照单个规则对事件的评估导致确定客户将不被收费,则对照该套规则中的每个其他规则对该事件进行评估是不必要的。同样,在该方法中,计算资源被浪费。
[0011]在另一种方法中,不是使用一系列模块或一大套规则,计费计划是“硬编码的”,因为在单个软件模块中反映计费计划。然而,服务提供商期望提供不同计费计划的灵活性,以便对变化的市场状况做出响应。因此,硬编码的解决方案可以仅在短时间段内是相关的,在该时间段之后,它可能被淘汰。对于每个新的计费计划提供硬编码的解决方案将是昂贵的且冗长乏味的。此外,大多数产品和服务提供商期望对于创建和测试计费计划有控制权。然而,要求这样的提供商为每个计费计划编写源代码是不合需要的。
[0012]本章节中所描述的方法是可以寻求的方法,但是不一定是以前已经设想过或寻求过的方法。因此,除非另有指示,否则不应仅因本章节中所描述的任一方法包括在本章节中就假定该方法够格作为现有技术。

【专利附图】

【附图说明】
[0013]在附图中:
[0014]图1是描绘计费图表的框图,计费图表图形化地表示根据本发明的实施例的示例计费计划函子(functor);
[0015]图2是描绘根据本发明的实施例的用于对事件进行处理的过程的流程图;
[0016]图3是描绘根据本发明的实施例的包括多个函数对象的计费计划函数对象的示例性存储器表示的框图;以及
[0017]图4是例示在其上可以实现本发明的实施例的计算机系统的框图。

【具体实施方式】
[0018]在以下描述中,为了说明的目的,对许多特定细节进行了阐述,以便提供本发明的透彻理解。然而,将显而易见的是,可以在没有这些特定细节的情况下实施本发明。在其他情况下,为了避免不必要地模糊本发明,以框图形式示出公知的结构和装置。
[0019]概述
[0020]提供了用于对指示客户对服务或产品的使用量的事件进行计费的技术。计费计划用包括多个函数对象的计费图“函子”(或函数对象)表示。计费计划函子中所表示的逻辑可以被视为决策(例如,二叉)树。关于事件的信息输入到产生结果的函数对象之一(例如,“根”节点)。该结果可以决定接着执行所述多个函数对象中的哪个函数对象。为了产生最终结果而执行的一组函数对象可以少于计费计划函子中的所有函数对象。实施例提供了描述计费计划的函数方法=DSL表达使得易于表示构成计费计划的数据和函数两者(诸如条件和结果)。
[0021]尽管本文中提供的例子涉及接收响应于用户使用一定量的服务或产品而产生的使用事件并且对这些使用事件进行处理,但是本发明的实施例不限于此。例如,事件可以是系统事件,诸如每月记账周期事件。响应于接收到这样的系统事件,本文中所公开的事件处理系统对该系统事件进行处理,并且可以确定并返回与例如每月计费、加上税费和其他杂费相应的费用。
[0022]领域特定语言
[0023]DSL是专用于特定问题领域的编程语言或规范语言。如果该语言使得可以比现有语言所允许的表达更清楚地表达特定类型的问题或解决方案,则创建DSL(用支持它的软件创建)是值得的。创建DSL的一些目的可以包括DSL有表现力、简明、可扩展、易于测试、并且专门针对对计费事件进行评估进行优化。
[0024]与此相反,当前用于表达计费计划的技术涉及包括用户界面的系统,在该用户界面中,用户可以在不同字段中输入值。字段和字段值反映计费计划的规则。用户界面接受输入,并且产生反映计费计划的(相对)大的XML文档(或其他表格表示)。这样的用户界面对于用户是需要的,因为一般的数据表示(例如,XML或表格表示)不适合于描述计费计划。相反,这样的数据表示趋向于冗长,并且缺乏表现力。在运行时期间,计费引擎的一个或多个模块访问例如XML文档,对其中所包含的XML数据进行分析,并且根据该XML数据中所反映的规则对事件进行计费。
[0025]在DSL用于计费计划的情况下,因为DSL如此有表现力,所以不需要作为转译层的UL.此外,单个DSL表达可以描述计费计划的数据和规则两者,在以数据为中心的表示的情况下这是困难的(如果有可能的话)。另外,用于DSL表达的运行时模型可以包含数据和函数逻辑两者,而用于以数据为中心的表示的运行时模块通常仅包含数据。另一方面,以数据为中心的运行时模型的运行时处理通常比较慢,而且未被优化,因为这样的模块要求附加系统来运行函数逻辑。所述附加系统对于用以数据为中心的表示表达的每一个计费计划通常是相同的,且因此,未被优化。
[0026]根据实施例,创建领域特定语言(DSL),并且使用该DSL来表达计费计划。DSL的词汇可以限于捕捉核心计费概念的那些词语。DSL的表现力应足以使得程序员和领域专家都能快速地学习。DSL声明的例子如下:
[0027](dayOfYear = = ibirthday) = > IinearRate (0.00) +
[0028](OcalledId <:ifriendsAndFamily) = > IinearRate(0.01) +
[0029][20:00:00,07:00:00] => IinearRate (0.02) | +
[0030]IinearRate (0.05)
[0031]该DSL声明中所使用的词汇是特定于计费领域的。例如,“dayofYear”是返回当年的当天的单元素集(singleton) ;“@birthday”是确定与当前被处理的事件相关联的客户的生日的更复杂DSL的别名;“linearRate”是接受输入参数值(例如,“0.00”)并且产生作为输出的值的函数,其中,该值表示向客户收取的金额。“= >”符号指示,如果前一表达式为真,则对后一表达式进行评估。“I+”符号指示,如果前一条件(例如,“(dayOfYear=ibirthday)")为假,则要使用DSL声明中的后一表达式对事件进行处理。“|+”符号还指示,前一条件可以部分为真,并且要用后一表达式对事件进行处理。例如,客户在其生日那天在11:55PM呼叫朋友,并且该呼叫持续10分钟。根据以上示例DSL声明中所反映的计费计划,呼叫的头五分钟是免费的,最后五分钟将根据第一个“I+”符号之后的表达式进行计费。
[0032]通过创建专用于表达计费计划的DSL,实现了许多益处。一个益处是,使DSL声明的设计者或创建者免受事件处理系统的内部构件的影响。另一个益处是,该语言(a)比撰写反映计费计划的XML文档更加具有表现力,并且(b)比编写用于计费计划的硬编码实现的源代码(例如,Java)更加具有表现力。另一个益处是,测试DSL声明比测试代码容易得多。
[0033]DSL声明可以由用户诸如计划的设计者编写。另外地或可替代地,DSL声明可以自动地基于通过被设计为接受反映计费计划的输入的用户界面接收的用户输入产生。该输入可以直接转换为DSL声明,或转换为中间格式,诸如XML,然后从该中间格式转换为DSL声明。
[0034]以下是用于创建来表达计费计划的DSL的示例词汇:
[0035]运算符:+、_、〈、>、==、1、&&、3、〈:、I+、I 1、!、= >
[0036]单兀素集:start、end、dayOfYear、dayOfWeek、dayOfMonth、quantity、TRUE、FALSE
[0037]其他函数:linearRate、fixedRate、fail、localDate、date、getObject、getBigDecimal、getBoolean
[0038]别名:@birthday、idateOfBirth> iqos> OfriendsAndFamiIy、 Obalance、 @inputValue、OoutputVolume、OcellHomelds、OcalledlD、OcellId
[0039]运算符接受作为输入的一个或多个运算元,这些运算元可以是函数本身。单元素集是不需要来自事件的数据来产生输出的函数。“其他函数”是需要作为输入的来自事件的数据或关于事件的数据以产生输出的函数。
[0040]在实施例中,被创建用于表达计费计划的DSL是可扩展的。换言之,可支持附加函数,只要用于DSL的DSL解析器扩展到支持新词汇即可。类似地,DSL在创建别名时可以是可扩展的。以上示例DSL声明包括别名,其解决更复杂的DSL表达。例如Obirthday可以是“get0bject( uRatingContext#customer/birthday/toString ? MMdd”)”的别名,其中,getObject是以上“其他函数”的例子。随着函数变得更复杂,可以将别名添加到DSL以简化DSL声明的组成。
[0041]计费计划函子
[0042]根据实施例,DSL解析器接受作为输入的DSL声明,对该声明进行解析,并且产生计费计划函子,该计费计划函子可视为决策树,该决策树从概念上表示DSL声明定义的计费计划的函数逻辑。因此,DSL声明用其自己的语言使计费计划函子“模型化”。事实上,决策树中的每个逻辑表达(不管该表达是返回布尔值,还是对事件进行计费)可以直接与相应的DSL声明中的表达相对应。因为DSL语法非常类似于如何看待计费计划函子,所以设计者应易于使用DSL。
[0043]作为决策树,计费计划函子可视为有序函数集。每个函数可以被实现为对象,诸如函数对象。函数对象,也称为“函子”,是允许如同对象是普通函数那样调用该对象(通常通过相同的语法)的计算机编程结构。以上示例词汇中所指示的每个函数(例如,运算符、单元素集、其他函数和别名)可以被实现为函子。对于别名,在解析时,DSL解析器基于别名来识别关于该别名的一个或多个函子和输入,并且产生所述一个或多个函子。
[0044]在实施例中,计费计划函子是二叉树,其中,每个节点最多具有两个子节点(在本文中称为“右子节点”和“左子节点”)。从父节点到右子节点的连接可以用“= >”运算符函子来建模,从父节点到左子节点的连接可以用“ I+”运算符函子来建模。DSL解析器产生函子,该函子是作为DSL声明的一部分的所有函子的组合。
[0045]计费计划函子的非叶节点被认为是评估为(完全地或部分地)真或假的谓词函子或条件函子。谓词函子所表示的条件可以是任何条件。这样的条件可以基于呼叫目的地、何时发出呼叫、以及呼叫持续多久。例如,条件可以是关于要计费的量的全部或部分的,该量可以是持续时间,诸如“([20:00:00,07:00:00]) ”。非叶节点充当它们各自的两个子节点的守卫。谓词节点的右子节点可以接收作为输入的其上谓词为真的量。谓词节点的左子节点可以接收作为输入的其上谓词为假的量。谓词节点的每个子节点要么是叶节点,要么是另一个非叶(或分支)节点,它们均被认为是计费函子。
[0046]叶节点是计费函子,该计费函子对作为输入给予叶节点的量进行计费,并且返回结果,该结果通常包含该量的费用(加上,例如,与该费用相关的一些其他信息,诸如总账分配、税码等)。例如,可以对“ IinearRate (0.01) ”产生计费函子。分支节点也可以被认为是计费函子,虽然是多个函子的组合共同充当计费函子。例如,以下可以被认为是计费函子:“ [20:00:00,07:00:00] = >linearRate (0.02) +IinearRate (0.05) ”。此外,作为整体的计费计划函子可以被认为是分支(或树),该分支(或树)也是计费函子。执行计费计划函子的结果是由对每个执行的叶节点进行评估而产生的所有费用的聚合(所有单个计费函子结果的列表),该聚合可以是计费计划函子中的所有叶节点的子集。
[0047]在实施例中,节点之间的连接也是函子,这些函子在本文中被称为运算符函子。运算符函子的非限制性例子包括“ +>”和“==”。例如,“= >”是采用左侧运算元(例如,谓词函子)和右侧运算元(例如,计费函子)的二元运算符函子。换句话讲,如果谓词函子(或左侧运算元)为真,则执行计费函子(或右侧运算元)。如果左侧运算元(或谓词函子)为真,则计费函子的评估将返回一个量(例如,持续时间)的费用。
[0048]另举一例,“I+”是二元运算符函子,其充当聚合器并且采用两个计费函子:左侧(或简单地,“左”)计费函子和右侧(或简单地,“右”)计费函子。该二元运算符函子对左计费函子生成的费用进行评估,如果量未被完全计费,则该二元运算符加上右计费函子生成的费用。基于上述,这样的函数方法使得可以递归地组合函子以生成更复杂的函子。为了表现力的目的,DSL解析器被设计为接受看起来更像数学方程的结构,而不是不可读的递归函数调用。
[0049]在实施例中,函子是不可变对象,即,其状态在其创建之后不被修改。在一些情况下,即使一些内部使用的属性改变,但是从外部视点来看,对象的状态表现为没有改变,则该对象被认为是不可变的。例如,使用存储器来高速缓存大量计算的结果的对象仍可以被认为是不可变对象。因此,如果用某一输入调用特定函子,则可以将用该输入执行该函子的结果与该函子相关联地高速缓存或存储(或高速缓存或存储在函子中)。因此,下一次调用具有该输入的函子(例如,在可以由不同客户发起的另一个事件的背景下),读取结果,而不执行函子的逻辑。该结果也可以作为输入传送到另一个函子。不可变对象的其他优点包括:不可变对象易于共享,而且是可组合的,并且是线程安全的。
[0050]因此,计费计划函子是包含对事件进行计费的所有逻辑和数据(不同于所需的来自事件本身的数据)的函数对象。与常规的运行时方法相比,包含所有逻辑和数据的这个特征是另一个优点,即,函数运行时模型使得计费计划是一个可执行对象。常见方法仅考虑计费计划的数据表示,并且要求单独的计费引擎对计费计划进行评估。这样的引擎仅使用计费计划作为规范。在本文中所描述的实施例中,计费计划函子本身是引擎。
[0051]图1是描绘示例性计费图表100的框图,示例计费图表100图形化表示根据本发明的实施例的计费计划函子。叶节点表示可以针对给定事件计算的不同的可能的费用。计费图表100中的每个节点对应于函子。具体地,函子110回答问题“今天是客户的生日?”如果该问题的回答是“是”,则执行函子120,这确保不向客户收取使用费用。如果该问题的回答是“否”,则执行函子130。
[0052]函子130回答问题“客户正在呼叫朋友或家人? ”如果该问题的回答是“是”,则执行函子140,函子140每分钟计算$0.01的费用。因此,如果客户向认识的朋友或家人发起呼叫并且该呼叫持续10分钟,则函子140确保在客户的账户上反映$0.01的费用。如果该问题的回答是“否”,则执行函子150。
[0053]函子150回答问题“他正在高峰时间进行呼叫? ”如果该问题的回答是“是”(至少在该呼叫的持续时间的一部分内),则执行函子160,函子160每分钟计算$0.05的费用(至少在该呼叫的持续时间的在高峰时间的部分内)。如果该问题的回答是“否”(至少在该呼叫的持续时间的一部分内),则执行函子170,函子170每分钟计算$0.02的费用(至少在该呼叫的持续时间的不在高峰时间的部分内)。在任何一种结果中,各个函数确保在客户的账户上反映适当的费用。
[0054]对事件进行处理
[0055]图2是描绘根据本发明的实施例的用于对事件进行处理的过程200的流程图。过程200由事件处理引擎执行。过程200可以通过单个处理执行,或者200的不同步骤可以通过不同处理或同一处理的不同线程执行。
[0056]在步骤210,接收指示客户的使用的事件。
[0057]在步骤220,识别表示计费计划的计费计划函子。如果存在多个计费计划,则首先从所述多个计费计划之中选择适当的计费计划函子。
[0058]在步骤230,执行计费计划函子所指示的第一函子,以产生第一结果。第一函子可以表示计费计划函子中的根节点。
[0059]在步骤240,第一结果将确定接着执行哪个函子。可以存在在对该结果进行评估之后接下来调用的两个或更多个函子(取决于计费计划)。例如,如果执行计费图表100中的函数I1的结果是布尔真值,则执行函子120 (其不需要输入)。如果执行函数110的结果是布尔假值,则执行函子130 (其需要关于发起事件的客户的输入)。
[0060]在步骤250,执行计费计划函子所指示的第二函子,以产生第二结果。第二结果可以是布尔值,或者例如,整数值。例如,如果第二函子对应于函子130,则第二结果是布尔值。如果第二函子对应于函子120,则第二结果是整数值。
[0061]在步骤260,基于第二结果来确定向客户收取的金额。在示例计费图表100中,执行函子160或函子170的结果被认为是“基于”执行函子130的结果,即使执行函子130的结果是布尔值。函子160或函子170的执行取决于执行函子130的结果指示假值的事实。
[0062]尽管该示例仅提及了函子评估,但是实施例可以包括响应于单个事件的更多函子评估。
[0063]使用计费计划函子(S卩,由一组函子组成)对事件进行计费(不管是使用事件,还是系统事件)的优点包括可组合性和降低的复杂性。由于对象的“平”类分层结构,实现降低的复杂度(相对于目前用于对使用事件进行处理的方法而言)。换句话讲,计费计划函子中的每一个对象可以是函子。在不同函子之间不存在继承。
[0064]关于可组合性,可以将函子与其他函子组合以形成表示特定计费计划的更复杂规则的分支或树。因此,复杂的计费计划函子可以由多个“简单的”函子组成(或构成)。可组合性优先于继承,这是面向对象的程序设计的特征,并且提高了复杂度。
[0065]计费计划函子综合利用数学性质,诸如交换性(即,改变运算元的顺序不改变最终结果)、结合性(即,改变执行运算的顺序不改变最终结果)、以及分配性。例如,以下DSL声明例示了由对DSL声明进行解析而产生的计费图函子的分配性:
[0066](dayOfYear == ibirthday)= >
[0067](([07:00:00, 20:00:00] => IinearRate (0.05))
[0068]+([20:00:00,07:00:00] => IinearRate (0.01)))
[0069]其等同于以下声明(S卩,得到与以下声明相同的结果):
[0070](dayOfYear = = ibirthday) = > (([07:00:00,20:00:00]= >IinearRate(0.05))
[0071]+ (dayOfYear = = ibirthday) = > ([20:00:00,07:00:00]= >IinearRate(0.01))
[0072]多个计费计划
[0073]对(使用)事件进行处理的产品或服务提供商可以向潜在的客户提供从其进行选择的多个计费计划。因此,在实施例中,产生多个计费计划函子,每个计费计划一个计费计划函子。如以上所指示的,计费计划函子的一个源可以是由计费计划的设计者撰写的多个DSL声明。另外地或可替代地,计费计划函子的另一个源可以是用户通过其输入反映计费计划的规则(即,不是DSL声明的形式)的用户界面。随后将输入的数据变换为反映计费计划的DSL声明。
[0074]因此,在实施例中,当事件到达事件处理引擎时,事件处理引擎从多个计费计划函子中识别计费计划函子,每个计费计划函子对应于不同的计费计划。事件可以包括计费计划数据,该数据指示(发起该事件的)客户以前选择的计费计划。可替代地,事件可以仅指示客户标识符,该客户标识符可以与特定计费计划相关联(例如,在客户-计费计划表中)。因此,事件处理引擎可以识别与客户相关联的计费计划,识别与该计费计划相关联的计费计划函子,并且将事件传递给与该计费计划相关联的计费计划函子。计费计划函子可以被存储在非易失性或持久存储器中,并且被加载到易失性存储器中。可替代地,计费计划函子可能已经被加载到易失性存储器中。
[0075]在相关实施例中,可以将多个计费计划应用于单个事件。因此,可以将单个事件传递到两个或更多计费计划函子进行处理。例如,一个计费计划可以用于计算费用,另一个计费计划可以用于计算将应用于所计算的费用的折扣。
[0076]“共享”函子
[0077]多个计费计划可以具有许多共同的属性。例如,多个计费计划可以具有“生日规贝U”,其中,例如,如果客户发起事件的那天是客户的生日,则不向客户收取相应使用费用。如果每个计费计划函子包括“生日”函子的它自己的实例,则可能存在生日函子的多个实例。然而,不是对于包括生日规则的每个计费计划产生“生日”函子的不同实例,而是将生日函子的单个实例存储在存储器中,并且多个计费计划函子“共享”该实例。这样的方法减少了系统中的函子实例的数量,并且降低了事件处理引擎的存储器占用大小。除了单元素集函数(诸如dayofYear函子)之外,还可以共享非单元素集函子。例如,取得开始和结束时间的TimeRange函子可以具有在整个计费系统上共享的那些函子的多个实例。通常,许多计费计划共享相同的峰值时间段和非峰值时间段,因此,可以共享TimeRange函子的相同实例(诸如对于[19:00:00,07:00:00]表示的非峰值、以及对于[07:00:00,19:00:00]表不的峰值)。
[0078]运行时执行
[0079]在实施例中,对于事件处理引擎接收的每个事件,对该事件进行处理的过程或线程确定与该事件相应的计费计划,识别与该计费计划相应的计费计划函子,并且使该计费计划函子被执行。如果确定多个计费计划对应于该事件,则识别多个计费计划函子,并且执行每个计费计划函子。可以执行这些步骤的处理或线程在本文中被称为“事件处理线程”,其可以是单线程处理或多线程处理的一部分。在函子不可变的实施例中,以多线程的方式对计费计划进行评估是完全线程安全的。
[0080]尽管表示计费计划的二叉树模型涉及根函子,但是对DSL表达式进行解析的结果是唯一的计费计划函子对象。一旦产生了该函子,对计费计划进行评估就如调用F(X) =Y那样简单,其中F是计费计划函子,X是事件,Y是结果(其可以是适用费用的列表)。组成计费计划函子“F”的函子的调用顺序是嵌入式计费计划函子实现。一旦计费计划函子被识另O,事件处理器就“调用”该计费计划函子。
[0081]因为在实施例中,函子不维持状态,所以当多个线程(例如,对不同事件进行处理时所涉及的多个线程)执行特定函子的单个实例时,不存在数据损坏或结果不正确的危险。
[0082]在某种意义上,事件处理线程“盲目地”对函子的“方程”进行评估。确定接着执行哪个函子的决策被委托给作为计费计划函子的一部分的运算符函子。因此,不要求外部系统决定如何对计费计划进行评估。函数逻辑嵌入在计费计划函子本身中。换句话讲,计费计划函子本身包含可执行代码,而计费引擎的以前的实现依赖于外部系统读取表示计费计划的数据并且基于该数据执行运算。因此,函数计费计划模型具有优于计费引擎的以前的实现的显著优点。
[0083]计费计划函子的存储器表示
[0084]图3是描绘根据本发明的实施例的包括多个函子的计费计划函子的示例性存储器表示300的框图。表示300包括许多函子,这些函子表示与示例性计费计划相应的计费计划函子中的不同类型的运算。具体地,表示300包括直接连接到四个函子的聚合运算符302( “I+”):三个如果-则运算符304A-C( “= >”)、以及其输入为0.05的计费函子306A( “linearRate”)。如果-则运算符304A连接到方程运算符308A( “ == ”)、以及其输入为0.00的计费函子306B。如果方程运算符308A为真,则根据如果-则运算符304A,对计费函子306B进行评估。方程运算符308A的运算元是单元素集运算符310 ( “DayofYear”)和别名运算符312A( “OBirthday”)。如果与正在被该计费计划函子处理的事件相关联的人的生日与发生该事件的日子为同一天,则方程运算符308A评估为真。否则,方程运算符308A评估为假。
[0085]如果存在将被计费的附加时间量或使用量(在这个例子中,如果方程运算符308A评估为假,则情况将如此),则对如果-则运算符304B进行评估。如果-则运算符304B连接到“在…内”运算符308B( “〈:”),其具有两个运算元:别名运算符312B( “OcalledlD”)和别名运算符312C( “OfriendsAndFamiliy”)。计费计划函子的这个“分支”指示,如果呼叫目的地在呼叫者的一组朋友和家人内,则对如果-则运算符304B的“则”部分进行评估。这个“则”部分是其输入为0.01的计费函子306C( “linearRate”)。
[0086]如果存在额外的将被计费的时间量或使用量(在这个例子中,如果“在…内”运算符308B评估为假,则情况将如此),则对如果-则运算符304C进行评估。如果-则运算符304C连接到时间范围函子314( “[],,)和计费函子306D( “liearRate”),时间范围函子314的输入为20:00:00和07:00:00,计费函子306D的输入为0.02。计费计划函子的这个“分支”指示,如果服务使用(例如,电话呼叫)的至少一部分在8PM与7AM的时间之间,则该部分由计费函子306D计费,计费函子306D以每分钟2分对该部分进行计费。
[0087]如果存在额外的将被计费的时间量或使用量(如果没有通过如果-则运算符304C对整个使用持续时间进行评估,情况可能如此),则对计费函子306A进行评估。计费函子306A( “linearRate”)取0.05作为输入。如果⑴电话呼叫的日期不是呼叫者的生日,
(2)呼叫的目的地不在呼叫者的朋友和家人列表上,以及(3)呼叫的至少部分在7AM之后、8PM之前发生,则对计费计划函子的这个“分支”进行评估。
[0088]硬件概述
[0089]根据一实施例,本文描述的技术由一个或多个专用计算装置实现。专用计算装置可以被硬编码来执行这些技术,或者可以包括被持久地编程为执行这些技术的数字电子装置,诸如一个或多个专用集成电路(ASIC)或现场可编程门阵列(FPGA),或者可以包括按照固件、存储器、其他储存器或组合中的程序指令执行这些技术的一个或多个通用硬件处理器。这样的专用计算装置还可以组合具有自定义编程的自定义硬连线逻辑器、ASIC或FPGA来实现这些技术。专用计算装置可以是台式计算机系统、便携式计算机系统、手持装置、联网装置、或合并硬连线逻辑和/或程序逻辑来实现这些技术的任何其他装置。
[0090]例如,图4是例示在其上可以实现本发明的实施例的计算机系统400的框图。计算机系统400包括用于传送信息的总线402或其他通信机制、以及与总线402耦合的用于对信息进行处理的硬件处理器404。硬件处理器404可以是例如专用微处理器。
[0091]计算机系统400还包括耦合到总线402的用于存储信息和将被处理器404执行的指令的主存储器406,诸如随机存取存储器(RAM)或其他动态存储装置。主存储器406还可以用于存储将被处理器404执行的指令执行期间的临时变量或其他中间信息。这样的指令在被存储在可供处理器404访问的非暂时性存储介质中时将计算机系统400变为被定制为执行这些指令中所指定的操作的专用机器。
[0092]计算机系统400还包括用于存储用于处理器404的静态信息和指令的只读存储器(ROM)408或其他静态存储装置。提供了存储装置410,诸如磁盘或光学盘,并且存储装置410耦合到总线402,用于存储信息和指令。
[0093]计算机系统400可以经由总线402耦合到用于向计算机用户显示信息的显示器412,诸如阴极射线管(CRT)。包括字母数字键和其他键的输入装置414耦合到总线402,用于将信息和命令选择传送给处理器404。另一种类型的用户输入装置是用于将方向信息和命令选择传送给处理器404并且用于控制显示器412上的光标移动的光标控件416,诸如鼠标、轨迹球、或光标方向键。该输入装置通常具有两个轴(第一轴(例如,X)和第二轴(例如,y))上的两个自由度,这两个自由度使得该装置可以指定平面中的位置。
[0094]计算机系统400可以使用与该计算机系统组合使计算机系统400成为专用机器或将计算机系统400编程为专用机器的定制的硬连线逻辑器、一个或多个ASIC或FPGA、固件和/或程序逻辑器来实现本文中所描述的技术。根据一实施例,本文中的技术由计算机系统400响应于处理器404执行主存储器406中所包含的一个或多个指令的一个或多个序列来执行。这样的指令可以从另一个存储介质(诸如存储装置410)读取到主存储器406中。主存储器406中所包含的指令序列的执行使处理器404执行本文中所描述的处理步骤。在替代实施例中,可以使用硬连线的电路系统来代替软件指令或者与软件指令组合。
[0095]本文中所使用的术语“存储介质”是指存储使机器以特定方式操作的数据和/或指令的任何非暂时性介质。这样的存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括,例如,光学盘或磁性盘,诸如存储装置410。易失性介质包括动态存储器,诸如主存储器406。常见形式的存储介质包括,例如,软盘、柔性盘、硬盘、固态驱动器、磁带、或任何其他磁性数据存储介质、CD-ROM、任何其他光学数据存储介质、具有孔图案的任何物理介质、RAM、PROM、以及EPROM、FLASH-EPROM、NVRAM、任何其他存储器芯片或盒。
[0096]存储介质不同于传输介质,但是可以与传输介质结合使用。传输介质参与在存储介质之间传送信息。例如,传输介质包括同轴电缆、铜线和光纤,它们包括包含总线402的导线。传输介质还可以采取声波或光波的形式,诸如在无线电波和红外数据通信期间产生的那些声波或光波。
[0097]在将一个或多个指令的一个或多个序列传载到处理器404进行执行时可能涉及各种形式的介质。例如,这些指令可以一开始承载在远程计算机的磁盘或固态驱动器上。远程计算机可以将这些指令加载到其动态存储器中,并且使用调制解调器通过电话线发送这些指令。计算机系统400本地的调制解调器可以接收电话线上的数据,并且使用红外发射器来将该数据转换为红外信号。红外探测器可以接收红外信号中所承载的数据,并且适当的电路系统可以将该数据放置在总线402上。总线402将数据传载到主存储器406,处理器404从主存储器406检索并执行这些指令。主存储器406接收的指令可选地可以在处理器404执行之前或之后被存储在存储装置410上。
[0098]计算机系统400还包括耦合到总线402的通信接口 418。通信接口 418提供耦合到网络链路420的双向数据通信,网络链路420连接到局域网422。例如,通信接口 418可以是综合服务数字网络(ISDN)卡、电缆调制解调器、卫星调制解调器、或者提供与相应类型的电话线的数据通信连接的调制解调器。另举一例,通信接口 418可以是提供与可兼容LAN的数据通信连接的局域网(LAN)卡。还可以实现无线链路。在任何这样的实现中,通信接口 418发送并且接收承载表示各种类型的信息的数字数据流的电信号、电磁信号或光学信号。
[0099]网络链路420通常通过一个或多个网络将数据通信信息提供给其他数据装置。例如,网络链路420可以通过局域网422提供与主机424或由互联网服务提供商(ISP) 426运营的数据设备的连接。ISP426继而通过全球数据包数据通信网络(现在常被称为“互联网”428)提供数据通信服务。局域网422和互联网428都使用承载数字数据流的电信号、电磁信号或光学信号。通过各种网络的信号、以及网络链路420上的通过通信接口 418的信号是示例形式的传输介质,这些信号将数字数据传载到计算机系统400,并且从计算机系统400传载数字数据。
[0100]计算机系统400可以通过网络、网络链路420和通信接口 418发送消息并且接收数据,包括程序代码。在互联网例子中,服务器430可以通过互联网428、ISP426、局域网422和通信接口 418发送被请求的应用程序代码。
[0101]所接收的代码可以在其被接收时被执行、和/或被存储在存储装置410或其他非易失性储存器中以供以后执行。
[0102]在前面的说明书中,已经参照在不同实现中可以变化的许多特定细节描述了本发明的实施例。因此,要从例示性、而非限制性的意义上来看待说明书和附图。本发明的范围以及 申请人:意图什么是本发明的范围的唯一的排他的指示是本申请中以特定形式发布的一组权利要求的字面范围和等同范围,以所述特定形式,发布这样的权利要求,包括任何后续修正。
【权利要求】
1.一种计算机实施的方法,包括: 在事件处理系统处接收与客户相关联的事件; 响应于接收到所述事件: 识别包括多个函数对象的计费计划函数对象; 执行所述计费计划函数对象,其中执行所述计费计划函数对象包括: 执行所述多个函数对象中的第一函数对象以产生第一结果; 基于所述第一结果,识别所述多个函数对象中的第二函数对象; 执行所述第二函数对象以产生第二结果;以及 基于所述第二结果,确定向所述客户收取的金额;以及 基于所述金额,更新与所述客户相关联的账户, 其中,所述方法由一个或多个计算装置执行。
2.根据权利要求1所述的方法,其中,执行所述多个函数对象中的少于全部的函数对象来确定所述金额。
3.根据权利要求1所述的方法,其中,执行、识别和确定的步骤由单个处理执行。
4.根据权利要求1所述的方法,其中: 识别计费计划函数对象包括从多个计费计划函数对象中识别所述计费计划函数对象; 所述多个计费计划函数对象中的每个计费计划函数对象对应于多个计费计划中的不同计费计划。
5.根据权利要求1所述的方法,其中: 所述多个计费计划函数对象包括第一计费计划函数对象和第二计费计划函数对象; 所述第一计费计划函数对象包括第一多个函数对象,所述第一多个函数对象包括特定函数对象; 所述第二计费计划函数对象包括第二多个函数对象,所述第二多个函数对象包括所述特定函数对象; 所述特定函数对象的实例由所述第一计费计划函数对象和所述第二计费计划函数对象共享。
6.根据权利要求1所述的方法,还包括: 接收遵循领域特定语言(DSL)的声明;以及 对所述声明进行处理以产生所述计费计划函数对象。
7.根据权利要求6所述的方法,还包括: 接收反映由用户建立的多个规则的规则数据; 对所述规则数据进行处理以产生所述声明。
8.根据权利要求6所述的方法,其中,在来自用户的输入中反映所述声明。
9.根据权利要求1所述的方法,其中,所述计费计划函数对象中没有一个函数对象存储所述账户被更新之后的状态信息。
10.根据权利要求1所述的方法,还包括: 与所述计费计划函数对象中的特定函数对象相关联地存储基于对所述特定函数对象的特定输入执行所述特定函数对象的结果; 接收与第二客户相关联的第二事件;以及 响应于接收到所述第二事件,读取所述结果,而不是执行所述特定函数对象来产生所述结果。
11.根据权利要求1所述的方法,其中,所述事件是系统事件或使用事件,所述使用事件包括指示所述客户的使用的使用数据。
12.—个或多个存储介质,所述存储介质存储有指令,所述指令在由一个或多个处理器执行时导致执行权利要求1-11中的任一项所述的方法。
13.一种装置,包括: 一个或多个处理器;以及 一个或多个存储介质,所述存储介质存储有指令,所述指令在由所述一个或多个处理器执行时导致执行权利要求1-11中的任一项所述的方法。
【文档编号】H04L12/14GK104137475SQ201280070394
【公开日】2014年11月5日 申请日期:2012年9月26日 优先权日:2012年1月9日
【发明者】E·特谢尔, G·马拉克萨姆徳拉, J·凯默尔, L·小皮罗 申请人:甲骨文国际公司

最新回复(0)