###What for?
Pusher является зависимостью только для uni_mail в настоящий момент.
В будущем планировалось, чтобы он стал основой для всех realtime-нотификаций в unite, таких как новые чаты, новые сообщения в них, аплоады фоток друзьями и т.п.
Прототипный веб-интерфейс uni_mail использует Pusher для получения нотификаций в пользовательских личных сообщениях.
###How's it work?
Pusher по сути представляет из себя легковесный неблокирующий веб-сервер, построенный на базе tornadio( https://github.com/MrJoes/tornadio ) comet framework c ioloop из TornadoWeb( http://www.tornadoweb.org/ ) в своем ядре.
IMPORTANT: сейчас tornadio считается устаревшим, лучше перейти на вторую версию этого фреймворка https://github.com/MrJoes/tornadio2 , ориентированную на использование в связке с Socket.IO > 0.7 на стороне браузера.
Pusher устанавливает соединение с RabbitMQ на старке и начинает "слушать" события в очереди сообщений.
Каждый веб-клиент, который хочет получать нотификации в реальном времени может подключиться к нему с помощью клиентской части socket.io (http://socket.io/), который умеет работать в разных режимах (like websocket, flashsocket, xhr-multipart, xhr-polling).
Для каждого подключенного клиента, в качестве главного ориентира для доставки сообщений используется username(uni_passport profile_id).
Этот параметр используется как routing key, который добавляется к "прослушивающимся" в очереди сообщений RabbitMQ.
Для примера: пользователь "gothy" подключается, Pusher добавляет "gothy" в список routing keys, для которых он хочет получать сообщения.
Когда приходит событие, pusher поднимает мета-информацию по событию и посылает команду соответствующему клиенту(см. метод on_message() в Notipikator).
При отключении клиента - pusher перестает слушать события, связанные с этим пользователем, удаляя его username из интересующих его routing keys в очереди сообщений.
По сути pusher работает как роутер для нотификаций, отправляемых пользователю.