Ok, I finished the C component that made the clustering feature. It's
simple but I can't make it work fine, because of a restriction in jabberd2.
One component can't insert a packet as another. Here is an example
I setup 2 PyMSN components:
msn-1.hq.novamens.com
msn-2.hq.novamens.com
And the cluster component as:
msn.hq.novamens.com
Start up all three components (first the transports) and then I get this
message from the router component of jabberd2:
sx (io.c:205) decoded read data (574 bytes): <iq
from='msn.hq.novamens.com' type='result' to='hq.novamens.com'><query
xmlns='http://jabber.
org/protocol/disco#info'><identity category='gateway' type='msn'
name='MSN Transport'/><identity category='conference' type='text' name='MS
N Transport Chatrooms'/><feature
var='http://jabber.org/protocol/disco'/><feature
var='jabber:x:conference'/><feature var='jabber:iq:confer
ence'/><feature var='jabber:iq:register'/><feature
var='jabber:iq:gateway'/><feature var='jabber:iq:version'/><feature
var='http://jabber.o
rg/protocol/commands'/><feature var='vcard-temp'/></query></iq>
sx (io.c:70) completed nad: <iq xmlns='jabber:component:accept'
to='hq.novamens.com' type='result' from='msn.hq.novamens.com'><query xmlns=
'http://jabber.org/protocol/disco#info'><identity name='MSN Transport'
type='msn' category='gateway'/><identity name='MSN Transport Chatroo
ms' type='text' category='conference'/><feature
var='http://jabber.org/protocol/disco'/><feature
var='jabber:x:conference'/><feature var='j
abber:iq:conference'/><feature var='jabber:iq:register'/><feature
var='jabber:iq:gateway'/><feature var='jabber:iq:version'/><feature var='
http://jabber.org/protocol/commands'/><feature
var='vcard-temp'/></query></iq>
sx (chain.c:119) calling nad read chain
sx (io.c:124) tag 22 event 6 data 0x80c2608
Fri Sep 23 16:06:45 2005 router.c:691 packet from legacy component,
munging it
Fri Sep 23 16:06:45 2005 router.c:373 unicast route from
msn.hq.novamens.com to hq.novamens.com
Fri Sep 23 16:06:45 2005 [notice] [192.168.1.4, port=27769] tried to
send a packet from 'msn.hq.novamens.com', but that name is not bound t
o this component
Fri Sep 23 16:06:45 2005 router.c:321 packet for legacy component, munging
sx (chain.c:106) calling nad write chain
sx (io.c:369) queueing for write: <iq xmlns='jabber:client'
to='hq.novamens.com' type='error' from='msn.hq.novamens.com'><error
type='cance
l' code='503'><service-unavailable
xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error><query
xmlns='http://jabber.org/protocol/disco#info
'><identity name='MSN Transport' type='msn'
category='gateway'/><identity name='MSN Transport Chatrooms' type='text'
category='conference'/
><feature var='http://jabber.org/protocol/disco'/><feature
var='jabber:x:conference'/><feature var='jabber:iq:conference'/><feature
var='ja
bber:iq:register'/><feature var='jabber:iq:gateway'/><feature
var='jabber:iq:version'/><feature
var='http://jabber.org/protocol/commands'/>
<feature var='vcard-temp'/></query></iq>
Pedro do you know of some solution, or XCP does not restrict this ?
Thanks,
Gonzalo Barrio Linares
PD: If everything works fine I 'm going to publish this.
Pedro Melo wrote:
> Hi,
>
> On Sep 15, 2005, at 8:36 PM, Gonzalo Barrio wrote:
>
>> Pedro, how many concurrent users have in sapo ?
>
>
> couple of thousands.
>
>> Are you using this clustering feature ?
>
>
> I'm moving today to cluster: several instances of pyMSNt load-balanced
> by JID.
>
> The source code will be available (probably GPL) sometime this
> weekend. It works for me now. It was written in-house, aroun 160 lines
> of perl code, mostly error recovery and startup. The real
> loadbalancing is around 3 or 4 lines :)
>
>> What hard and soft ?
>> I mean msn1, msn2, msn3 ...... all reponding msn.im.sapo.com.pt, because
>> I think that I can add this feature on jabberd2 modifying some things on
>> the router and sm component. In this way, we can clusterize all kind of
>> components (except mu-conference I think again)
>
>
> Ok. I can identify 3 types of balancing you need to cover all the
> situations I faced. Those are:
> - stateless: you don't care where the stanza's go, just round-robin,
> least load, whatever, distribute them;
> - statefull based on 'from': my packets must go to the same instance,
> like MSN/AIM/ICQ, etc. Basically, any situation where the component
> keeps a session for you.
> - statefull based on 'to': text conferencing. you can have several
> rooms, and some rooms go to chat1 and others go to chat2. Pubsub jep60
> might also applied, not a problem for us just yet.
>
> Also, right now, I don't care if the instances are up or down. Our
> balancer get's a packet, hashes the jid to a integer, modulus number
> of instances, and forwards (using <route>) the original stanza to the
> choosen destination.
>
> The only difference between those three types of algorithm above is
> the field that you use to distribute the stanzas.
>
> I don't think you need to modify anything on the server. You only need
> a component that takes ownership of your main domain name
> (msn.im.sapo.pt) in our case, and start N instances of your component.
>
> One think that is required: each component must respond to the main
> domain name and a secondary name. In some server (like XCP that we
> use), you can have a linkname (based on the ID) and a host filter. Our
> balancer needs that. We send the stanzas to the linkname, and the
> stanzas include the main domain name.
>
> Notice that our code does not do any kind of rewriting. There is no
> need to do it. Also, it's just a normal component with a single TCP
> connection to the server. It does not connect directly to the other
> instances. All the traffic is through the server.
>
> Also, notice that only the stanzas to the main domain go through the
> balancer. The replies flow directly from the component instances to
> the client.
>
> If you server does not trust the components and checks all the stanzas
> received to see if they match the from with the linkname, for example,
> you will have trouble.
>
> Finally, the only requirements on the component that you wish to
> balance are:
> - they need to support linkname and hostname: pyMSNt supports that
> with the <useXCP> tag, that's your linkname;
> - they need to support <route> stanzas: simple really, just drop the
> <route></route> and use the XML inside as if it came from the socket.
>
> Regarding jabberd2, my suggestion would be that you don't implement
> this inside the server, but as a external component. Oh, and if you
> write something like this in C, I will be extremely interested :)...
> On our roadmap is moving xbalance.pl to C, but only if we need it.
>
>
>> Then only thing I don't want to do is to reinvent the weel..... :-)
>
>
> Same here. I searched the web for something like this and found
> nothing, so I just coded it.
>
> I think that if we can agree on a spec we can build one of these
> components in C and use it with all the jabber servers that support
> JEP-0100.
>
> That would be cool.
>
> My problem with C, btw, is that I don't know which library to use as a
> base of this component. If you have some ideas about that, I would
> love to ear them.
>
> Thanks,
> --
> HIId: Pedro Melo
> SMTP: [EMAIL PROTECTED]
> XMPP: [EMAIL PROTECTED]
>
> _______________________________________________
> py-transports mailing list
> [email protected]
> http://www.modevia.com/cgi-bin/mailman/listinfo/py-transports
>