criando um instant messenger

61
Criando um Instant Messenger com Rails Vinícius Baggio Fuentes

Upload: vinibaggio

Post on 26-Jun-2015

2.095 views

Category:

Technology


1 download

DESCRIPTION

Essa é a minha palestra no evento Ruby + Rails no mundo real, falando sobre a criação de um instant messenger em ruby e rails.

TRANSCRIPT

Page 1: Criando um Instant Messenger

Criando um Instant Messenger com Rails

Vinícius Baggio Fuentes

Page 2: Criando um Instant Messenger

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

Page 3: Criando um Instant Messenger

Experimentar: por que ruby e rails?

• Because we can!

• Rápidos resultados

• Criatividade e liberdade

Page 4: Criando um Instant Messenger

Experimentar: por que ruby e rails?

• Because we can!

• Rápidos resultados

• Criatividade e liberdade

Page 5: Criando um Instant Messenger

Botando a mão na massa (i)

• O que é XMPP/Jabber

Page 6: Criando um Instant Messenger

Botando a mão na massa (i)

• O que é XMPP/Jabber

• Trocar XMLs via rede

Page 7: Criando um Instant Messenger

Botando a mão na massa (i)

• O que é XMPP/Jabber

• Trocar XMLs via rede

• Autenticação e encriptação

Page 8: Criando um Instant Messenger

Botando a mão na massa (i)

• O que é XMPP/Jabber

• Trocar XMLs via rede

• Autenticação e encriptação

• Descentralizado

Page 9: Criando um Instant Messenger

Botando a mão na massa (i)

• O que é XMPP/Jabber

• Trocar XMLs via rede

• Autenticação e encriptação

• Descentralizado

• Extensível

Page 10: Criando um Instant Messenger

Botando a mão na massa (ii)

• Usos do XMPP

Page 11: Criando um Instant Messenger

Botando a mão na massa (ii)

• Usos do XMPP

• Conversar

Page 12: Criando um Instant Messenger

Botando a mão na massa (ii)

• Usos do XMPP

• Conversar

• Web Services

Page 13: Criando um Instant Messenger

Botando a mão na massa (ii)

• Usos do XMPP

• Conversar

• Web Services

• Robôs ajudantes

Page 14: Criando um Instant Messenger

Botando a mão na massa (ii)

• Usos do XMPP

• Conversar

• Web Services

• Robôs ajudantes

• Manutenção e deploy

Page 15: Criando um Instant Messenger

Botando a mão na massa (iii)

• XMPP

Page 16: Criando um Instant Messenger

Botando a mão na massa (iii)

• XMPP

• JID

Page 17: Criando um Instant Messenger

Botando a mão na massa (iii)

• XMPP

• JID

• Presence

Page 18: Criando um Instant Messenger

Botando a mão na massa (iii)

• XMPP

• JID

• Presence

• Messages

Page 19: Criando um Instant Messenger

Botando a mão na massa (iii)

• XMPP

• JID

• Presence

• Messages

JID’s:[email protected]/GTalk

[email protected]/Pidgin

Page 20: Criando um Instant Messenger

Botando a mão na massa (iii)

• XMPP

• JID

• Presence

• Messages

Page 21: Criando um Instant Messenger

Botando a mão na massa (iii)

• XMPP

• JID

• Presence

• Messages

<presence from='[email protected]' type='unavailable' to='[email protected]/chattyAB9DA217' xmlns='jabber:client'/>

Page 22: Criando um Instant Messenger

Botando a mão na massa (iii)

• XMPP

• JID

• Presence

• Messages

Page 23: Criando um Instant Messenger

Botando a mão na massa (iii)

• XMPP

• JID

• Presence

• Messages

<message type='chat' to='[email protected]' xmlns='jabber:client'>

<body>Nao fuja!</body></message>

Page 24: Criando um Instant Messenger

Botando a mão na massa (iii)

• XMPP

• JID

• Presence

• Messages

Page 25: Criando um Instant Messenger

Botando a mão na massa (iv)

• XMPP em Ruby:

Page 26: Criando um Instant Messenger

Botando a mão na massa (iv)

• XMPP em Ruby:

• XMPP4R

Page 27: Criando um Instant Messenger

Botando a mão na massa (iv)

• XMPP em Ruby:

• XMPP4R

• XMPP4R::Simple

Page 28: Criando um Instant Messenger

Botando a mão na massa (iv)

• XMPP em Ruby:

• XMPP4R

• XMPP4R::Simple

• Net::XMPP

Page 29: Criando um Instant Messenger

Trocando idéias com o GoogleTalk

Page 30: Criando um Instant Messenger

Trocando idéias com o GoogleTalk

require ‘xmpp4r’

include JabberJabber::debug = true

jid = Jabber::JID.new ‘[email protected]/Chatty’password = ‘*******’

client = Jabber::Client.new jidclient.connect ‘talk.google.com’client.auth passwordclient.send Presence.new@clients[email] = client

Page 31: Criando um Instant Messenger

Trocando idéias com o GoogleTalk

require ‘xmpp4r’

include JabberJabber::debug = true

jid = Jabber::JID.new ‘[email protected]/Chatty’password = ‘*******’

client = Jabber::Client.new jidclient.connect ‘talk.google.com’client.auth passwordclient.send Presence.new@clients[email] = client

Type: Status:nil (available) nil (available):error :away:probe :chat:subscribe :dnd:subscribed :xa:unavailable:unsubscribe:unsubscribed

Page 32: Criando um Instant Messenger

Trocando idéias com o GoogleTalk

client.add_message_callback do |msg|unless msg.type == :error or msg.body.nil?

push_msg msgend

end

client.add_presence_callback do |presence|push_presence presence

end

Page 33: Criando um Instant Messenger

Trocando idéias com o GoogleTalk

def push_msg(msg)from = msg.from.bare.to_sto = msg.to.bare.to_sbody = msg.body

new_msg = {:body => body, :from => from}@msg_stack[to].push new_msg

end

Page 34: Criando um Instant Messenger

Trocando idéias com o GoogleTalkdef push_presence(presence)

from = presence.from.bare.to_sto = presence.to.bare.to_sif presence.type == :unavailable

status = :unavailableelse

status = presence.show || :availableendnew_presence = {:status => status, :from => from}@presence_stack[to].push new_presence

end

Page 35: Criando um Instant Messenger

Trocando idéias com o GoogleTalk

client.close

Page 36: Criando um Instant Messenger

Trocando idéias com o GoogleTalk

class XMPPConnectorinclude Singletondef 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;privatedef check_timeout; ...; end;def push_msg(msg); ...; end;def push_presence(msg); ...; end;

end

Page 37: Criando um Instant Messenger

Trocando idéias com o GoogleTalk

connector = XMPPConnector.instancejid = connector.login(‘[email protected]’, ‘*****’)msgs = connector.get_messages(jid)presences = connector.get_presences(jid)connector.send_message(jid, ‘[email protected]’, ‘Oi!’)connector.set.status(jid, :dnd);

Page 38: Criando um Instant Messenger

Juntando tudo: Rails

Acabou a parte do XMPP!Vamos pro Rails!!

Page 39: Criando um Instant Messenger
Page 40: Criando um Instant Messenger

Juntando tudo: Railsrequire ‘xmppconnector’

class MessengerController < ApplicationControllerfilter_parameter_logging :passworddef login

email = params[:email]password = params[:password]xmpp = XMPPConnector.instancesession[:jid] = xmpp.login(email, password)render :action => ‘chat’

end...

end

Page 41: Criando um Instant Messenger

check_updates

send_msg

Page 42: Criando um Instant Messenger
Page 43: Criando um Instant Messenger

vinibaggio

Page 44: Criando um Instant Messenger

vinibaggio

****************

Page 45: Criando um Instant Messenger
Page 46: Criando um Instant Messenger
Page 47: Criando um Instant Messenger

Pergunta fatídica...

Page 48: Criando um Instant Messenger

Pergunta fatídica...

Does it scale?

Page 49: Criando um Instant Messenger

Pergunta fatídica...

Does it scale?Nope.

Page 50: Criando um Instant Messenger

mongrel simples

Request

dispatcherApp Rails

XMPP Layer

joao

maria

* vinibaggio

localhost:3000/login

MessengerController::login Messenger#login(vinibaggio)

OK:render => "chat"

localhost:3000/chat

Tipo de request: Login (Mongrel simples)

Page 51: Criando um Instant Messenger

mod_rails (Passenger)

Request

dispatcher

Instância

Rails 1

XMPP Layer 1

joao

maria

localhost:3000/login

localhost:3000/chat

Tipo de request: Login (mod_rails)

Instância

Rails 2

Instância

Rails 5

XMPP Layer 5

pedro

paulo

XMPP Layer 2

vitor

* vinibaggio

Messenger#login(vinibaggio)MessengerController::login

OK:render => "chat"

Page 52: Criando um Instant Messenger

mod_rails (Passenger)

Request

dispatcher

Instância

Rails 1

XMPP Layer 1

joao

maria

localhost:3000/send_msg

localhost:3000/timeout

Tipo de request: Send_msg (mod_rails)

Instância

Rails 2

Instância

Rails 5

XMPP Layer 5

pedro

paulo

XMPP Layer 2

vitor

vinibaggio

Messenger#send_msg(vinibaggio)MessengerController::send_msg

ERROR

flash[:error] = "Invalid connection"

Page 53: Criando um Instant Messenger

Distributed Ruby!

• Remote Method Invocation (RMI)

• Standard library

• Access Control Lists (ACLs)

Page 54: Criando um Instant Messenger

require ‘drb’DRb.start_service ‘druby://localhost:6666’, []DRb.thread.join

Servidor

Page 55: Criando um Instant Messenger

require ‘drb’r = DRbObject.new nil, ‘druby://localhost:6666’while true

puts r.sizer << 1puts r.sizesleep 10

end

Cliente

Page 56: Criando um Instant Messenger

Tempo

0s

5s

10s

15s

A

B

01

12

23

34

Page 57: Criando um Instant Messenger

mod_rails

Request

dispatcher

Instância

Rails 1

RemoteXMPP

joao

maria

pedro

paulo

vitor

vinibaggio

Requests

Arquitetura com mod_rails + DRb

Instância

Rails 2

Instância

Rails 5

Response

Page 58: Criando um Instant Messenger

require ‘drb’include ‘xmppconnector’DRb.start_service ‘druby://localhost:6666’,

XMPPConnector.instanceDRb.thread.join

Servidor XMPP + DRb

Page 59: Criando um Instant Messenger

Rails + DRbrequire ‘xmppconnector’

class MessengerController < ApplicationControllerfilter_parameter_logging :passworddef login

...end

def xmppDRbObject.new nil, ‘druby://localhost:6666’

end...

end

Page 60: Criando um Instant Messenger

That’s it!

• Relembrando...

• Biblioteca XMPP4R para XMPP

• Rails para fazer a interface

• Paralelizando a arquitetura

• Distributed Ruby (DRb)

Page 61: Criando um Instant Messenger

Obrigado!!!

• Perguntas??

• Contato:

[email protected]

• www.vinibaggio.com