Как форматировать данные для события 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 ответ:
Передача
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
.