<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=Router.js</id>
	<title>Router.js - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=Router.js"/>
	<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=Router.js&amp;action=history"/>
	<updated>2026-04-03T21:55:27Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.1</generator>
	<entry>
		<id>https://support.qbpro.ru/index.php?title=Router.js&amp;diff=323&amp;oldid=prev</id>
		<title>imported&gt;Supportadmin: Новая страница: « &lt;nowiki&gt;////////////////////////// ////////router.js///////// ////////////////////////// ///////А.В. Климов//////// ////////////////////////// ////////01…»</title>
		<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=Router.js&amp;diff=323&amp;oldid=prev"/>
		<updated>2013-08-04T12:38:44Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: « &amp;lt;nowiki&amp;gt;////////////////////////// ////////router.js///////// ////////////////////////// ///////А.В. Климов//////// ////////////////////////// ////////01…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt; &amp;lt;nowiki&amp;gt;//////////////////////////&lt;br /&gt;
////////router.js/////////&lt;br /&gt;
//////////////////////////&lt;br /&gt;
///////А.В. Климов////////&lt;br /&gt;
//////////////////////////&lt;br /&gt;
////////01.11.2012////////&lt;br /&gt;
&lt;br /&gt;
//Используются модули fifo.js, net, socket.io&lt;br /&gt;
//////////////////////////&lt;br /&gt;
&lt;br /&gt;
//Предназначен для перенаправления входящего через WebSocket (далее ws) потока &lt;br /&gt;
//в поток с использованием NetSocket (далее ns) для передачи заданий на исполнение.&lt;br /&gt;
//Наличие исполнителей (их адреса локальные (127.х.х.х) или в перспективе сетевые) &lt;br /&gt;
//конфигурируется через параметр (массив) workers=[].&lt;br /&gt;
//Выбор маршрута определяется исходя из текущей (моментальной) нагрузки workerов.&lt;br /&gt;
//Имеет отдельный управляющий канал ns для связи с ядром&lt;br /&gt;
//////////////////////////&lt;br /&gt;
&lt;br /&gt;
//Принцип работы:&lt;br /&gt;
//При поступлении сообщения от клиента по протоколу ws генерируется стандартное &lt;br /&gt;
//событие 'data' в функции ws.on(). По этому событию из буфера сокета сообщение&lt;br /&gt;
//помещается в очередь ws_fifo_ns. Функция ns каждый цикл EventLoop проверяет &lt;br /&gt;
//наличие заданий в очереди (длину массива ws_fifo_ns) и в случае ненулевого &lt;br /&gt;
//значения, первое сообщение отправляется в ns конкретному исполнителю. Выбор &lt;br /&gt;
//исполнителя осуществляется по критерию нагрузки {надо сделать расчет на &lt;br /&gt;
//основе средневзвешенного коэффициента нагрузки, когда каждое задание имеет &lt;br /&gt;
//вес - а)число определяющее степеть предполагаемой (временной) загрузки процесса EventLoop&lt;br /&gt;
//по времени исполнения [математическая, чтение/запись в файл, чтение/запись БД]&lt;br /&gt;
//б) собирать статистику времени вылонения, используемой памяти и на её основе выставлять вес задания,&lt;br /&gt;
//что позволит избежать неправильного веса при увеличении данных в запросе к БД &lt;br /&gt;
//(т.н. автокорретировка)}. http://th-algoritmov.narod.ru/4.htm http://th-algoritmov.narod.ru/5.htm &lt;br /&gt;
//Книга Идеальный код. http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%90%D0%BC%D0%B4%D0%B0%D0%BB%D0%B0&lt;br /&gt;
//&lt;br /&gt;
//////////////////////////&lt;br /&gt;
&lt;br /&gt;
//Управляющий ns поток&lt;br /&gt;
//ns используется для мгновенного обмена информацией с ядром системы. Ядро может &lt;br /&gt;
//собирать статистику и устанавливать конфигурационные пераметры: &lt;br /&gt;
//-добавлять/убирать worker путем&lt;br /&gt;
&lt;br /&gt;
var fifo= require(&amp;quot;fifo&amp;quot;), 			//Модуль, организующий очередь FIFO&lt;br /&gt;
    websocket = require('socket.io'), 		//Модуль, организующий WebSocket&lt;br /&gt;
    netsocket = require('net'),			//Модуль, организующий NetSocket&lt;br /&gt;
    json_rpc= require('json_rpc');		//Модуль, организующий анализ и синтез формата json-rpc&lt;br /&gt;
&lt;br /&gt;
var ws_fifo = new fifo(),			//очередь WebSocket-&amp;gt;fifo для входящих (от клиента) сообщений перед маршрутизацией&lt;br /&gt;
    fifo_ws = new fifo(),			//очередь для исходящих (к клиенту) сообщений fifo-&amp;gt;WebSocket &lt;br /&gt;
    fifo_ns = new fifo(),			//очередь fifo-&amp;gt;NetSocket для исходящих сообщений после маршрутизации&lt;br /&gt;
    ns_fifo = new fifo(),			//очередь для входящих сообщений NetSocket-&amp;gt;fifo-&amp;gt;WebSocket&lt;br /&gt;
    ws = new websocket(),			//создаем новый экземпляр WebSocket&lt;br /&gt;
    ns = new netsocket(),			//создаем новый экземпляр NetSocket&lt;br /&gt;
    ns_direct = new netsocket();		//создаем новый экземпляр NetSocket (управляющий канал)&lt;br /&gt;
&lt;br /&gt;
//WebSocket&lt;br /&gt;
&lt;br /&gt;
ws.listen(8080);				// Cтавим на прослушивание 8080-порта&lt;br /&gt;
ws.set('log level', 1);				// Отключаем вывод полного лога - пригодится в production'е&lt;br /&gt;
ws.sockets.on('connection', function (socket) { // Навешиваем обработчик на подключение нового клиента&lt;br /&gt;
						// Т.к. чат простой - в качестве ников пока используем первые 5 символов от ID сокета&lt;br /&gt;
    //var ID = (socket.id).toString().substr(0, 5);&lt;br /&gt;
    &lt;br /&gt;
    var ID = (socket.id).toString();		//В качестве ников пока используем ID сокета&lt;br /&gt;
    var time = (new Date).toLocaleTimeString();&lt;br /&gt;
    socket.json.send({'event': 'connected', &lt;br /&gt;
                      'name': ID, &lt;br /&gt;
					  'time': time});// Посылаем клиенту сообщение о том, что он успешно подключился и его имя&lt;br /&gt;
    socket.broadcast.json.send({'event': 'userJoined',&lt;br /&gt;
								'name': ID, &lt;br /&gt;
								'time': time});							// Посылаем всем остальным пользователям, что подключился новый клиент и его имя&lt;br /&gt;
    socket.on('message', function (msg) { 								// Навешиваем обработчик на входящее сообщение&lt;br /&gt;
        var time = (new Date).toLocaleTimeString();&lt;br /&gt;
        socket.json.send({'event': 'messageSent',&lt;br /&gt;
						  'name': ID, &lt;br /&gt;
						  'text': msg, &lt;br /&gt;
						  'time': time});								// Уведомляем клиента, что его сообщение успешно дошло до сервера&lt;br /&gt;
       //socket.broadcast.json.send({'event': 'messageReceived',&lt;br /&gt;
	   //							'name': ID, &lt;br /&gt;
	   //							'text': msg, &lt;br /&gt;
	   //							'time': time})						// Отсылаем сообщение остальным участникам чата&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        /////////////////////////&lt;br /&gt;
        //Здесь обработать авторизацию, занести в БД сессию&lt;br /&gt;
        //Если ошибка уведомить клиента (вернуть error в fifo_ws в формате JSON-RPC)&lt;br /&gt;
        /////////////////////////&lt;br /&gt;
        /////////////////////////&lt;br /&gt;
        //Здесь проверить валидность JSON-RPC&lt;br /&gt;
        //Если ошибка уведомить клиента (вернуть error в fifo_ws в формате JSON-RPC)&lt;br /&gt;
        /////////////////////////&lt;br /&gt;
        /////////////////////////&lt;br /&gt;
        //Проверить наличие и соответствие команды на выполнение&lt;br /&gt;
        //Если ошибка уведомить клиента (вернуть error в fifo_ws в формате JSON-RPC)&lt;br /&gt;
        /////////////////////////&lt;br /&gt;
        /////////////////////////&lt;br /&gt;
        //Здесь записать id задания(из JSON-RPC), id сокета, id клиента, id функции(для статистики), время начала  в буфер.&lt;br /&gt;
        //Из номера этой строки, id функции, параметры функции, сформировать в формате JSON-RPC задание для woker&lt;br /&gt;
        /////////////////////////&lt;br /&gt;
        /////////////////////////&lt;br /&gt;
        //Здесь предать JSON-RPC запрос в fifo_ns&lt;br /&gt;
        /////////////////////////&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    });&lt;br /&gt;
    &lt;br /&gt;
    socket.on('disconnect', function() { // При отключении клиента - уведомляем остальных&lt;br /&gt;
        var time = (new Date).toLocaleTimeString();&lt;br /&gt;
        io.sockets.json.send({'event': 'userSplit', 'name': ID, 'time': time});&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Supportadmin</name></author>
	</entry>
</feed>