2009-07-22 15 views
14

Tutto ciò che voglio fare è effettuare alcune chiamate RPC su socket. Ho un server che fa cose di backendish che eseguono jython 2.5. Devo effettuare alcune chiamate da un server di frontend che esegue Django su CPython. Ho battuto la mia testa contro un muro per ottenere qualsiasi forma di IPC.quick-ish python/jython IPC?

La lista delle cose che ho provato:

  • Apache Thrift non ha una release reali, solo istantanee. Mi piacerebbe usare qualcosa di stabile.
  • JSON-RPC è interessante e dovrebbe essere in grado di eseguire le prese, ma in pratica la maggior parte del implementations sembra funzionare solo su HTTP. L'overhead HTTP è esattamente quello che sto cercando di evitare.
  • Protocol Buffers è in realtà solo un protocollo di serializzazione. Da quanto ho capito, protobuf fornisce la generazione di interfacce per RPC, ma è solo l'interfaccia. In realtà scrivere tutto il codice di connessione è compito dell'utente. Se dovessi rimanere bloccato usando le prese, userò semplicemente JSON per la serializzazione. È più semplice e faster.
  • Pyro non funziona correttamente con Jython come server. Una sorta di problema di timeout del socket. Ho inviato un messaggio alla mailing list.
  • pysage Yay per il passaggio di messaggi! Solo richiede python 2.6 o il modulo di elaborazione (che ha estensioni compilate). Jython è la versione 2.5 e non consente estensioni compilate.
  • Candygram è un'interessante alternativa al pysage, ma per quanto posso dire è non mantenuto. Non l'ho nemmeno provato con Jython. Qualche esperienza con esso?
  • Twisted Perspective Broker Twisted non funziona su Jython.

So che sarebbe un gioco da ragazzi farlo con XML-RPC, il che mi rende ancora più irritabile. Voglio evitare il sovraccarico di HTTP, ma allo stesso tempo non voglio davvero deprimermi con i socket per implementare il mio protocollo. Lo farò male se lo faccio.

Qualche idea? Probabilmente starò a piangere per circa 20 minuti e poi userò semplicemente XML-RPC.

+0

btw, ho appena trovato questa soluzione alla mia domanda: http://bert-rpc.org/ – Kobold

risposta

6

Avete considerato Hessian? Dal Blurb:

Il servizio web binario dell'Assia protocollo rende servizi web fruibili senza richiedere un grande quadro, e senza dover imparare ancora un'altra minestra alfabeto dei protocolli. Perché è un protocollo binario, è adatto per l'invio di dati binari senza la necessità di estendere il protocollo con allegati.

Ha client Python e server Java (e altro ancora).

Aggiornamento: Se sei morto contro HTTP, perché non usare solo SocketServer e pickle? Non serve gran parte del protocollo, è difficile sbagliare. Invia/ricevi stringhe decapate con prefissi di lunghezza.

+0

Hessian usa HTTP, che vorrei evitare. – Kobold

0

Hai mai pensato di utilizzare CORBA? È veloce, portatile e orientato agli oggetti ...

L'ho usato solo sul lato Java (penso che potreste usare un puro java broker senza problemi da Jython), e con IIOP dovreste essere in grado di interoperare con il client CPython.

+0

Potrebbe benissimo arrivare a questo. In questo momento la nostra interfaccia si sta evolvendo piuttosto velocemente e CORBA sembra troppo pesante. Ma sì, il pensiero mi è venuto in mente. – Kobold

+0

Non penso che sia troppo pesante, nel senso delle prestazioni o dell'impronta di memoria, è usato anche nei sistemi embedded ... se vuoi dire che può essere troppo ingombrante per implementare tutti i servizi che può fornire e probabilmente non lo farai usa, sì, allora hai perfettamente ragione^_^ – fortran

2

Due che guarda la più interessante per me:

  • Gearman e Python bindings. È un po 'più veloce ora che è stato riscritto in C (originariamente perl). È usato in produzione (anche se non posso indicare alcun esempio dei binding Python usati nella produzione). Ha un'interfaccia molto interessante (per me) in MySQL e Postgresql. Infine, todays tweet da Django's Jacob Kaplan-Moss.

  • RabbitMQ anche se si tratta solo di una coda di messaggi, sarà comunque necessario serializzare i propri messaggi, a meno che non si usi anche celery.

+0

Attualmente stiamo utilizzando carrot/RabbitMQ per effettuare chiamate a questo server in modo asincrono, ma ora vorremmo effettuare chiamate sincrone. Sono sicuro che potrei costruirlo sopra la coda, ma non è ovvio come farlo in senso buono. – Kobold

2

Il mio preferito .. zeroc's ice

+0

Il ghiaccio sembra molto interessante. Non siamo un progetto aperto, quindi esaminerò quanto costa una licenza commerciale. – Kobold