<?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=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_NodeJS</id>
	<title>Кластер на основе NodeJS - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_NodeJS"/>
	<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_NodeJS&amp;action=history"/>
	<updated>2026-05-14T04:10:20Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.1</generator>
	<entry>
		<id>https://support.qbpro.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_NodeJS&amp;diff=4270&amp;oldid=prev</id>
		<title>Vix в 18:48, 24 июля 2024</title>
		<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_NodeJS&amp;diff=4270&amp;oldid=prev"/>
		<updated>2024-07-24T18:48:12Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 21:48, 24 июля 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;оригинал http://gogoo.ru/blacksmith/blog/show/klaster_na_osnove_nodejs&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Как известно, NodeJS работает в одном процессе. Хоть это решение и очень быстрое, но и его может не хватить для того чтобы обработать нагрузку. Попробуем запустить несколько инстанций сервера. Для работы в кластере потребуется различать узлы. Не сильно задумываясь о реализации этой идеи, я решил назвать узлы женскими именами. Очень просто было найти список из одной тысячи английских женских имен. По этому поводу даже возникло несколько шуток: «максимальный размер кластера — тысяча узлов». Каждый узел будет получать данные о своих настройках и других узлах из базы данных mysql. Нас интересует ip-адрес и порт, который будет прослушивать сервер, помимо этого узлы в кластере должны взаимодействовать между собой. Основная задача при взаимодействии между узлами заключается в передаче данных от одного узла другому. Здесь нам потребуется внутренний протокол взаимодействия. Опять же не изобретая велосипед, реализуем взаимодействие между узлами посредством протокола memcached. Это позволит получать данные от узлов кластера, используя общедоступные библиотеки memcached, например из PHP)))). Итак запускаем узел командой:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Как известно, NodeJS работает в одном процессе. Хоть это решение и очень быстрое, но и его может не хватить для того чтобы обработать нагрузку. Попробуем запустить несколько инстанций сервера. Для работы в кластере потребуется различать узлы. Не сильно задумываясь о реализации этой идеи, я решил назвать узлы женскими именами. Очень просто было найти список из одной тысячи английских женских имен. По этому поводу даже возникло несколько шуток: «максимальный размер кластера — тысяча узлов». Каждый узел будет получать данные о своих настройках и других узлах из базы данных mysql. Нас интересует ip-адрес и порт, который будет прослушивать сервер, помимо этого узлы в кластере должны взаимодействовать между собой. Основная задача при взаимодействии между узлами заключается в передаче данных от одного узла другому. Здесь нам потребуется внутренний протокол взаимодействия. Опять же не изобретая велосипед, реализуем взаимодействие между узлами посредством протокола memcached. Это позволит получать данные от узлов кластера, используя общедоступные библиотеки memcached, например из PHP)))). Итак запускаем узел командой:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l106&quot;&gt;Строка 106:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 104:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;С помощью нехитрых действий мы создали кластерную систему. Остальное сделает nginx. Но о том, как распределить нагрузку и научить «девушек» разговаривать между собой я напишу позже.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;С помощью нехитрых действий мы создали кластерную систему. Остальное сделает nginx. Но о том, как распределить нагрузку и научить «девушек» разговаривать между собой я напишу позже.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;hr&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [http://gogoo.ru/blacksmith/blog/show/klaster_na_osnove_nodejs Источник]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key pgdb4support-mediawiki-:diff::1.12:old-641:rev-4270 --&gt;
&lt;/table&gt;</summary>
		<author><name>Vix</name></author>
	</entry>
	<entry>
		<id>https://support.qbpro.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_NodeJS&amp;diff=641&amp;oldid=prev</id>
		<title>imported&gt;Vix: Новая страница: «оригинал http://gogoo.ru/blacksmith/blog/show/klaster_na_osnove_nodejs  Как известно, NodeJS работает в одном процессе. …»</title>
		<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_NodeJS&amp;diff=641&amp;oldid=prev"/>
		<updated>2013-08-26T18:45:43Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «оригинал http://gogoo.ru/blacksmith/blog/show/klaster_na_osnove_nodejs  Как известно, NodeJS работает в одном процессе. …»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;оригинал http://gogoo.ru/blacksmith/blog/show/klaster_na_osnove_nodejs&lt;br /&gt;
&lt;br /&gt;
Как известно, NodeJS работает в одном процессе. Хоть это решение и очень быстрое, но и его может не хватить для того чтобы обработать нагрузку. Попробуем запустить несколько инстанций сервера. Для работы в кластере потребуется различать узлы. Не сильно задумываясь о реализации этой идеи, я решил назвать узлы женскими именами. Очень просто было найти список из одной тысячи английских женских имен. По этому поводу даже возникло несколько шуток: «максимальный размер кластера — тысяча узлов». Каждый узел будет получать данные о своих настройках и других узлах из базы данных mysql. Нас интересует ip-адрес и порт, который будет прослушивать сервер, помимо этого узлы в кластере должны взаимодействовать между собой. Основная задача при взаимодействии между узлами заключается в передаче данных от одного узла другому. Здесь нам потребуется внутренний протокол взаимодействия. Опять же не изобретая велосипед, реализуем взаимодействие между узлами посредством протокола memcached. Это позволит получать данные от узлов кластера, используя общедоступные библиотеки memcached, например из PHP)))). Итак запускаем узел командой:&lt;br /&gt;
&lt;br /&gt;
 node index.js name=diana&lt;br /&gt;
&lt;br /&gt;
В серверном скрипте получим имя узла.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;var arguments = process.argv.splice(2);&lt;br /&gt;
if (arguments.length &amp;gt; 0) {&lt;br /&gt;
    var pairs = arguments[0].split('=');&lt;br /&gt;
    app.node = '';&lt;br /&gt;
    if (pairs[0] == 'node')&lt;br /&gt;
        app.node = pairs[1];&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну вот мы знаем имя узла. Пусть в нашем движке все настройки лежат в одной таблице в виде ключ-значение. И ключ — это всего лишь поле объекта. Это javascript и удобно взаимодействовать с настройками как с одним объектом. Например это может выглядеть так: ключ «node.diana.port», значение «8080». Вы уже видите элегантность решения? А вот и его реализация:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/**&lt;br /&gt;
 * Configuration container for Externals&lt;br /&gt;
 */&lt;br /&gt;
app.config = {};&lt;br /&gt;
conf_table = 'app_config';&lt;br /&gt;
 &lt;br /&gt;
app.init_config = function() {&lt;br /&gt;
    var checkSql = 'SELECT * FROM ' + conf_table + ';';&lt;br /&gt;
    var res = app.conn.querySync(checkSql);&lt;br /&gt;
    var row;&lt;br /&gt;
 &lt;br /&gt;
    while ((row = res.fetchArraySync())) {&lt;br /&gt;
        var keys = row[1].split('.');&lt;br /&gt;
        var obj = app.config;&lt;br /&gt;
        var index = 0;&lt;br /&gt;
        for (index = 0; index &amp;lt; keys.length - 1; index++) {&lt;br /&gt;
            if (obj[keys[index]] == undefined)&lt;br /&gt;
                obj[keys[index]] = {};&lt;br /&gt;
            obj = obj[keys[index]];&lt;br /&gt;
        }&lt;br /&gt;
        obj[keys[index]] = row[2];&lt;br /&gt;
    }&lt;br /&gt;
};&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/**&lt;br /&gt;
 * Set Configuration for Externals&lt;br /&gt;
 */&lt;br /&gt;
app.configure = function(key, value) {&lt;br /&gt;
    app.config[key] = value;&lt;br /&gt;
    return this;&lt;br /&gt;
};&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь заставим наш сервер слушать входящие запросы на установленном в настройках порту:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (app.config.node[app.node] != undefined) {&lt;br /&gt;
        if (app.config.node[app.node].port != undefined) {&lt;br /&gt;
            var port = app.config.node[app.node].port;&lt;br /&gt;
            // Entry point&lt;br /&gt;
            sys.puts(&amp;quot;PORT: &amp;quot; + port);&lt;br /&gt;
            http.createServer(function(req, resp) {&lt;br /&gt;
                // Здесь будет находится непосредственно обработка&lt;br /&gt;
                // запроса ...&lt;br /&gt;
            }).listen(port);&lt;br /&gt;
        }&lt;br /&gt;
    }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Я использую linux повсеместно, а именно предпочитаю дистрибутив gentoo. Сейчас мы запустим весь этот бардель. Ниже содержимое файла запуска /etc/init.d/nodejs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/sbin/runscript&lt;br /&gt;
# Copyright 1999-2006 Gentoo Foundation&lt;br /&gt;
WOMANS=&amp;quot;aisha emely natali&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
depend() {&lt;br /&gt;
    need net mysql&lt;br /&gt;
    provide nodejs&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
start() {&lt;br /&gt;
    ebegin &amp;quot;Starting ${SVCNAME}&amp;quot;&lt;br /&gt;
    for WOMAN in $WOMANS&lt;br /&gt;
    do&lt;br /&gt;
        echo ${WOMAN}&lt;br /&gt;
        PIDFILE=/var/run/${SVCNAME}-${WOMAN}.pid&lt;br /&gt;
            LOGFILE=/var/log/nodejs/${SVCNAME}-${WOMAN}.log&lt;br /&gt;
            ERRLOGFILE=/var/log/nodejs/${SVCNAME}-${WOMAN}-error.log&lt;br /&gt;
        start-stop-daemon --start -q -m -p &amp;quot;${PIDFILE}&amp;quot; -1 ${LOGFILE} -2 ${ERRLOGFILE} -u \&lt;br /&gt;
            nginx -d &amp;quot;/var/www/${SVCNAME}&amp;quot; -b -x /usr/bin/node -- index.js node=${WOMAN}&lt;br /&gt;
    done&lt;br /&gt;
 &lt;br /&gt;
    eend $?&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
stop() {&lt;br /&gt;
    ebegin &amp;quot;Stopping ${SVCNAME}&amp;quot;&lt;br /&gt;
    for WOMAN in $WOMANS&lt;br /&gt;
    do&lt;br /&gt;
        echo ${WOMAN}&lt;br /&gt;
        PIDFILE=/var/run/${SVCNAME}-${WOMAN}.pid&lt;br /&gt;
            LOGFILE=/var/log/nodejs/${SVCNAME}-${WOMAN}.log&lt;br /&gt;
        start-stop-daemon --stop -q -p &amp;quot;${PIDFILE}&amp;quot;&lt;br /&gt;
    done&lt;br /&gt;
    eend $?&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Небольшой комментарий к стартовому скрипту. Если вы знакомы с gentoo, то знаете что скрипт сетевого интерфейса является всего лишь ссылкой на /etc/init.d/net.lo. В стартовом скрипте кластера применен такой же подход. Для того чтобы установить каталог исполнения используется выражение «-d /var/www/${SVCNAME}», где ${SVCNAME} является именем стартового скрипта. Вам необходимо создать символьную ссылку на стартовый скрипт. В моем случае это делается командой&lt;br /&gt;
&lt;br /&gt;
 ln -s /etc/init.d/nodejs /etc/init.d/gogoo.ru&lt;br /&gt;
&lt;br /&gt;
С помощью нехитрых действий мы создали кластерную систему. Остальное сделает nginx. Но о том, как распределить нагрузку и научить «девушек» разговаривать между собой я напишу позже.&lt;/div&gt;</summary>
		<author><name>imported&gt;Vix</name></author>
	</entry>
</feed>