Desde hace algún tiempo llevo teniendo ganas de meterle más caña al Pub/Sub de
Jabber, y más teniendo el componente instalado en nuestro servidor.
De nuevo, para el desinformado: pubsub es una tecnología estilo
PUSH, donde cualquier ente (JID en nuestro caso) puede
suscribirse a una fuente de datos. Si algún ente envía datos (publica) en dicha
fuente, se manda a todos los suscritos. Analogía: las listas de correo o
los grupos de noticias. Ventajas: XML, utilizable para consumo entre
aplicaciones o entre aplicaciones y usuario.
Pongamos un ejemplo: mi colega XuZo participa en el desarrollo de
un reproductor basado en GStreamer, eina. Pongamos que quiere saber qué
canciones reproducen más los usuarios, por simple curiosidad. Entonces,
podría utilizar pubsub para enviar ese dato a una fuente pubsub,
teniendo como único suscriptor a sí mismo (sería el caso de varios
publicadores y un único suscriptor o comunicación aplicación y
usuario). Otra posibilidad, jugando con la misma idea sería que el único
suscriptor fuese una pequeña aplicación encargada de hacer estadísticas
para luego publicarlas en otra fuente, a la que estaría suscrito XuZo.
Como vemos, se ha complicado un poco la cosa. El tercer ejemplo sea
quizá el más interesante: que las mismas instancias de eina publiquen en
un nodo o fuente (al que está suscrito el generador de estadísticas) y estén
suscritas a otro (en el que se publican las estadísticas). De esta
forma, eina podría mostrar en todo momento la canción más reproducida
por todos los usuarios de la aplicación en un momento dado.
En realidad, el envío de la canción en curso por parte de eina al
servicio de estadísticas no tiene porqué ser a través de pubsub, porque
no necesitamos el reenvío masivo.
Con esto espero haber explicado más o menos de qué va el asunto del
pubsub y porqué puede ser interesante este tipo de comunicaciones entre
aplicaciones.
El quid de la cuestión era otro. En el servidor de JabberEs tenemos
un componente pubsub, pero me resultaba imposible crear nodos (fuentes)
en él. Yo mandaba ésto:
<iq to='pubsub.jabberes.org'
type='set'
id='xx'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<create node='test/ja'/>
</pubsub>
</iq>
Que, en un principio, es correcto, tal y como dice el JEP. La respuesta,
sin embargo, no daba a entender que lo fuera:
<iq from='pubsub.jabberes.org'
to='peralta@jabberes.org/siemens/cert'
type='error' xml:lang='en' id='xx'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<create node='test/ja'/>
</pubsub>
<error code='405' type='cancel'>
<not-allowed
xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
</iq>
Resulta que el componente pubsub de
ejabberd (y, por consecuencia,
de JabberEs) quiere que los nodos se creen
en su sitio, lo que
significa, según el autor de ejabberd que mis nodos los debo crear en
home/jabberes.org/peralta/ (analogía un poco a los directorios
de usuario UNIX).
Pues ahora ya puedo jugar ;)