1. Universidad de Oviedo Programa de extensión universitaria
CLOUD COMPUTING.
DESARROLLO DE APLICACIONES Y
MINERÍA WEB
Miguel Fernández Fernández
miguelff@innova.uniovi.es
3. ¿Qué es XMPP?
antesJabber
Extensible Messaging and Presence Protocol
Envío de mensajes en tiempo real
Codificados en XML
Transportados sobre TCP y UDP (media)
http://xmpp.org
5. ¿Por qué XMPP?
para la Web
HTTP
Half-duplex
stateless
c
s
normal polling (AJAX)
c
s
long polling (Comet)
6. ¿Por qué XMPP?
para la Web
HTTP XMPP
Half-duplex Full-duplex
stateless stateful
c
s
normal polling (AJAX)
c
s
long polling (Comet)
7. ¿Por qué XMPP?
para la Web
HTTP XMPP
Half-duplex Full-duplex
stateless stateful
c
s c
normal polling (AJAX)
c
s
conexión persistente
s
long polling (Comet)
10. La red XMPP: Entidades
Servidores
Clientes
Componentes
Plugins
11. Servidores
Enrutan mensajes
Hablan con clientes y otros servidores
FOSS: Ejabberd, Openfire, Tigase
12. Clientes
Humanos y robots
Protocolo cliente-servidor
13. Componentes
Extienden la funcionalidad del servidor
Tienen su propia identidad y dirección
Se ejecutan fuera del mismo
Se comunican con un protocolo específico
Ejemplo típico: Multichat
14. Plugins
Mismo propósito que los componentes
También tienen identidad y dirección
No hay IPC mayor rendimiento
15. Direccionamiento en XMPP
JIDs: almenos uno por cada entidad
local@dom.ain/resource
it@miinterprete.appspotchat.com/adium
Bare JID
Full JID
20. XMPP Stanzas
<stream:stream>
<iq type="get">
<query xmlns="jabber:iq:roster"/> Dame mis contactos
</iq>
<presence/> Estoy online
<message to="bar@otherside.com" from="foo@oneside.com/adium" type="chat">
<body>Tomamos algo?</body>
</message>
<presence type="unavailable"/>
</stream:stream> Dile a bar que si
tomamos algo
21. XMPP Stanzas
<stream:stream>
<iq type="get">
<query xmlns="jabber:iq:roster"/> Dame mis contactos
</iq>
<presence/> Estoy online
<message to="bar@otherside.com" from="foo@oneside.com/adium" type="chat">
<body>Tomamos algo?</body>
</message>
<presence type="unavailable"/>
</stream:stream> Dile a bar que si
Ya no estoy disponible tomamos algo
23. Acercando XMPP a la Web
Pre HTML 5
Comunicación basada en HTTP
AJAX & Long Polling
Bidirectional-Streams over
synchronous HTTP
24. AJAX & Long Polling
AJAX (muestreo frecuente) Comet (Long Polling)
setInterval(function(){ function load(){
// pedimos cada 500 milisegundos esperando cambio $.ajax({ url: '/my/page', success: function(){
$.ajax({ url: '/my/page', success: function(data){} }); // abrimos la conexión durante 20 segundos
}, 500); }, complete: load, timeout: 20000 });
}
Latencia (200ms/petición) Reducción dramática de latencia
Muchas peticiones no recogeran cambios Mucho más eficiente
Se genera mucho tráfico
25. BOSH, XMPP sobre HTTP
Flujos bidireccionales sobre HTTP síncrono
Usa pares de petición-respuesta para simular
Requiere de un proxy que dirija los stanzas al servidor XMPP
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 483
<body xmpp:version='1.0'
authid='ServerStreamID'
xmlns='http://jabber.org/protocol/httpbind'
xmlns:xmpp='urn:xmpp:xbosh'
xmlns:stream='http://etherx.jabber.org/streams'>
<stream:features>
<mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
<mechanism>SCRAM-SHA-1</mechanism>
<mechanism>PLAIN</mechanism>
</mechanisms>
</stream:features>
</body>
http://xmpp.org/extensions/xep-0206.html
26. HTML5 Websockets
HTML 5
WebSockets
To enable Web applications to maintain bidirectional
communications with server-side processes, this
specification introduces the WebSocket interface.
Gecko 2.0b4 (24/08/2010) (Firefox 4 Nighties)
Soportado en: Webkit 333 (Safari 4, Chrome >4)
27. HTML5 Websockets
HTML 5
WebSockets
To enable Web applications to maintain bidirectional
communications with server-side processes, this
specification introduces the WebSocket interface.
c
s
conexión persistente
Gecko 2.0b4 (24/08/2010) (Firefox 4 Nighties)
Soportado en: Webkit 333 (Safari 4, Chrome >4)
28. El contrato Websocket
[Constructor(in DOMString url, in optional DOMString protocols)]
[Constructor(in DOMString url, in optional DOMString[] protocols)]
interface WebSocket {
readonly attribute DOMString url; ws://services.com/service
// ready state
const unsigned short CONNECTING = 0;
const unsigned short OPEN = 1;
const unsigned short CLOSING = 2;
const unsigned short CLOSED = 3;
readonly attribute unsigned short readyState; estado de
readonly attribute unsigned long bufferedAmount; la conexión
// networking
attribute Function onopen;
attribute Function onmessage;
Recepción de eventos
attribute Function onerror;
attribute Function onclose;
readonly attribute DOMString protocol;
void send(in DOMString data); Envío de mensajes
void close();
};
WebSocket implements EventTarget;
39. Multichat en 23LOC
require 'rubygems'
require 'eventmachine-websocket'
connections=[]
indexes={}
EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |con|
con.on_open do
indexes[con]=connections.size+1
con.send "<p class="highlight">Eres el cliente #{indexes[con]}<p>"
connections.each{ |c| c.send "<p class="highlight">El cliente #{indexes[con]} ha entrado en la sala<p>" }
connections << con
end
con.on_message do |msg|
connections.each{ |c| c.send "<p><span class="cliente">Cliente #{indexes[con]}:</span> #{msg}</p>" }
end
con.on_close do
c.send "<p class="highlight">Has abandonado la sala</p>"
connections.delete con
indexes.delete con
end
end
40.
41. Conclusiones
• Hastala aparición de HTML5, XMPP tenía unas expectativas
muy altas como alternativa a Comet.
• Sinembargo, se han cancelado muchos servicios XMPP para
el consumo de datos en tiempo real (Twitter firehose API)
• Websocket se presenta como una alternativa más simple y
elegante para la implementación de servicios Web de tiempo
real
• XMPP no pierde fuerza para mensajería instantánea
44. Universidad de Oviedo Programa de extensión universitaria
CLOUD COMPUTING.
DESARROLLO DE APLICACIONES Y
MINERÍA WEB
Miguel Fernández Fernández
miguelff@innova.uniovi.es