Weitere ähnliche Inhalte Ähnlich wie Criando um Instant Messenger (14) Kürzlich hochgeladen (20) Criando um Instant Messenger2. Agenda
• Experimentar: por que ruby e rails?
• Botando a mão na massa
• Trocando idéias com o GoogleTalk
• Juntando tudo: Rails
• Distributed Ruby (DRb)
• Perguntas
3. Experimentar: por
que ruby e rails?
• Because we can!
• Rápidos resultados
• Criatividade e liberdade
4. Experimentar: por
que ruby e rails?
• Because we can!
• Rápidos resultados
• Criatividade e liberdade
6. Botando a mão na
massa (i)
• O que é XMPP/Jabber
• Trocar XMLs via rede
7. Botando a mão na
massa (i)
• O que é XMPP/Jabber
• Trocar XMLs via rede
• Autenticação e encriptação
8. Botando a mão na
massa (i)
• O que é XMPP/Jabber
• Trocar XMLs via rede
• Autenticação e encriptação
• Descentralizado
9. Botando a mão na
massa (i)
• O que é XMPP/Jabber
• Trocar XMLs via rede
• Autenticação e encriptação
• Descentralizado
• Extensível
12. Botando a mão na
massa (ii)
• Usos do XMPP
• Conversar
• Web Services
13. Botando a mão na
massa (ii)
• Usos do XMPP
• Conversar
• Web Services
• Robôs ajudantes
14. Botando a mão na
massa (ii)
• Usos do XMPP
• Conversar
• Web Services
• Robôs ajudantes
• Manutenção e deploy
18. Botando a mão na
massa (iii)
• XMPP
• JID
• Presence
• Messages
19. Botando a mão na
massa (iii)
JID’s:
vinibaggio@gmail.com/GTalk
• XMPP
vinibaggio@vinibaggio.com/Pidgin
• JID
• Presence
• Messages
20. Botando a mão na
massa (iii)
• XMPP
• JID
• Presence
• Messages
21. Botando a mão na
massa (iii)
<presence
from='xxxxx@gmail.com'
type='unavailable'
• XMPP
to='vinibaggio@gmail.com/
•JID chattyAB9DA217'
xmlns='jabber:client'/>
• Presence
• Messages
22. Botando a mão na
massa (iii)
• XMPP
• JID
• Presence
• Messages
23. Botando a mão na
massa (iii)
<message type='chat'
to='xxxxxxx@gmail.com'
• XMPPxmlns='jabber:client'>
<body>Nao fuja!</body>
•JID </message>
• Presence
• Messages
24. Botando a mão na
massa (iii)
• XMPP
• JID
• Presence
• Messages
27. Botando a mão na
massa (iv)
• XMPP em Ruby:
• XMPP4R
• XMPP4R::Simple
28. Botando a mão na
massa (iv)
• XMPP em Ruby:
• XMPP4R
• XMPP4R::Simple
• Net::XMPP
30. Trocando idéias com o
require ‘xmpp4r’
GoogleTalk
include Jabber
Jabber::debug = true
jid = Jabber::JID.new ‘vinibaggio@gmail.com/Chatty’
password = ‘*******’
client = Jabber::Client.new jid
client.connect ‘talk.google.com’
client.auth password
client.send Presence.new
@clients[email] = client
31. Trocando idéias com o
require ‘xmpp4r’
GoogleTalk
include Jabber
Type: Status:
Jabber::debug (available)
nil = true nil (available)
:error :away
jid = Jabber::JID.new ‘vinibaggio@gmail.com/Chatty’
:probe :chat
password = ‘*******’
:subscribe :dnd
:subscribed :xa
client = Jabber::Client.new jid
:unavailable
client.connect ‘talk.google.com’
:unsubscribe
client.auth password
:unsubscribed
client.send Presence.new
@clients[email] = client
32. Trocando idéias com o
GoogleTalk
client.add_message_callback do |msg|
unless msg.type == :error or msg.body.nil?
push_msg msg
end
end
client.add_presence_callback do |presence|
push_presence presence
end
33. Trocando idéias com o
GoogleTalk
def push_msg(msg)
from = msg.from.bare.to_s
to = msg.to.bare.to_s
body = msg.body
new_msg = {:body => body, :from => from}
@msg_stack[to].push new_msg
end
34. Trocando idéias com o
GoogleTalk
def push_presence(presence)
from = presence.from.bare.to_s
to = presence.to.bare.to_s
if presence.type == :unavailable
status = :unavailable
else
status = presence.show || :available
end
new_presence = {:status => status, :from => from}
@presence_stack[to].push new_presence
end
36. Trocando idéias com o
class XMPPConnector
GoogleTalk
include Singleton
def login(email, password); ...; end;
def get_presences(jid); ...; end;
def get_messages(jid); ...; end;
def send_message(jid, to, msg); ...; end;
def set_status(jid, status); ...; end;
def logout(jid); ...; end;
private
def check_timeout; ...; end;
def push_msg(msg); ...; end;
def push_presence(msg); ...; end;
end
37. Trocando idéias com o
GoogleTalk
connector = XMPPConnector.instance
jid = connector.login(‘vinibaggio@gmail.com’, ‘*****’)
msgs = connector.get_messages(jid)
presences = connector.get_presences(jid)
connector.send_message(jid, ‘xxxx@gmail.com’, ‘Oi!’)
connector.set.status(jid, :dnd);
40. Juntando tudo: Rails
require ‘xmppconnector’
class MessengerController < ApplicationController
filter_parameter_logging :password
def login
email = params[:email]
password = params[:password]
xmpp = XMPPConnector.instance
session[:jid] = xmpp.login(email, password)
render :action => ‘chat’
end
...
end
50. Tipo de request: Login (Mongrel simples)
Messenger#login(vinibaggio)
MessengerController::login
localhost:3000/login XMPP Layer
Request joao
App Rails
dispatcher maria
* vinibaggio
localhost:3000/chat
:render => quot;chatquot; OK
mongrel simples
51. Tipo de request: Login (mod_rails)
Messenger#login(vinibaggio)
MessengerController::login
XMPP Layer 1
Instância
joao
Rails 1 maria
XMPP Layer 2
Instância
localhost:3000/login
Request vitor
Rails 2 * vinibaggio
dispatcher
localhost:3000/chat
XMPP Layer 5
Instância
pedro
Rails 5 paulo
:render => quot;chatquot; OK
mod_rails (Passenger)
52. Tipo de request: Send_msg (mod_rails)
Messenger#send_msg(vinibaggio)
MessengerController::send_msg
XMPP Layer 1
Instância joao
Rails 1 maria
ERROR
XMPP Layer 2
Instância
localhost:3000/send_msg
Request vitor
Rails 2 vinibaggio
dispatcher
localhost:3000/timeout
flash[:error] = quot;Invalid
connectionquot;
XMPP Layer 5
Instância
pedro
Rails 5 paulo
mod_rails (Passenger)
55. require ‘drb’
r = DRbObject.new nil, ‘druby://localhost:6666’
while true
puts r.size
r << 1
puts r.size
sleep 10
end
Cliente
56. A
Tempo
0
0s
1 B
1
5s
2
2
10s
3
3
15s
4
57. Arquitetura com mod_rails + DRb
Instância
Rails 1
RemoteXMPP
Requests Instância
joao
Request Rails 2 maria
dispatcher pedro
paulo
Response vitor
vinibaggio
Instância
Rails 5
mod_rails
59. Rails + DRb
require ‘xmppconnector’
class MessengerController < ApplicationController
filter_parameter_logging :password
def login
...
end
def xmpp
DRbObject.new nil, ‘druby://localhost:6666’
end
...
end
60. That’s it!
• Relembrando...
• Biblioteca XMPP4R para XMPP
• Rails para fazer a interface
• Paralelizando a arquitetura
• Distributed Ruby (DRb)