Как форматировать данные для события Kinesis при использовании Amazonica в Clojure?


Когда я помещаю событие в поток с помощью AWS CLI, я могу передать JSON и получить его обратно, после декодирования из base64. Когда я пытаюсь поставить события с помощью Амазонки, с помощью Clojure, я имею трудное время форматирования данных событий, хотя правильно параметр.

(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? Как передать простой объект в Кинезис?

Тесты показывают, что простая карта передается в качестве параметра данных 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 .

1 2

1 ответ:

Передача ByteBuffer строки JSON в качестве данных записи работает для меня.

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

Запись данных: "eyJhZC1pZCI6ImFkLXN0cmVhbSJ9", которая декодируется в:

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

Это работает вокруг любой проблемы кодирования в библиотеке, потому что Amazonica пропускает кодирование, когда оно передается ByteBuffer.