1) turn off stick sessions for chat.
Reconfigure haproxy to remove ACL which implements sticky sessions by directing chat requests to a specific app
server
2) Test.
3) Test more.
Recent development : It has been observed that XHR calls to chat role are taking too long, still waiting for more data to take a decision on investigation. The out come might change this phase. * Downtime required * 0) Add one more CPU core to the server hosting chat role. 1) Spawn another node.js instance on port 8011. 2) Reconfigure Haprxoy to use this new chat role for LB. 3) Test.
1) Replace current node.js instance with newer version. 2( Archive current app and deploy new Juggernaut app (which support 0.10) 3) Test
1) Enable websockets on node.js (already enabled in P3). 2) Reconfigure timeouts in haproxy. 3) Reload haproxy and test.
Tested load balancing on DEV.
Encountered issues but bypassed using headers and TCP mode in LB.
Two separate instances of application, load balanced via haproxy for two separate unsticky node.js instances.
NPM + Websocket support. Faster. Security Patches.
After some code changes, was able to execute Juggernaut over node.js 0.10.29.
Chat is implemented using the ruby Juggernaut library (https://github.com/maccman/juggernaut).
Setting up the necessary components for chat Install Node.js
wget http://nodejs.org/dist/node-v0.2.4.tar.gz tar -xzvf node-v0.2.4.tar.gz cd node-v0.2.4 ./configure make sudo make install
Install Redis
wget http://redis.googlecode.com/files/redis-2.0.3.tar.gz tar -xzvf redis-2.0.3.tar.gz cd redis-2.0.3 make make install
Running
Start Redis
cd redis-2.0.3 ./redis-server redis.conf
Download Juggernaut, and start the Juggernaut server:
git clone git://github.com/maccman/juggernaut.git --recursive cd juggernaut node server.js
Please note that node.js server and the redis server should be running for the chat to be working.
In case , if you see any js errors on starting juggernut server , you can try updating the node to latest version.
By default the server runs on port 8080. If you need to change the port then change the line in server.js (Juggernaut.listen();)file and pass the port number to the listen function.
After this install the necessary gems (Only on application servers). From the application home directory run
bundle install (Install the bundler gem first, if it's not installed: "sudo gem install bundler")
The immediate goal is to maintain the chat transcript across page request. The larger goal is to maintain the Chat History based on session and user. i.e. A user should be able to see a list of chat transcripts grouped by Session and within it grouped by user.
In order to maintain the chat transcripts across page requests the message data will be stored in a cache. The data layout of the chat cache will looks as below. It is nothing but a hash (set of key/value pairs). Each user will have his own cache key.
#user 1 and 2 are also part of a group called 5
#message data for user 1
"1" => {
"2_User" => { #chat transcripts between user 1 and 2
:type => 'User',
:messages => [
{:message_text => 'xxx', :type => 'received',:image => '/path/to/profile/image'},
{:message_text => 'yyyy', :type => 'sent',:image => '/path/to/profile/image'}
]
},
"5_Group" => { #chat transcripts that user 1 has as part of messages sent and received to the group
:type => 'Group',
:messages => [
{:message_text => 'hello group', :type => 'sent',:image => '/path/to/profile/image'},
{:message_text => 'hi group', :type => 'received',:image => '/path/to/profile/image'}
]
}
},
#message data for user 2
"2" => {
"1_User" => {
:type => 'User',
:messages => [
{:message_text => 'xxx', :type => 'sent',:image => '/path/to/profile/image'},
{:message_text => 'yyyy', :type => 'received',:image => '/path/to/profile/image'}
]
},
"5_Group" => {
:type => 'Group',
:messages => [
{:message_text => 'hello group', :type => 'received',:image => '/path/to/profile/image'},
{:message_text => 'hi group', :type => 'received',:image => '/path/to/profile/image'}
]
}
}
At present the chat cache for a user gets cleared under following circumstances
We need to update socket.io to version 8+ to have some connection related issues fixed. So, for the entire chat setup to work fine, the following this need to be upgraded.
1) Remove the current nodejs setup.
2) Install latest juggernaut, nodejs and redis. (Base Reference - https://github.com/maccman/juggernaut)
a) Upgrading python - (version - 2.7.3)
http://toomuchdata.com/2012/06/25/how-to-install-python-2-7-3-on-centos-6-2/
Note - This can have some effects on system packages on gnome machines. Please make sure they do not break.
b) Nodejs setup (install any version - 0.8.1 + )
Instructions - https://github.com/joyent/node/wiki/Installation
Download page - http://nodejs.org/download/ (install from source code)
c) Redis Download & Instructions - http://redis.io/download
d) Juggernaut -
npm install -g juggernaut
Testing - Start the redis service as in the instructions above.
- To srart juggernaut
juggernat --port <port_num>
- Open http://localhost:<port_num> you should see a page with message 'connected to chanel1'