使用Akka流

介绍

在Hootsuite,Play框架已成为我们基于Scala的微服务的重要组成部分。 但是,随着我们改进实践,我们开始在比Play框架更低的抽象水平上进行实验。 实际上,从2.5版开始,Play的式API一直基于Akka Streams。 由于我们新的微服务框架内置了Akka依赖项,因此我们决定直接使用Akka Streams满足我们所有的流媒体需求。

什么是流媒体?

“大数据”是一个时髦的词汇,在最近的记忆中已经泛滥成灾。 随着社交媒体和IoT等景观的增长,人们越来越重视实时响应大量数据。 为了实时分析数据,我们需要一种流传输此数据的方法。 因此,Reactive Streams接口诞生了。

Akka流是Reactive Streams接口的实现。 作为其核心,Reactive Streams接口旨在成为“为无阻塞背压的异步流处理提供标准的倡议。” Akka流式API的四个主要抽象是:

  • :仅具有一个输出的处理阶段,只要下游处理阶段准备好接收它们,就会发出数据元素。
  • 接收器 :仅具有一个输入,请求和接受数据元素的处理阶段,可能会减慢元素的上游生产者的速度
  • :一个处理阶段,仅具有一个输入和输出 ,通过转换流经它的数据元素将其上下游连接起来。
  • RunnableGraph :一个流,其两端分别“附加”到源和接收器,并准备好可以运行()。

值得注意的是,每当通过HTTP响应创建Source时,该Source必须始终被某些Sink占用。 如果未消耗源,则Akka的背压属性将生效。 这将使所有与流相关的操作排队,直到该Source被消耗为止。

Hootsuite流媒体

社交媒体的很大一部分是-媒体! 流是从客户端到服务器端以及从服务器端到外部服务(例如社交网络,筛选服务)以图像和视频形式传输媒体的有效方法。 除了减少样板外,它们使我们无需在移动文件之前将文件临时存储在内存中。 总体而言,流技术允许更简洁的代码,更多的并行处理并减少我们的基础架构需求。

流媒体行动

让我们来看看一个示例,看看Akka流在运行中! 在此示例中,我们将通过“ stream_image ” POST端点将图像从客户端流传输到服务器。 服务器将下载图像,并将接收到的最新图像流式传输到向“ display_image”端点发出GET请求的客户端。 请注意,将映像下载到磁盘不是一个好习惯,而是要强调“源代码”和“接收器”的概念。

我们首先在build.sbt中添加以下两个依赖项:

Rajdeep Kambo是Hootsuite的Plan and Create团队的合作学生。 他目前在不列颠哥伦比亚大学学习计算机工程。