簡體   English   中英

在 Clojure 中使用 Amazonica 時,我應該如何格式化 Kinesis 事件的數據?

[英]How should I format data for a Kinesis event when using Amazonica in Clojure?

當我使用 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 上的錯誤報告中繼續調查。

傳遞 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時會跳過編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM