来源:比特网
WebLogic Event Server (WL EvS)是一个用于开发和部署事件驱动型应用程序的平台。分布式缓存技术可以提供众多好处,比如说使处理实时事件的应用程序具有高可用性(HA)、高性能和可伸缩性。本文将探讨开发人员如何使用WebLogic Event Server和分布式缓存一起在事件驱动型应用程序中实现这些特性。文章还将提供完整的救命应用程序和示例代码。
简介
WebLogic Event Server (WL EvS)是一款模块化的轻量级应用服务器,用于开发事件处理应用程序。事件处理应用程序的基本关注点是处理实时的事件流,并且常常有很苛刻的低延时要求。事件处理应用程序通常应用于金融、电信、制造和零售行业,等等。比如说,金融领域的事件处理应用程序可以处理市场数据提要,以便于寻找买卖机会。
分布式缓存是一项相对比较成熟的技术。各种形形色色的缓存产品已经进入了消费者市场,其中包括GemStone的GemFire、Tangosol的Coherence和GigaSpaces的Data Grid。分布式缓存即缓存在分布式系统各节点内存中的缓存数据。分布式缓存产品通常可以支持许多种内存缓存拓扑,比如说复制缓存(replicated cache)、分配缓存(partitioned cache)和多层缓存(tiered cache)。分布式缓存解决方案还支持将缓存数据写入持久性存储器(如关系数据库),以及从中读取缓存数据。
分布式缓存技术可以为事件驱动型应用程序提供许多重要价值。其中最重要的一点就是高可用性。比如说,事件处理应用程序可以将输出事件发布到一个重复式的(replicated)分布式缓存,从而保证其计算结果具有高可用性。分布式缓存还可以提高事件驱动型应用程序的性能和可伸缩性。比如说,许多事件驱动型应用程序都需要结合使用流数据和外部数据,例如从持久性存储器中检索出来的数据。缓存可用于提高访问非流式数据的速度,从而动态地提高应用程序的性能。
本文将介绍事件驱动型财务应用程序的一个示例——“in-play”应用程序——该示例将演示如何在WebLogic Event Server中使用GemFire分布式缓存。示例应用程序将具体演示如何使用分布式缓存为事件驱动型应用程序提供高可用性和可伸缩性等优点。应用程序还将演示如何在Spring中使用门面设计模式将特定分布式缓存解决方案的依赖关系降到最低。我们还将演示如何使用Event Server 的可扩展配置系统将分布式缓存的配置元数据与其余服务器的配置集成在一起。虽然示例应用程序中使用的是GemFire,但是这种通用的集成方法也适用于其他缓存系统。
首先,本文本将介绍WebLogic Event Server的总体概念以及分布式缓存技术在事件驱动型应用程序中的应用。其余章节将详细研究示例应用程序并归纳出一些结论。
WebLogic Event Server概述
WebLogic Event Server是专门针对实时事件驱动型应用程序而设计的一种应用平台。事件驱动型应用程序的关注点是处理事件流,通常由外部源将事件流交付给Event Server实例。比如说,在图1演示的场景中,事件驱动型应用程序正在处理来自多个证券市场的证券交易事件。当应用程序在交易事件中检测到一个特定的模式时,便会向事件订阅者或其他外部系统发出通知。通常,从外部源接收到的事件要比应用程序生成的事件高几个数量级。.
就其本质而言,WebLogic Event Server是一个基于BEA微服务架构(microServices Architecture,mSA)的、模块化的轻量级应用服务器。图2是Event Server软件栈的高级结构图。图2显示Event Server运行于BEA的实时JVM之上,该实时JVM提供了确定性垃圾收集机制(deterministic garbage collection,DGC)。这种平台适合在确定性行为和低延时方面具有苛刻要求的应用程序,比如说各种财务应用程序。但是,Event Server是纯Java应用程序,因此它也可以运行在其他JVM之上。
从图2中还可以看出,Event Server使用OSGi提供其模块化架构的核心。如果对OSGi还不甚了解,也不用担心。我们将在演示过程中穿插介绍OSGi的基本概念。此处,有一点值得大家重点注意,即服务器子系统(例如事件记录和配置子系统)和开发人员编写的应用程序都将封装为OSGi模块——在OSGi中,模块也称作“程序包(bundle)”。这也意味着开发人员需要对OSGi有足够的理解,才能够将自己编写的应用程序封装为OSGi程序包。
WebLogic Event Server是一个功能全面的应用服务器,它为事件驱动型应用程序提供了一整套必备的服务。图3显示了Event Server所提供的一些比较重要的服务模块(或程序包)。比如说,Event Server支持通过JDBC访问关系数据库。Event Server可充当JMS客户机的角色。身份验证和授权服务可用于指定一组允许执行管理操作的用户。Event Server还支持工作管理人员处理与线程有关的事项。
让我们仔细查看一下Event Server应用程序的结构。Event Server编程模型基于Spring Framework。Event Server应用程序由一个应用程序组件网络组成,这些应用程序组件形成了一个事件处理网络。共有四种主要的组件类型:Adapter、Stream、Processor和POJO。Event Server提供了Stream和Processor组件的实现,因此开发人员只需要配置组件的类型便可以使用它们。但是,Adapter和POJO组件是由应用程序开发人员编写的。图4显示了事件处理网络的一个例子。
如图4所示,Adapter组件负责提供与各种外部事件源的连通性,比如说市场数据提要。从本质上说,Adapter组件将传入的事件流数据转化为事件对象,以供事件处理网络中的下游组件使用和处理。Event对象可以是公开集合类型属性的JavaBean,也可以是条目表示属性名称/值对的Map。
Stream组件实际上就是内存中的一个队列。Stream组件的目的是为事件提供缓冲,以及控制应用程序的线程行为。在默认情况下,Stream组件的容量是1024,也就是说一个Stream组件可以缓冲1024个事件。在图4的事件处理网络中,Adapter组件生成事件而Processor组件使用这些事件,Stream组件就在两这者之间提供了解耦的作用。Adapter组件创建事件对象并将其发送给Stream组件之后,控制可立即返回Adapter组件(假设Stream组件未满),并且Adapter组件可以继续从外部事件源读取数据然后产生其他事件。Stream组件从队列中取出事件,然后通过单独的线程将事件发送给Processor组件。负责从Stream组件中移除事件的线程数量是可以动态配置的,即Stream组件的容量。换句话说,可以在运行应用程序的时候动态调节这些Stream参数,从而提高应用程序的性能。
在许多事件处理应用程序中,绝大多数工作都是在Processor组件中执行的。为了有效地支持筛选和合并事件流之类的操作,Event Server提供了声明式事件处理语言(EPL)——声明式EPL是一种基于SQL的查询语言,它在实时事件处理方面扩展了一些特殊特性。Processor组件配置了一组EPL查询语句,因此可以不间断地对新到的事件执行操作。还可以在应用程序运行时对Processor组件的EPL查询进行动态修改。EPL查询生成的输出事件将发送给下游的组件,比如说图4中的POJO。
POJO组件由用户自己编写,因此可以包含任意的业务逻辑。POJO使应用程序开发人员可以在创建事件驱动型应用程序时利用Java的强大功能。POJO可以是一些简单的组件,用于将事件转发给外部系统,也可以是一些复杂的组件,用于执行一些比较复杂的事件处理。
分布式缓存概述
分布式缓存提供的数据内存缓存可以分布于大量单独的物理机器中。换句话说,分布式缓存所管理的机器实际上就是一个集群。它负责维护集群中成员列表的更新,并负责执行各种操作,比如说在集群成员发生故障时执行故障转移,以及在机器重新加入集群时执行故障恢复。
分布式缓存支持一些基本配置:重复(replicated)、分配(partitioned)和分层(tiered)。重复(Replication)用于提高缓存数据的可用性。在这种情况下,数据将重复缓存在分布式系统的多台成员机器上,这样只要有一个成员发生故障,其他成员便可以继续处理该数据的提供。另一方面,分配(Partitioning)是一种用于实现高可伸缩性的技巧。通过将数据分配存放在许多机器上,内存缓存的大小加随着机器的增加而呈线性增长。结合分配和重复这两种机制创建出的缓存可同时具备大容量和高可伸缩的特性。分层缓存也称作客户机-服务器(client-server)缓存,它是一种拓扑结构,在该结构中缓存功能将集中于一组机器上。缓存客户机通常并不会亲自执行任何缓存操作,而是连接到缓存并检索或更新其中的数据。分层缓存架构可以包含多层结构。
WebLogic Event Server可以很容易与第三方分布式缓存解决方案集成在一起,从而提供分布式缓存的各种优点,比如说高可用性。在图5的示例架构中,分布式缓存结合Event Server为Event Server应用程序的计算结果提供了高可用性。