2010-06-26 124 views
2

我正在研究客戶端需要向服務器發送一些命令的Clojure應用程序。這些會以相當大的數量發生,所以我希望它在處理和線上串行尺寸方面都是相當高效的。在Clojure/Java中將客戶端命令傳輸到服務器

在Clojure中做這件事的最好方法是什麼?

目前,我在想:

  • 創建一個簡單的標準表示如{:命令-ID 1,:PARAMS [1 2 3 「ABC」]}
  • 使用一些效率的Java庫如Kryo連載,並配置它瞭解的Clojure數據類型
  • 黑客一起適當的客戶機/服務器使用Java NIO庫實現使用TCP/IP傳輸的套接字實現

但是,這似乎有點複雜,我相信其他人已經想出了更智能的方法。任何想法/建議非常感謝!

回答

4

如果參數不是太大,來源可靠,爲什麼不把s表達式背部和堡壘,

(eval (read-string "(println \"Hello World\")")) 

的Clojure是一種Lisp方言代碼是數據。

編輯:

爲了安全起見,在字符串後,你對一組有效的命令檢查命令,

(contains? #{'println} 
      (first (read-string "(println \"Hello World\")"))) 

,或者您可以使用專爲這如

http://github.com/Licenser/clj-sandbox

+0

有趣的想法!如果你能弄清楚如何將輸入限制爲已知安全的命令,那麼對於一個客戶端可能會受到影響但可能工作得很好的互聯網通道可能有點冒險 – mikera 2010-06-26 16:56:29

+0

對於手動解決方案,請記住重新綁定' * read-eval *'爲'false'!儘管爲此解決方案可能是一個糟糕的主意, clj-sandbox可能會更健壯*和*更高效(如果您知道如何改進它,您可以通過分享您的想法來爲Clojure社區提供卓越的服務!)。 – 2010-06-26 20:23:42

+1

好吧,如果你過濾掉所有的函數調用並且只保留數據,那麼你只剩下一個Clojure版本的JSON。酷龍?主要區別可能是支持關鍵字,比率和正則表達式。 – 2010-06-28 14:05:40

1

我的答案不是Clojure特有的,但我傾向於使用字符串優先於http - 它的標準合理且效率合理。

幾乎每種語言都有用於JSON的庫,除非數據量很大,否則我會與之一起使用(以及簡單的標準命令格式)。

我的經驗是,你需要擺弄專門的格式,套接字和協議越少,你可以花上週末在海灘上度過的時間越多:)。

我會保留比http更復雜的JSON,直到基準測試顯示需要其他東西。

2

Google的協議緩衝區如何?有一個圖書館從Clojure處理它們:clojure-protobuf。我記得Freenode #clojure上的一個人正在做一個Haskell vs. OCaml與Clojure比較一個嚴肅的任務(處理大量的Twitter數據);他/她一直在讚美這個自由意志。

更新:Here是我想到的#cloudjure對話中的相關話語。

+1

是的,我回頭看了一下協議緩衝區,我似乎記得當時它看起來很不錯,但我更喜歡Kryo,因爲它有點m礦石動態(你可以編程定義你的序列化格式,而不是在一個固定的外部.proto文件中指定它) – mikera 2010-06-26 16:06:54

相關問題