1973 年,Carl Hewitt 受量子力学启发,产生了一个想法。他想开发能够并行执行任务的计算机,这些计算机能够无缝地相互通信,同时包含自己的本地内存和处理器。
Actor 模型应运而生,随之而来的是一个非常简单的概念:一切皆为 Actor。这带来了一些巨大的好处:业务逻辑和其他逻辑的分离变得非常容易。安全性很容易获得,因为应用程序的每个核心组件都是独立且分离的。由于 Actor 的性质及其互连性,原型设计得以加速。
然而,将这一切联系在一起的是在这些 Actor 之间并发传递消息的能力。Actor 根据输入消息做出响应;然后它可以发回确认,传递内容,并指定在下次收到消息时要使用的行为。例如,一个 Actor 从磁盘加载图像文件,同时将块流式传输到其他 Actor 以进行进一步处理;即,图像分析或转换。然后另一个 Actor 将这些作为输入,并将它们写回磁盘或记录到终端。单独来看,这些 Actor 无法完成太多工作,但它们共同构成了一个应用程序。
什么是 Pronghorn?
今天,Actor 模型有很多种实现方式。在 Object Computing,我们一直在开发一个高度可扩展、高性能且完全开源的 Java 框架,名为 Pronghorn,以世界上速度最快的陆地动物之一命名。
Pronghorn 最近发布了 1.0 版本,旨在解决 Akka 和 RxJava(Java 和 Scala 的两个流行的 Actor 框架)的一些缺点。
因此,我们在开发 Pronghorn 时考虑了全面的功能列表
- 我们希望尽可能少地产生垃圾回收。在没有垃圾回收器定期介入的情况下,它能够达到前所未有的性能水平。
- 我们希望确保 Pronghorn 具有最小的内存占用,并且对机械友好。它从头开始构建时就考虑了性能,利用 CPU 预取功能和缓存来实现最快的吞吐量。它使用零拷贝直接访问,在纳秒内从模式加载字段,并且从不阻塞核心,同时也是非阻塞和无锁的。
- Pronghorn 确保您安全地编写正确的代码。通过其 API 和契约,并通过使用“软件堡垒”和行业领先的加密技术,Pronghorn 让您构建安全且能安全失败的应用程序。
- 调试和测试可能压力很大且令人恼火,尤其是在您需要赶截止日期时。Pronghorn 可以轻松地与常见的测试框架集成,并通过其自动生成和实时更新的遥测图、基于现有消息模式的模糊测试(正在开发中)以及在某些 Actor 行为不端或消耗过多资源时发出的警告来简化重构和调试。这有助于您快速制作原型,并将更多时间集中在您的业务需求上。
有关更多详细信息,请访问 Pronghorn 功能列表。
为什么选择 Pronghorn?
编写并发和高性能的应用程序从来都不是一件容易的事,我们不承诺完全解决这些问题。但是,为了让您了解 Pronghorn 的优势及其 API 的强大功能,我们编写了一个小型 HTTP REST 服务器,并将其与常见的行业标准(如 Node & Express 和 Tomcat & Spring Boot)进行了基准测试

我们鼓励您自己运行这些数字,分享您的结果,并添加您自己的 Web 服务器。
正如您所见,Pronghorn 在此 REST 示例中表现出色。在几乎比传统解决方案快 10 倍的情况下,Pronghorn 可以通过其无垃圾回收、静态类型的后端,帮助将服务器成本(如 EC2 或 Azure)降低一半或更多。HTTP 请求可以被解析,响应可以在 Actor 并发工作时生成。调度和线程处理由 Pronghorn 强大的默认调度器自动处理。
如上所述,Pronghorn 允许您快速制作原型并构想您的项目,通常通过以下三个基本步骤
- 定义您的数据流图
这是至关重要的第一步。Pronghorn 采用数据优先的方法;快速处理大量数据。在您的应用程序中,考虑应该流经“管道”的数据类型——例如,如果您正在构建图像分析工具,您将需要 Actor 来读取、写入和分析图像文件。Actor 之间的数据格式也需要确定;它可以是包含 JPG MCU 或原始二进制 BMP 文件的模式。选择最适合您应用程序的格式。
- 定义每个阶段之间的契约
契约允许您使用 FAST 轻松定义您的消息,FAST 是金融行业用于股票交易的成熟协议。这些契约在测试阶段用于确保实现与您的消息字段定义保持一致。这是一种契约式方法;必须遵守它,Actor 才能相互通信。
- 在实现图时使用生成式测试进行先测试开发
当您开发应用程序时,模式会为您代码生成。测试驱动开发允许编写正确且安全的代码,从而在您走向发布时节省宝贵的时间。随着您的程序增长,图也会增长,描述 Actor 之间的每次交互,并说明阶段之间管道上的消息数据流。通过其自动遥测,您可以轻松跟踪即使是最复杂的应用程序,如下所示

它看起来像什么?
您可能对 Pronghorn 代码的外观感到好奇。以下是一些示例代码,用于在我们的“Hello World”示例中生成消息模式。
要定义消息,请创建一个类似于此的新 XML 文件
<?xml version="1.0" encoding="UTF-8"?>
<templates xmlns="http://www.fixprotocol.org/ns/fast/td/1.1">
<template name="HelloWorldMessage" id="1">
<string name="GreetingName" id="100" charset="unicode"/>
</template>
</templates>
此模式将由 Hello World 示例中描述的阶段使用。在您的应用程序中使用此模式填充图甚至更容易
private static void populateGraph(GraphManager gm) {
Pipe<HelloWorldSchema> messagePipe =
HelloWorldSchema.instance.newPipe(10, 10_000);
new GreeterStage(gm, "Jon Snow", messagePipe);
new GuestStage(gm, messagePipe);
}
这使用了 Hello World 教程中创建的阶段。
我们使用 Maven 原型来为您提供开始构建 Pronghorn 应用程序所需的一切。
开始使用 Pronghorn
我们希望本文能让您初步了解 Pronghorn 如何帮助您使用 Pronghorn(Akka 和 RXJava 的替代方案)在 Java 中编写高性能、高效且安全的应用程序。我们很乐意听取您关于如何使其成为开发人员、经理、CFO 和其他人员的理想平台的反馈。
资源
- 关于如何构建简单的 Hello World 示例的详细教程
- 更多基准测试
- Pronghorn 的功能列表
- 成熟的示例项目集合
- 要贡献代码,请在我们的主存储库上联系我们
1 条评论