Мы решили пойти с BSON более RabbitMQ .
Нам нравится поддержка BSON для разнородных коллекций и отсутствие необходимости предварительно указывать формат сообщений.Мы не возражаем против того, что он имеет плохие характеристики использования пространства и, вероятно, более низкую производительность сериализации, чем другие форматы сообщений, поскольку не предполагается, что узкая часть нашего приложения для обмена сообщениями является узким местом.Не похоже, что был написан хороший интерфейс Clojure, чтобы позволить вам напрямую манипулировать объектами BSON, но, надеюсь, это не будет проблемой.Я пересмотрю эту запись, если мы решим, что BSON не сработает для нас.
Мы выбрали RabbitMQ главным образом потому, что уже имеем опыт работы с ним и используем его в системе, требующей высокой пропускной способности и доступности.
Если обмен сообщениями становится узким местом, мы сначала обратимся к BERT (мы отказались от него, потому что в настоящее время он не поддерживает Java), а затем к MessagePack (отклонено, поскольку кажется, что сообщество не слишком большое).разработчиков Java, использующих его), затем Avro (отклонено, поскольку требуется предварительно определить формат сообщения), затем буфер протокола (отклонено из-за дополнительного этапа генерации кода и отсутствия разнородных коллекций), а затем Thrift (отклонено дляпричины, упомянутые для буферов протокола).
Возможно, мы захотим использовать простую схему RPC, а не использовать очередь сообщений, поскольку наш стиль обмена сообщениями по существу синхронен «точка-точка».
Спасибоза ваш вклад всем!
Обновление: вотproject.clj
и core.clj
, которые показывают, как конвертировать карты Clojure в BSON и обратно:
;;;; project.clj
(defproject bson-demo "0.0.1"
:description "BSON Demo"
:dependencies [[org.clojure/clojure "1.2.0"]
[org.clojure/clojure-contrib "1.2.0"]
[org.mongodb/mongo-java-driver "2.1"]]
:dev-dependencies [[swank-clojure "1.3.0-SNAPSHOT"]]
:main core)
;;;; core.clj
(ns core
(:gen-class)
(:import [org.bson BasicBSONObject BSONEncoder BSONDecoder]))
(defonce *encoder* (BSONEncoder.))
(defonce *decoder* (BSONDecoder.))
;; XXX Does not accept keyword arguments. Convert clojure.lang.Keyword in map to java.lang.String first.
(defn map-to-bson [m]
(->> m (BasicBSONObject.) (.encode *encoder*)))
(defn bson-to-map [^BasicBSONObject b]
(->> (.readObject *decoder* b) (.toMap) (into {})))
(defn -main []
(let [m {"foo" "bar"}]
(prn (bson-to-map (map-to-bson m)))))