如何创建一个Astra Streaming租户,包括命名空间、主题和汇

145 阅读12分钟

DataStax最近发布了Astra Streaming,使开发者能够在由Apache Pulsar支持的可弹性扩展的多云消息和事件流平台上构建流式应用。这篇文章将引导你通过一个简短的演示,为你熟悉这个强大的新流媒体服务提供一个很好的起点。

以下是你将学到的内容。

  1. 如何创建一个Astra Streaming租户,包括命名空间、主题和汇。
  2. 如何利用序列化的JavaPOJOs为一个主题产生消息。
  3. 如何在DataStax Astra DB数据库中存储主题消息。

为了说明这一点,我们将使用Astra Streaming来复制通常由联邦航空局(FAA)提供给每个机场的流式物体跟踪信息。这个流报告了机场的每件设备的位置(飞机、燃料车、飞机牵引车、行李车等)。

让我们开始建设吧!

有了Astra流,你不仅可以将信息输入流 "管道",而且还可以将这些事件存储到Astra DB数据库中,以便日后分析。这使我们能够以两种方式查看我们的对象跟踪信息。

  1. 所有的东西现在都在哪里?
  2. 某一特定对象在历史上位于何处?这对于追踪物体随时间变化的路径很有用。

为了建立我们的流媒体管道来实时和历史地追踪对象,我们需要建立以下内容。

  • 一个具有单一主题的Astra流租户object_location
  • 一个Java生产者,将事件发布到object_location 主题。
  • 一个有两个表的Astra数据库,从object_location 主题中获取数据。 image.png 图1:我们需要为这个演示建立的所有活动部件。

在我们的对象追踪例子中,一个主题将向两个不同的表提供数据。object_location 表只记录一个物体最近的已知位置,而object_location_history 表则记录一个物体在任何特定时间内的所有位置。位置历史数据对不同类型的分析很有用,比如分析不同物体在机场航站楼内的流动。

这种方法不仅适用于物体追踪,它还可以用于任何需要同时看到实时流数据和历史数据的用例,例如,追踪股票价格,其中一个表持有当前股票价格,而另一个表持有历史股票价格。

创建数据库

现在回到我们的对象跟踪例子。我们的第一步将是创建数据库。这是一个非常简单的数据库,只有两个表,为了保持简单,我们将在一个叫做airport 的关键空间中创建。airport 关键空间中的表是:object_location ,它追踪每个物体此刻的位置(嗯,真的,最后的已知位置),以及object_location_history ,它追踪物体在一段时间内的位置,最近的更新列在前面。

如果你正在关注你自己的Astra实例,只需用关键空间airport ,然后运行database/create.cql 文件来创建你的表。

即使你的Astra数据库是由另一个云提供商托管的,你也可以在一个云提供商上创建你的Astra Streaming。然而,如果它们都由同一云提供商托管,并且在同一地区,你会得到更好的性能。

创建一个自定义角色

虽然有可能创建一个访问令牌,授予你对所有数据库的访问权,但我强烈建议根据自定义角色创建特定数据库的令牌。不止一次,我不小心将安全令牌泄露到GitHub中(我在几分钟内就纠正了错误)。唯一救了我一命的是,该令牌被限制在一个数据库中。如果你不熟悉创建令牌的过程,我将在本节中告诉你如何做。

在你创建了数据库之后,点击你的组织名称旁边的 "向下箭头",如下图中的红色方块所示。 image.png 图2:访问你的组织设置。

这将弹出一个菜单。点击Organization Settings 菜单项。一旦页面加载,点击页面左侧的Role Management 菜单项,并按下Add Custom Role 按钮。给你的角色起一个有意义的名字。正如你在下面的图片中看到的,我把我的自定义角色命名为airport-demo 。然后你可以开始为你的角色选择权限。由于这个角色是为演示目的而建立的数据库所特有的,所以我倾向于对我的权限采取相当自由的态度。设置你的权限以满足你的需要,然后向下滚动以访问该页面的其余部分。 image.png 图3:为你的自定义角色定义权限。

适当地选择钥匙空间的权限和表的权限。我喜欢为我的数据库启用所有的API,所以我通常会全部选择它们。最重要的一步发生在最下面,你选择这个角色所适用的单一数据库。 image.png 图4:完成自定义角色定义。

当你对你的角色配置感到满意时,请点击Create Role 按钮。

生成你的数据库令牌

现在你可以创建一个特定于你的客户角色和数据库的安全令牌。选择Token Management 菜单项。然后选择您之前创建的自定义角色,按Generate Token 按钮。 image.png 图5:生成一个令牌。

在这里你需要谨慎行事,因为弹出的对话框将永远不会再显示。你在你的源代码中需要这个令牌信息,以便从Astra Streaming连接到数据库。因此,你可能想按下 ***Download Token Details***按钮来下载一个包含你的令牌的CSV文件。 image.png 图6:这些信息将永远不会再显示给你了!借此机会下载它。

创建Astra流组件

现在我们要换个角度,创建Astra Streaming组件。在这里我们将创建一个租户、命名空间和一个主题。

创建Astra流租户

Astra租户是流媒体的最高级别对象。你可以把租户看作是一个应用程序或一个数据库。在Astra DB Web控制台创建一个新的流媒体租户,并将其命名为airport-events 。当租户完全创建并运行时,你会看到它的名字左边有一个小绿点,租户的仪表盘会在你的浏览器中显示出来,如下图所示。 image.png 图7:ports-events租户仪表盘。

创建Astra流命名空间

这一步是可选的,因为当你创建租户时,有一个默认的命名空间为你创建。然而,我喜欢保持事情的条理性和隔离性,所以我强烈建议你为ports-demo创建一个命名空间。点击Namespaces 标签。 image.png 图8:在Astra Streaming中创建一个命名空间。

将命名空间设置为airport ,然后按下create 按钮。就这么简单!

创建Astra Streaming主题

我们的下一步是为我们的对象位置事件创建主题。点击仪表板上的Topics 标签。默认情况下,你会看到仪表板中列出的新的airport 命名空间和默认命名空间。点击airport 命名空间中的Add Topic 按钮来创建新的主题。 image.png 图9:在机场命名空间中创建一个主题。

你只需要指定主题的名称,object-location ,如下图所示。 image.png 图10:在机场命名空间中创建对象-位置主题。

按下Save 按钮。在这一点上,我们有一个主题,我们可以在上面发布事件。然而,这些事件还没有去到任何地方。接下来,我们将创建两个 "汇",它们将消费这些事件并将其存储在数据库中。流媒体术语中的 "汇 "是Astra DB或ElasticSearch实例。在本文中,我们将使用Astra DB来存储我们的事件。

创建Astra DB汇

Astra Streaming用来存储事件到数据库的机制是一个 "汇"。我们将需要创建两个汇,为我们的表各创建一个。

创建对象-位置汇

我们的第一个汇将在object_location 表上存储事件。这个表与object_location_history 表不同,因为它没有 ts (时间戳)字段。点击Sinks 标签,然后按下Create Sink 按钮。 image.png 图11:为我们的Astra DB中的object_location表创建汇。

在向导的第1步,选择字段,如下图所示。 image.png 图12:第1步-创建对象-位置汇。

请确保在向导的第1步中选择object-location 主题。 image.png 图13:第2步-选择主题。

接下来,你需要为你的数据库提供连接信息。所有的信息都很重要,但数据库令牌可能是这里最关键的部分。在你粘贴了你的令牌之后,按TAB按钮退出令牌区域。这将促使Astra网站检查你的数据库和表,并生成字段映射,正如你接下来要看到的。 image.png 图14:步骤3-指定你要使用的数据库。

字段映射会自动为你完成。注意,自动映射只关注你指定的表中的字段。现在还没有整个主题的模式,因为我们还没有在主题上发送任何消息(我们将在稍后讨论这个问题)。我还没有发现自动映射不正确的情况,但检查两次总没有坏处另外,你现在可以展开object_location 模式的区域,查看那里的细节,如下图所示。 image.png 图15:注意字段映射是自动为你生成的。

按下Create 按钮来创建汇。

创建objloc-history汇

现在来创建我们的第二个水槽,这个水槽将捕捉信息到object_location_history 表。你将执行与第一个水槽相同的步骤,但有一些关键区别。

  • 水槽名称objloc-history (名称限制在18个字符以内)
  • 主题:再次选择object-location 的主题。它将为我们的两个表提供信息
  • 表名object_location_history

这一次,当你输入数据库令牌并TAB出该字段时,映射会出现一点不同,如下图所示。 image.png 图16:注意这个水槽的字段映射略有不同。

你看这里的tstimestamp 字段(一个Java长数据类型)被包含在映射中。按Create 按钮来创建这个水槽。

创建一个Java Producer

在Apache Pulsar(以及Astra Streaming)中,在一个主题上生成消息的东西被称为 "生产者"。我们需要创建一个生产者,将消息发送到object-location 主题。事实上,我们并不想像许多Pulsar的 "Hello World "级别的例子那样发送简单的字符串消息。我们想发送的是一个可以存储在数据库表中的对象。

如果你看一下GitHub中这个演示的文件夹中的Java代码,你会看到几个文件。主要的进入点是App.java文件。这是一个相当简单的文件,只是实例化了一个Flight对象,并使Flight的run()方法每秒钟被调用一次。有趣的工作是在Flight类中。

Flight类被设计成一个生产者。每次调用run()方法时,它都会在对象位置主题上产生消息。Flight类的构造函数负责创建PulsarClient连接,然后是Pulsar主题生产者。这里要注意的最重要的事情是使用基于ObjectLocation 类的JSONSchema 。这告诉Pulsar正在发送的对象的确切模式。Pulsar将期望消息与指定的JSON模式相匹配。如果消息与模式不完全匹配,你将收到一条错误信息。

Java

public Flight(String flightID, String aircraftType) {
     try {
          // Initialize our location
          Date now = new Date();
          objLoc = new ObjectLocation(flightID, aircraftType, 0.0, 0.0, now.getTime());
          // Create client object
          client = PulsarClient.builder()
          .serviceUrl(BROKER_SERVICE_URL)
          .authentication(
               AuthenticationFactory.token(Credentials.token)
          )
          .build();
       
          // Create producer on a topic
          producer = client.newProducer(JSONSchema.of(ObjectLocation.class))
          .topic("persistent://" + STREAM_NAME + "/" + NAMESPACE + "/" + TOPIC)
          .create();     } catch(Exception ex) {
          System.out.println(ex.getMessage());
     }
   }

在调用run()方法之前,没有消息被发送到主题。下面是run()方法的实现。

Java

public void run() {
     // Send a message to the topic
     try {
          producer.send(objLoc);
          System.out.println(objLoc.toString());
          Date now = new Date();
          updatePosition(objLoc);
          objLoc.setTs(now.getTime());
     } catch(PulsarClientException pcex) {
          pcex.printStackTrace();
     }
}

producer.send(objLoc) ,采取一个本地Java POJO,观察预期的模式,并通过主题发送。请注意,你不必对你的对象进行序列化。Pulsar库足够聪明,可以为你解决这个问题。另外,在你第一次运行这段代码时(我们接下来会这样做),Astra Streaming会记录消息类型的模式。你可以通过导航到你的主题并点击 模式标签,如下图所示。 image.png 图17:查看一个主题模式。

在行动中看到它

如果你在VS Code这样的编辑器中加载项目,你可以运行App类来查看应用程序的运行情况。当你这样做时,你会看到如下的输出。 image.png 图18:由生产者产生的事件。

从上面的输出中,我们可以看到生产者正在生成关于我们主题的事件/消息。现在让我们检查一下我们的数据库表,看看被记录的数据。我将使用Astra网站上的CQLShell窗口,以保持事情简单。让我们先看一下object_location 表。 image.png 图19:在你的object_location表中应该有一条记录。

记住,这个表的目的是记录一个物体的最后已知位置,在这个例子中是波音737。你的X和Y坐标会有所不同,这取决于你何时停止应用程序创建消息。

现在让我们看一下我们的object_location_history 表。 image.png 图20:我们的object_location_history表的数据。

自己试试吧

正如你所看到的,真正使用Astra Streaming是很容易做到的。尽管这里提供了许多截图和详细程度,但构建这个应用程序只需要几个简单的步骤。

  1. 创建一个数据库
  • 创建object_location
  • 创建object_loction_history 表。
  • 创建自定义角色(可选)
  • 为数据库生成一个令牌
  1. 创建一个流媒体租户
  • 创建airport 命名空间
  • 创建object-location 主题
  • 创建object-location 水槽
  • 创建objLoc-history 水槽

3.创建一个Java主题生产者

这就是它的全部内容了。现在你有一个通过Astra流发送和接收事件对象并将其存储在Astra数据库中的配方。通过创建你的免费Astra账户,自己尝试一下这段代码,不需要信用卡。(你的Astra账户将同时适用于Astra DB和Astra Streaming)。当你注册时,你将得到价值25美元的免费点数,每月在 永续性!这足以覆盖80GB的存储空间和2000万次的读写操作。现在是开始构建流媒体应用程序的最佳时机,现在有了Astra Streaming,它变得前所未有的简单。