json - 在 Clojure 中使用 Amazonica 时,应该如何格式化 Kinesis 事件的数据?

标签 json clojure amazon-kinesis amazonica

当我使用 AWS CLI 将事件放入流中时,我可以传入 JSON 并在从 Base64 解码后将其取回。当我尝试使用 Clojure 中的 Amazonica 放置事件时,我很难正确格式化事件数据参数。

(kinesis/put-record "ad-stream" {:ad-id "some-id"} "parition-key"))

创建一个带有 Base64 编码数据字段 “TlBZCAAABXwBhsAAAACagVhZC1pZGkHc29tZS1pZA==” 的事件,该事件解码为

NP�jad-idisome-id

如果我首先对数据进行 JSON 编码:

 (kinesis/put-record "ad-stream" (json/write-str {:ad-id "some-id-2"}) "parition-key")

然后我得到了一个垃圾字符较少的事件,但它仍然不太完美,不足以在不破坏某些内容的情况下在其他应用程序中阅读:

NPi{"ad-id":"some-id-2"}

将 Clojure 映射转换为 JSON 时,该主要垃圾的意义是什么?如何将一个简单的对象传递给 kinesis?

tests显示一个普通 map 作为 put-record 的数据参数传递,我还不明白为什么这对我不起作用:

  (let [data {:name "any data"
              :col  #{"anything" "at" "all"}
              :date now}
        sn (:sequence-number (put-record my-stream data (str (UUID/randomUUID))))]
    (put-record my-stream data (str (UUID/randomUUID)) sn))

  (Thread/sleep 3000)

  (def shard (-> (describe-stream my-stream)
               :stream-description
               :shards
               last
:shard-id))

更新

我非常确定这是库(或其使用的序列化器)中的错误,因此我将在错误报告中继续调查 https://github.com/mcohen01/amazonica/issues/211 .

最佳答案

传递 JSON 字符串的 ByteBuffer 作为记录数据对我有用。

(kinesis/put-record "ad-stream"
                    (-> {:ad-id "ad-stream"}
                        json/write-str .getBytes ByteBuffer/wrap)
                    "parition-key")

记录数据:“eyJhZC1pZCI6ImFkLXN0cmVhbSJ9”,解码为:

{"ad-id":"ad-stream"}

这可以解决库中的任何编码问题,因为 Amazonica 在传递 ByteBuffer 时会跳过编码。

关于json - 在 Clojure 中使用 Amazonica 时,应该如何格式化 Kinesis 事件的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37162175/

相关文章:

javascript - 如何分别制作DBconnection和Node.js查询文件

java - 如何在响应正文中返回 WireMock 服务器端口

macros - Clojure:def 在顶层之外使用时丢弃 ^:macro

emacs - 如何使用 Swank 和 SLIME 在 Emacs 中评估缓冲区和/或指令?

python - Terraform:验证错误...成员必须满足正则表达式模式:arn:aws:iam::

amazon-kinesis - 分片 [shardId-000000000000] 未关闭。如果我们在重新分片操作正在进行时构建了分片列表,就会发生这种情况

amazon-kinesis - 如何将 Java Kinesis 客户端库与 X-Ray 一起使用?

javascript - 如何设置通过给定 API 获取的图像的自动图像 slider

javascript - 如何使用 REST API 将 Parse.com 中的日期列设置为 NULL?

clojure 应用程序配置文件 - 吐出 pprint s-表达式的输出?