BOSH protocol specified in XEP-0124 is one of first protocols defined to allow to establish XMPP connection to XMPP servers from web browsers due to this protocol being widely supported and used. It is also easy to use in single server mode. It’s enabled by default in Tigase XMPP Server and available at port 5280.
In clustered mode we can deploy it with load balancer deployed with guarantees that each BOSH connection from web browser
will be forwarded to same Tigase XMPP Server instance. So in clustered mode if we have two XMPP server t1
and t2
which are hosting domain example.com
we would need to have load balancer which will respond for HTTP request to domain example.com
and forward all requests from same IP address to same node of a cluster (i.e. all request from 192.168.122.32
should be forwarded always to node t1
.
There is also a way to use BOSH without load balancer enabled. In this case the XMPP client needs to have more logic and knowledge about all available cluster nodes (with names of nodes which will identify particular cluster nodes from internet). Using this knowledge XMPP client should select one random node from list of available nodes and always establish BOSH connections to this particular node. In case if BOSH connection fails due to network connection issues, the XMPP client should randomly pick other node from list of rest of available nodes.
Solution:
Tigase XMPP Server by default provides server side solution for this issue by sending additional host
attribute in body
element of BOSH response. As value of this attribute Tigase XMPP Server sends domain name of server cluster node to which
client connected and to which next connections of this session should be opened.
It is possible to disable this custom feature by addition of of following line to etc/config.tdsl
config file:
bosh { 'send-node-hostname' = false }
Example:
We have servers t1.example.com
and t2.example.com
which are nodes of a cluster hosting domain example.com
. Web client retrieves list of cluster nodes from web server and then when it needs to connect to the XMPP server it picks
random host from list of retrieved cluster nodes (i.e. t2.example.com
) and tries to connect using BOSH protocol to host t2.example.com
but it should send example.com
as name of the server it tries to connect to (example.com
should be value of to
attribute of XMPP stream).