Clojure(Java)和Ruby应用程序通信的最快可靠方式

jkn*_*rkn 14 ruby java messaging clojure network-protocols

我们有云托管(RackSpace云)Ruby和Java应用程序,它们将按如下方式进行交互:

  1. Ruby应用程序向Java应用程序发送请求.请求由包含字符串,整数,其他映射和列表(类似于JSON)的映射结构组成.
  2. Java应用程序分析数据并将回复发送给Ruby App.

我们感兴趣的是评估消息传递格式(JSON,缓冲区协议,Thrift等)以及消息传输通道/技术(套接字,消息队列,RPC,REST,SOAP等).

我们的标准:

  1. 往返时间短.
  2. 往返时间标准偏差小.(我们了解垃圾收集暂停和网络使用高峰会影响此值).
  3. 高可用性.
  4. 可伸缩性(我们可能希望将来有多个Ruby和Java应用程序交换点对点消息).
  5. 易于调试和分析.
  6. 良好的文档和社区支持.
  7. Clojure支持的奖励积分.
  8. 良好的动态语言支持.

你会推荐什么样的消息格式和传输方法?为什么?

我在这里收集了一些我们已经收集过的材料供审查:

jkn*_*rkn 3

我们决定使用BSON而不是RabbitMQ

我们喜欢 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)))))