jkn*_*rkn 14 ruby java messaging clojure network-protocols
我们有云托管(RackSpace云)Ruby和Java应用程序,它们将按如下方式进行交互:
我们感兴趣的是评估消息传递格式(JSON,缓冲区协议,Thrift等)以及消息传输通道/技术(套接字,消息队列,RPC,REST,SOAP等).
我们的标准:
你会推荐什么样的消息格式和传输方法?为什么?
我在这里收集了一些我们已经收集过的材料供审查:
我们喜欢 BSON 对异构集合的支持,并且不需要预先指定消息的格式。我们不介意它具有较差的空间使用特性,并且可能比其他消息格式更差的序列化性能,因为我们应用程序的消息传递部分预计不会成为瓶颈。看起来并没有编写一个很好的 Clojure 接口来让您直接操作 BSON 对象,但希望这不会成为问题。如果我们认为 BSON 不适合我们,我将修改此条目。
我们选择 RabbitMQ 主要是因为我们已经有使用它的经验,并且正在需要高吞吐量和可用性的系统中使用它。
如果消息传递确实成为瓶颈,我们将首先关注 BERT(我们拒绝了它,因为它目前似乎没有 Java 支持),然后关注 MessagePack(拒绝了,因为似乎没有大型 Java 开发人员社区使用它),然后是 Avro(被拒绝,因为它要求您预先定义消息格式),然后是 Protocol Buffers(因为额外的代码生成步骤和缺乏异构集合而被拒绝),然后是 Thrift(因为 Protocol 提到的原因被拒绝)缓冲器)。
我们可能想要使用普通的 RPC 方案而不是使用消息队列,因为我们的消息传递风格本质上是同步点对点。
感谢大家的意见!
更新:这里展示了project.clj如何core.clj将 Clojure 映射转换为 BSON 并返回:
;;;; 项目.clj
(defproject bson-demo“0.0.1”
  :描述“BSON 演示”
  :依赖关系 [[org.clojure/clojure "1.2.0"]
                 [org.clojure/clojure-contrib“1.2.0”]
                 [org.mongodb/mongo-java-driver“2.1”]]
  :开发依赖项 [[swank-clojure“1.3.0-SNAPSHOT”]]
  :主要核心)
;;;; 核心.clj
(ns 核心
  (:gen 级)
  (:import [org.bson BasicBSONObject BSONEncoder BSONDecoder]))
(defonce *编码器*(BSONencoder。))
(defonce *解码器*(BSONDecoder。))
;; XXX 不接受关键字参数。首先将map中的clojure.lang.Keyword转换为java.lang.String。
(defn 映射到 bson [m]
  (->> m (BasicBSONObject.) (.encode *编码器*)))
(defn bson-to-map [^BasicBSONObject b]
  (->> (.readObject *解码器* b) (.toMap) (进入 {})))
(defn-主[]
  (让 [m {"foo" "bar"}]
    (prn (bson-to-map (map-to-bson m)))))
        | 归档时间: | 
 | 
| 查看次数: | 2433 次 | 
| 最近记录: |