在Clojure/Java中将客户端命令传输到服务器

问题描述:

我正在研究客户端需要向服务器发送一些命令的Clojure应用程序。这些会以相当大的数量发生,所以我希望它在处理和线上串行尺寸方面都是相当高效的。在Clojure/Java中将客户端命令传输到服务器

在Clojure中做这件事的最好方法是什么?

目前,我在想:

  • 创建一个简单的标准表示如{:命令-ID 1,:PARAMS [1 2 3 “ABC”]}
  • 使用一些效率的Java库如Kryo连载,并配置它了解的Clojure数据类型
  • 黑客一起适当的客户机/服务器使用Java NIO库实现使用TCP/IP传输的套接字实现

但是,这似乎有点复杂,我相信其他人已经想出了更智能的方法。任何想法/建议非常感谢!

如果参数不是太大,来源可靠,为什么不把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

我的答案不是Clojure特有的,但我倾向于使用字符串优先于http - 它的标准合理且效率合理。

几乎每种语言都有用于JSON的库,除非数据量很大,否则我会与之一起使用(以及简单的标准命令格式)。

我的经验是,你需要摆弄专门的格式,套接字和协议越少,你可以花上周末在海滩上度过的时间越多:)。

我会保留比http更复杂的JSON,直到基准测试显示需要其他东西。

Google的协议缓冲区如何?有一个图书馆从Clojure处理它们:clojure-protobuf。我记得Freenode #clojure上的一个人正在做一个Haskell vs. OCaml与Clojure比较一个严肃的任务(处理大量的Twitter数据);他/她一直在赞美这个*意志。

更新:Here是我想到的#cloudjure对话中的相关话语。

+1

是的,我回头看了一下协议缓冲区,我似乎记得当时它看起来很不错,但我更喜欢Kryo,因为它有点m矿石动态(你可以编程定义你的序列化格式,而不是在一个固定的外部.proto文件中指定它) – mikera 2010-06-26 16:06:54