Передача команд от клиента на сервер в Clojure / Java - PullRequest
2 голосов
/ 26 июня 2010

Я работаю над приложением Clojure, где клиенту необходимо отправить некоторые команды на сервер. Это будет происходить в довольно больших объемах, поэтому я хотел бы, чтобы он был достаточно эффективным, как с точки зрения обработки, так и по сериализованному размеру по проводам.

Какой лучший способ сделать это в Clojure?

В настоящее время я думаю о:

  • Создание простого стандартного представления, например {: идентификатор команды 1,: params [1 2 3 "abc"]}
  • Сериализация с использованием некоторой эффективной библиотеки Java, такой как Kryo , и настройка ее для понимания типов данных Clojure
  • Сборка соответствующей реализации сокета клиент / сервер с использованием библиотек Java NIO для передачи по TCP / IP

Однако это кажется немного запутанным, и я уверен, что другие люди придумали более разумные подходы. Любые идеи / советы высоко ценится!

Ответы [ 3 ]

4 голосов
/ 26 июня 2010

Если параметры не слишком велики, а источнику доверяют, почему бы не отправить s-выражения назад и в форт,

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

Clojure, являющийся кодом диалекта LISP, является данными.

EDIT:

В целях безопасности после чтения строки вы проверяете команду на соответствие действительному набору команд,

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

или вы можете использовать библиотеку, предназначенную для этого, такую ​​как

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

2 голосов
/ 26 июня 2010

Как насчет протокольных буферов Google? Есть библиотека для работы с ними из Clojure: clojure-protobuf . Я помню, что кто-то на Freenode #clojure делал сравнение Haskell с OCaml с Clojure по серьезной задаче (обработка загрузок данных Twitter); он щедро хвалил библиотеку.

Обновление: Здесь - соответствующее высказывание из разговора #clojure, который я имел в виду.

1 голос
/ 26 июня 2010

Мой ответ не относится к Clojure, но я предпочитаю строки вместо http - это достаточно стандартно и достаточно эффективно.

Существуют библиотеки для JSON практически на каждом языке, я бы согласился с этим (вместе с вашим простым стандартным форматом команд), если объем данных не будет огромным.

По моему опыту, чем меньше вам нужно возиться со специализированными форматами, сокетами и протоколами, тем больше вероятность того, что вы сможете провести выходные на пляже :).

Я бы зарезервировал что-то более сложное, чем JSON, через http, пока тестирование не покажет необходимость чего-то еще.

...