听说Clojure和Kinesis很搭配

我会说使用Clojure可以轻松地编写复杂的KCL应用程序。

1. Clojure和AWS

实际上,我对AWS并不是特别了解,但我觉得AWS的应用程序基本上是使用Java开发的。

当然,对于每种语言,都有相应的SDK可用,而且从人们的使用情况来看,他们喜欢使用各种语言如JS和Ruby。然而,当我尝试使用Kinesis时,我印象深刻地感受到使用Java的SDK可以得到更全面的支持。

如果可能的话,我不愿意写Java。更准确地说,我不想启动Eclipse。我想使用Emacs。

我这样想着,烦恼着该怎么办,但是突然想起了有这样一个合适的语言。

是的,是Clojure。

由于Clojure在JVM上运行,所以可以使用Java的资源。而且它是Lisp语言,非常与Emacs兼容。

亚马逊

而且,不仅仅是说可以使用Java的资源,但最终还是需要自己实现很多东西,而且连Clojure官方的SDK都没有。但是,确实有一些项目专门为Clojure进行了移植。

    Amazonica

很遺憾地,部分功能尚未實現,或存在一些遺漏的地方,但只要自己稍作改動,應該能解決。幸運的是,有很多Java程式碼的樣例可供參考,只需要用Clojure重新搞定即可。

动态技能

    Kinesis

因为我认为向使用 AWS Advent Calendar 的用户介绍 Kinesis 不太合适,所以我只简单概括一下。

如果用中文一句话来描述Kinesis,可以说它是类似于发布/订阅模型的大容量消息队列。

“然而,仅仅是一个消息队列而已,”

    只要在24小时内,可以从任何地方无论多少次地获取已经获得的数据,由于保持顺序性,不论获取多少次,都会按相同的顺序获得。

在这方面存在一些差异。
有几个值得关注的关键点,比如说

    1. 由于每次都要建立HTTPS连接,所以不适合连续同步发送以逗号为单位的数据。

最近好像实现了putRecords,但我还没有试过。

我不太明白PartitionKey的用途。

数据将根据PartitionKey分散到各个Shard上,但如果各个Shard的流量出现偏差,那也会造成麻烦。

有时候会因为一些方面而感到困惑。

若能各自優雅地進行設計,那就是一個好話。但可惜的是,Kinesis是一個完全托管的服務,它無法監視進程等等,這確實讓事情變得相對繁瑣。
因此,為了避免麻煩,本次不涉及與Fluentd有何不同、Kafka如何,以及最終如何使用等問題。

KCL
— 英国伦敦国王学院

在使用Kinesis时,基本上需要自己实现数据投放方(Publisher)和数据获取方(Subscriber)来充分利用Kinesis。

在这里,出版商方面并不会引起太大问题。

只需进行putRecord数据操作,并且没有特殊问题,因为Kinesis会很好地接收数据,所以很放心。网上也有很多示例供参考。

问题出在订户那边。这个情况有点棘手。

如果只是普通地使用Ruby等SDK,那么你需要自己管理Shard的数量,获取迭代器等操作会比想象中要繁琐很多。

当开始考虑到数据收集的管理或者在遇到障碍时的恢复问题时,手就会突然停下来。

同步循环处理仅通过增加Shard数量来处理大量记录的情况下,我们使用Kinesis的目的也变得不清晰。

在这种情况下,Kinesis Client Library非常有用。

想想看,使用KCL就可以解决我所提到的所有问题。

使用KCL的应用程序将为每个Shard启动一个Worker实例,并在单独的线程中运行,这使得编写应用程序时不需要特别关注Shard的数量也是可能的。
不必关注Shard这一事实,让我一时间想起了分区键的意义是什么,但无论如何,这是一件非常棒的事情。

使用Kinesis几乎必需的KCL,但遗憾的是目前仅支持Java。
我不清楚是线程相关还是进程管理的问题,但其他语言的用户只能无奈地望着。

然而,Clojure是不同的。这就是我想说的。

※似乎还有Python的选项,但实质上它与Java是一样的…

使用Clojure和KCL

如果使用KCL,应用程序的编写会变得很简单。但是,在涉及到Java的时候,对于业余爱好者来说,要确定将自己的代码写在哪个文件的哪个部分是非常困难的。

然而,使用amazonica.aws.kinesis时,事情将变得非常简单。

如果只是想制作一个Subscriber应用程序,那么在这次的讨论中,我们将跳过数据的“put”部分,然后使用(:use [amazonica.aws.kinesis])。

;; Amazonicaサンプルより
(worker! :app "app-name"
         :stream "my-stream"
         :processor (fn [records]
                      (doseq [row records]
                        (println (:data row)
                                 (:sequence-number row)
                                 (:partition-key row)))))

只需要写就可以。
在使用Ruby编写、从控制台调用API,还是用Java编写,都在Kinesis的世界里感到很麻烦,但是使用Clojure,你不觉得它立刻变得更亲近了吗?

请注意以下几点:首先,在应用程序中以app-name作为唯一标识的KCL应用程序,其提取的记录是基于使用java.nio.ByteBuffer,所以如果试图在其他语言中处理随便投入的数据,将会出现错误。其次,关于后者,如果查看Amazonica的文档或源代码,就会明白只需在(worker!)中指定:deserializer即可。

动作连接器库 qǐ kù)

顺便提一句,在Kinesis中有一个被称为Kinesis Connector Library的东西,总之就是关于用Java一个个创建记录对象很麻烦的事情,所以如果是简单的话,自己用Clojure实现也不是那么麻烦。

以前我为S3和Elasticsearch编写了一个类似连接器的东西,如果是简单的话我能很快写出来。不过毕竟Connector Library更加通用且功能强大,我认为如果有人能进行正式的移植的话当然是很好的。

为了避免最糟糕的情况,我可能会在现在或者今天晚些时候提交这个问题,然后再找到当时的源代码并进行补充。

4. 总结

我认为您能够理解使用Clojure可以轻松编写Kinesis应用程序的感觉。Clojure是一种非常容易学习的语言,是否考虑在使用AWS时选择Clojure作为起点呢?