2

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

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

创建一个带有 base64 编码数据字段的事件"TlBZCAAAABXwBhsAAAACagVhZC1pZGkHc29tZS1pZA==",它解码为

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?

测试显示一个普通的地图作为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的错误报告中继续调查。

4

1 回答 1

2

传递一个ByteBufferJSON 字符串作为记录数据对我有用。

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

记录数据:"eyJhZC1pZCI6ImFkLXN0cmVhbSJ9",解码为:

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

这可以解决库中的任何编码问题,因为 Amazonica 在传递ByteBuffer.

于 2016-05-12T08:44:08.287 回答