最佳实践:Pivotal GemFire Function开发

Pivotal GemFire是希望通过快速访问数据获得强大竞争优势的客户的热门选择。GemFire的内存技术速度非常之快,比传统的磁盘I/O高出多达5个量级,自然广受欢迎。这种性能的提升令人叹为观止,但其实GemFire的功能远远超越了涉及快速读写的简单使用场景。其中一个强大功能就是使用GemFire Function,能够为需要进行数据计算分析的使用场景提供极高性能。

本文介绍了如何最大限度地提高开发人员效率的方式来编写、测试和调试GemFire Function的最佳实践。这里所说的并非一般意义上的编写函数。如果您想查看函数的说明,或了解如何以及何时使用函数,建议您访问以下链接:https://gemfire.docs.pivotal.io/geode/developing/function_exec/chapter_overview.html

将业务逻辑与函数问题分开

我在编写函数时会采用“Domain-Driven Design”(DDD)原则,并将业务逻辑与函数所处理的问题区分开。函数所处理的问题包括:在单一GemFire服务器上运行逻辑,还是跨多个服务器并行运行逻辑;在考虑Partition Region上运行, 还是不考虑Region 类型在GemFire服务器上运行。这涉及分区(Partition)、筛选(Filter)、格式化参数以及将结果返回给调用者。业务逻辑专注于要解决的问题,并且应该与函数分开。

分离这些问题可以带来诸多好处,本文会将重点放在可测试性和开发上,看看如何独立、快速地开发和测试自己的业务逻辑。

开发业务逻辑

举例来讲,假设要编写一个Function来计算订单总额,那么首先需要开发一个OrderTotalCalculator class,并为它编写一个单元测试,这其中不包含函数语法。稍后,要创建CalculateOrderTotalFunction来调用OrderTotalCalculator业务逻辑。下图展示了这一分离过程。

图1:将业务问题与函数问题分开

封装业务逻辑的一项优势在于,无需调用函数就可以轻松、独立地测试业务逻辑。甚至可以,使用客户端(而不是服务器)来开发和测试业务逻辑。但是函数执行只能在服务器上进行,那该如何完成这项任务呢?不要忘了,此时我们的目标是开发业务逻辑。使用Region接口以参数形式传递业务逻辑需要的所有region。因为客户端和服务器Region使用的是相同的Region接口,所以可以利用在开发时就使用客户端Region, 达到客户端测试驱动式开发的快速迭代效率。

典型的函数只有3个主要输入参数,分别为:

函数运算所在的Region

从客户端传递的可选参数

可选Keys,或Regin将要运行的“filter”

将这些输入以参数形式传递到业务逻辑,如下所示:

图2:不牵涉函数问题的业务逻辑

测试业务逻辑

使用IDE客户端单元测试对业务逻辑进行测试,只需将客户端Region、可选参数和Keys传递到业务逻辑即可。

这种方法对大部分应用实现快速开发和测试起到很大帮助。在后续的文章将介绍另一种测试方式,该方式适合测试函数并行性或测试超大数据集,客户端测试在这类场景中是不可行的。

开发函数

接下来要开发CalculateOrderTotalFunction,这个 Function将调用OrderTotalCalculator。尽量缩小函数的大小,使它的功能仅限于提取传递的参数、错误捕获以及回应调用者。

函数会创建OrderTotalCalculator class。通常的做法是:将Region注入OrderTotalCalculator class的构造函数,然后在执行时传递参数和filter。

该函数:

定函数是否关联到某个特定Region

提取客户端传递的可选参数

提取客户端传递的Filter(例如,Region“keys”)

调用业务逻辑,传递Region、参数和Filter

将调用的业务逻辑封装到错误处理中

向调用者返回结果,或者记录并返回格式化错误

要点在于,通过遵循这种模式,您可以在客户端上快速开发和测试自己的业务逻辑,并在准备就绪时将它转移到服务器端。当您想要在多个节点上进行诸如并行执行的测试,或者在测试目标节点上的执行查询操作时,就可以将业务逻辑转移到服务器上。

图3:不牵涉业务逻辑问题的函数模板示例

总结

将业务问题与Function问题分开可以让您更轻松地编写、测试和调试您的业务逻辑和Function。

业务逻辑的客户端测试有助于使用测试驱动和/或测试导向的开发方法来快速完成开发和测试。

在下一篇文章中,将介绍另一种关于Function的最佳实践——使用Mockito测试现有服务器端函数。如果您的集群中有大量现有测试数据且无法传递回客户端,或者您需要测试跨集群并行运行的Function,那么这种测试方法会很有帮助。

作者简介

Wes Williams是一位经验丰富的实践型架构师和设计师,擅长为各行各业不同规模的企业创建和交付企业级信息技术系统,客户既有小公司也有《财富》10强企业。在他的各项专长中,他最喜欢的是使用GemFire内存数据技术,创建实时、高吞吐量、低延迟,且具有超高可扩展性的系统。这种系统完成任务需要的硬件较少,可以创造业务价值。Wes是流程和软件最佳实践领域的团队领导者。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180621G07SPY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券