2009-07-22 15 views
14

Todo lo que quiero hacer es hacer algunas llamadas RPC sobre sockets. Tengo un servidor que hace cosas backendish ejecutando jython 2.5. Necesito hacer algunas llamadas desde un servidor frontend ejecutando Django en CPython. He estado golpeándome la cabeza contra la pared y estoy poniendo en marcha cualquier forma de IPC.fast-ish python/jython IPC?

La lista de cosas que he intentado:

  • Apache Thrift no tiene ningún liberaciones reales, sólo instantáneas. Me gustaría usar algo estable.
  • JSON-RPC es interesante, y debería ser capaz de ejecutar sockets, pero en la práctica la mayoría de los implementations solo parecen funcionar a través de HTTP. La sobrecarga HTTP es exactamente lo que trato de evitar.
  • Protocol Buffers es realmente solo un protocolo de serialización. Por lo que veo, protobuf proporciona generación de interfaz para RPC, pero solo es la interfaz. En realidad, escribir todo el código de conexión depende del usuario. Si voy a quedar atrapado usando sockets, solo usaré JSON para la serialización. Es más simple y faster.
  • Pyro no funciona correctamente con Jython como servidor. Algún tipo de problema de tiempo de espera del socket. He enviado un mensaje a la lista de correo.
  • pysage ¡Yay para el mensaje que pasa! Solo requiere Python 2.6 o el módulo de procesamiento (que ha compilado extensiones). Jython es la versión 2.5 y no permite extensiones compiladas.
  • Candygram es una alternativa interesante a pysage, pero hasta donde puedo decir que no se ha mantenido. Ni siquiera lo he probado con Jython. Alguna experiencia con eso?
  • Twisted Perspective Broker Twisted no funciona en Jython.

Sé que sería muy fácil hacer esto con XML-RPC, lo que me pone aún más de mal humor. Quiero evitar la sobrecarga de HTTP, pero al mismo tiempo, realmente no quiero ensuciarme con sockets para implementar mi propio protocolo. Lo haré mal si lo hago.

¿Alguna idea? Probablemente voy a llorar durante unos 20 minutos y luego simplemente usar XML-RPC.

+0

por cierto, acabo de encontrar esta solución a mi pregunta: http://bert-rpc.org/ – Kobold

Respuesta

6

¿Has considerado Hessian? A partir de la propaganda:

El servicio web binaria de Hesse protocolo hace que los servicios web de utilidad sin necesidad de un marco grande, y sin tener que aprender un nuevo alfabeto sopa de protocolos. Debido a que es un protocolo binario, es adecuado para enviar datos binarios sin necesidad de extender el protocolo con archivos adjuntos.

Tiene el cliente de Python y el servidor de Java (y más, además).

Actualización: Si estás en contra de HTTP, ¿por qué no utilizas SocketServer y pickle? No se necesita mucho protocolo, es difícil equivocarse. Enviar/recibir cadenas escaneadas con prefijos de longitud.

+0

de Hesse utiliza HTTP, lo que me gustaría evitar. – Kobold

0

¿Has pensado en usar CORBA? Es rápido, portátil y orientado a objetos ...

Solo lo he usado en el lado de Java (creo que podrías usar un agente de java puro sin problemas de Jython), y con IIOP deberías ser capaz de interoperar con el cliente de CPython.

+0

Puede muy bien llegar a eso. En este momento, nuestra interfaz está evolucionando bastante rápido, y CORBA parece demasiado pesado. Pero sí, la idea se me ocurrió. – Kobold

+0

No creo que sea demasiado pesado, en cuanto a rendimiento o memoria, también se usa en sistemas integrados ... si quiere decir que puede ser demasiado engorroso implementar todos los servicios que puede proporcionar y probablemente no sea así. use, sí, entonces está muy bien^_^ – fortran

2

dos que se parecen los más interesantes para mí:

  • Gearman y Python bindings. Es bastante más rápido ahora que ha sido reescrito en C (originalmente perl). Se usa en producción (aunque no puedo señalar ningún ejemplo de los enlaces de python que se usan en producción). Tiene interfaces muy interesantes (para mí) en MySQL y Postgresql. Finalmente, todays tweet de Jacob Kaplan-Moss de Django.

  • RabbitMQ aunque es solo una cola de mensajes, igual tendrá que serializar sus propios mensajes a menos que también use celery.

+0

Actualmente estamos usando carrot/RabbitMQ para realizar llamadas a este servidor de forma asincrónica, pero ahora nos gustaría realizar llamadas sincrónicas. Estoy seguro de que podría construir eso en la cola, pero no es obvio cómo hacerlo en el buen sentido. – Kobold

2

Mi favorito .. zeroc's ice

+0

El hielo se ve muy interesante. No somos un proyecto abierto, entonces investigaré cuánto cuesta una licencia comercial. – Kobold