Продолжаю серию статей о Джии Фреймворк .
Сегодня настал момент выхода Comet, о котором я расскажу в этой статье.
Джии-комета — масштабируемый транспорт, готовый к высоким нагрузкам и плохим условиям Интернета, реализующий постоянное соединение между клиентом и сервером для мгновенного обмена данными.
Jii-comet предоставляет набор компонентов и классов, которые позволяют легко обмениваться сообщениями между каналами, подписываться на них, обмениваться данными между серверами и так далее.
Сам модуль не может доставлять сообщения клиенту и обратно, но содержит абстракцию, чтобы это могла сделать любая из существующих популярных библиотек (например, сокет.io , носки ), а также чтобы он был надежным и масштабируемым.
Тем, кто впервые слышит об этом фреймворке, рекомендую прочитать предыдущие статьи или посетить сайт .
Короче говоря, тогда
Jii — это фреймворк, архитектура и API которого основаны на PHP-фреймворке Yii 2.0, взяв от него лучшие стороны и сохранив преимущества JavaScript.Обзор Для начала немного информации о том, что такое комета( вики ):
Комета (в веб-разработке) — это любая модель работы веб-приложения, в которой постоянное HTTP-соединение позволяет веб-серверу отправлять (пересылать) данные в браузер без дополнительного запроса со стороны браузера.
Возможности Jii-кометы
Клиент:- Отправка и получение сообщений из каналов
- Подписка на канал
- Вызов действий на сервере
- Балансировка (случайный выбор сервера)
- Возможность изменения транспорта сообщений
- Отправка и получение сообщений из каналов
- Подписаться на сообщения с канала
- Подписка на подключение к каналу
- Отправка сообщений на соединение
- Возможность изменения транспорта сообщений, концентратора и очереди.
- Масштабирование между несколькими процессами и серверами
- Режим Listen-only (прослушивание каналов)
- Запуск действий из очереди
Монтаж
Comet устанавливается как компонент приложения , на сервере и клиенте соответственно.На сервере Comet он открывается и «слушает» данные с указанного порта, а клиент при инициализации приложения подключается к этому порту и ждет информации.
Рассмотрим пример приложения, в котором клиент подписывается на канал на сервере.
тест и отправляет ему сообщение.
Сервер:
Клиент:var Jii = require('jii'); require('jii-comet'); require('jii-workers') .
application('comet', Jii.mergeConfigs( { application: { basePath: __dirname, components: { comet: { className: 'Jii.comet.server.Server', port: 4401, /** * * @param {Jii.comet.server.ConnectionEvent} event */ 'on addConnection': function(event) { Jii.app.comet.subscribe(event.connection.id, 'test'); } } } } }, custom.comet || {} ));
require('jii/deps');
require('jii-comet/sockjs');
Jii.createWebApplication({
application: {
basePath: location.href,
components: {
comet: {
className: 'Jii.comet.client.Client',
serverUrl: ' http://localhost:4401/comet ',
/**
*
* @param {Jii.base.Event} event
*/
'on open': function(event) {
Jii.app.comet.send('test', {message: 'Hello World'});
},
/**
*
* @param {Jii.comet.ChannelEvent} event
*/
'on channel:test ': function(event) {
console.log('Income message: ' + event.params.message);
}
}
}
}
}).
start();
Далее мы более подробно рассмотрим серверные и клиентские компоненты.
Сервер Комета
Джии-комета предоставляет два класса для создания сервера:
- Jii.comet.server.HubServer — сервер, настроенный только на прослушивание сообщений от соединений, при этом самих соединений он не имеет, но может отправлять данные на соединение, находящееся в соседнем процессе.
Те.
К такому серверу невозможно подключиться напрямую (к порту), но можно отправить сообщение через другие процессы (к которым подключены клиенты).
- Jii.comet.server.Сервер — полноценный сервер, унаследован от предыдущего.
Хранит и поддерживает прямую связь с клиентами, может обмениваться данными с клиентом.
Например, вы можете создать несколько процессов с помощью компонента Jii.comet.server.Сервер , который будет поддерживать только соединения с клиентами, но не будет обрабатывать бизнес-логику.
И создать несколько процессов Jii.comet.server.HubServer , который будет выполнять тяжелые вычисления.
Это сделает кометный канал более отзывчивым: если бы все операции происходили на одном сервере, то сложные операции замедляли бы процесс, а все последующие запросы (даже легкие) задерживались.
Если у вас нет больших нагрузок или вы не знаете, что выбрать, выберите компонент Jii.comet.server.Сервер , так как он содержит весь функционал.
Пример конфигурации сервера выглядит так: application: {
components: {
comet: {
className: 'Jii.comet.server.Server',
host: '0.0.0.0',
port: 3100
},
// .
}
}
Полный список свойств, методов и событий представлен ниже.
Jii.comet.server.HubServer
Характеристики
- прослушиваниеДействия (логическое значение) — принимать ли запросы на вызов действий от клиентов.
По умолчанию, истинный .
- центр (объект) — хаб, компонент или его конфигурация, реализующая интерфейс Jii.comet.server.hub.HubInterface для обмена сообщениями между процессами или серверами.
По умолчанию компонент создается Jii.comet.server.hub.Redis .
- очередь (объект) — очередь, компонент или его конфигурация, реализующая интерфейс Jii.comet.server.queue.QueueInterface для накопления очереди вызовов действий.
По умолчанию компонент создается Jii.comet.server.queue.Redis .
Методы
- начинать() - открывает соединение для компонентов центр И очередь , начинает прослушивать сообщения из каналов.
- останавливаться() — разрывает все связи между компонентами и перестает прослушивать информацию извне.
- sendToChannel (канал, данные) — отправляет сообщение на канал внутри хаба.
Здесь канал — (строка) название канала и данные — (строка|объект|*) данные для отправки.
- sendToConnection (идентификатор, данные) — как и предыдущий метод, отправляет данные, но не в канал, а непосредственно на соединение.
Здесь идентификатор (строка) — идентификатор соединения, взятый из Jii.comet.server.Соединение , А данные — (строка|объект|*) данные для отправки.
- on(имя, обработчик, данные, isAppend) И выключено(имя, обработчик) — методы подписки и отписки на события.
Список событий описан ниже, описание аргументов можно найти в раздел событий .
- hasChannelHandlers (имя) — Возврат истинный , если на канал имя (строка) в этом процессе есть подписчики.
События
- канал — Событие инициируется любым входящим сообщением в любом канале.
Первым аргументом обработчика будет экземпляр класса Jii.comet.ChannelEvent с параметрами канал (строка) и сообщение (нить).
- канал:%my_channel_name% — Событие инициируется любым входящим сообщением в канал, указанный после
) сообщения подписаны на канал тест .
Как и выше, первым аргументом будет передан обработчик событий экземпляр класса.
Jii.comet.ChannelEvent с параметрами канал (строка) и сообщение (нить).
сообщение — Событие инициируется любым входящим сообщением в хаб.
Первым аргументом обработчика будет экземпляр класса Jii.comet.server.MessageEvent с параметром сообщение (нить).
Jii.comet.server.Сервер
Наследует вышеуказанные свойства, методы и события и добавляет следующее:Характеристики
- хозяин (строка) — хост, который прослушивает входящие соединения от клиентов.
По умолчанию, 0.0.0.0 .
- порт (номер) — порт для входящих соединений.
По умолчанию, 4100 .
- транспорт (объект) — компонент или его конфигурация, реализующая интерфейс Jii.comet.server.transport.TransportInterface обмениваться сообщениями напрямую с клиентами (браузер).
Методы
- подписаться (connectionId, канал) И отказаться от подписки (connectionId, канал) — подписывает и отписывает подключение к данному каналу.
Jii рекомендует подписаться на канал на сервере, чтобы избежать гонок сообщений.
В методах идентификатор соединения (строка) — идентификатор соединения, взятый из Jii.comet.server.Соединение , А канал (строка) — название канала.
События
- добавитьсоединение — Событие происходит при присоединении нового клиента.
Первым аргументом обработчика будет экземпляр класса Jii.comet.server.ConnectionEvent с параметром связь ( Jii.comet.server.Соединение ).
- удалить соединение — Событие возникает при потере соединения с клиентом.
Как и в предыдущем, первым аргументом обработчика будет экземпляр класса Jii.comet.server.ConnectionEvent .
Jii.comet.server.Соединение
Содержит информацию о подключении к клиентуХарактеристики
- идентификатор (строка) — идентификатор соединения.
Используется для отправки сообщений непосредственно в соединение.
- запрос ( Jii.comet.server.Запрос ) — информация о подключении: заголовки, IP-адрес, порт подключения и так далее.
- оригинальное соединение (объект) — экземпляр внутреннего соединения, полученный от транспорта.
Специфично для каждого автомобиля.
На клиенте немного проще: там один компонент Jii.comet.client.Клиент , который подключается к одному из серверов и обменивается данными.
application: {
components: {
comet: {
className: 'Jii.comet.client.Client',
serverUrl: ' http://localhost:4401/comet ',
autoOpen: true
},
// .
}
}
Полный список свойств, методов и событий представлен ниже.
Jii.comet.client.Клиент
Характеристики
- транспорт (объект) — компонент или его конфигурация, реализующая интерфейс Jii.comet.client.transport.TransportInterface для обмена сообщениями с сервером.
- плагины (объект) — набор компонентов или их конфигурация, каждый из которых реализует интерфейс Jii.comet.client.plugin.PluginInterface для расширения возможностей комет клиента.
- рабочиеCount (number|null) — максимальное количество рабочих серверов.
Этот параметр используется для балансировки нагрузки на клиенте.
По умолчанию, нулевой - неполноценный.
- автооткрытие (логическое значение) - если указано истинный , то при инициализации приложения Comet клиент автоматически подключится к серверу.
По умолчанию, истинный .
События
- открыть — Событие возникает при успешном открытии соединения.
- закрывать — Событие возникает при закрытии соединения.
- передОтправить — Событие срабатывает при любом исходящем сообщении.
Первым аргументом обработчика будет экземпляр класса Jii.comet.client.MessageEvent с параметром сообщение .
Вы можете изменить отправленное сообщение, изменив параметр сообщение , данные из параметра будут отправлены на сервер сообщение .
- канал — Событие инициируется любым входящим сообщением в любой подписанный канал.
Первым аргументом обработчика будет экземпляр класса Jii.comet.ChannelEvent с параметрами канал (строка) и сообщение (нить).
- канал:%my_channel_name% — Событие инициируется любым входящим сообщением в подписанный канал, указанный после : .
Например, при вызове Jii.app.comet.on('канал:тест', .
) сообщения подписаны на канал тест .
Как и выше, первый аргумент будет передан обработчику событий — экземпляру класса.
Jii.comet.ChannelEvent с параметрами канал (строка) и сообщение (нить).
- сообщение — Событие срабатывает при любом входящем сообщении.
Первым аргументом обработчика будет экземпляр класса Jii.comet.server.MessageEvent с параметром сообщение (нить).
- перед запросом — Событие запускается до того, как клиент попытается отправить запрос серверу на выполнение действия.
Первым аргументом обработчика будет экземпляр класса Jii.comet.client.RequestEvent с параметрами маршрут (строка) и параметры (объект).
В этом событии вы можете изменить параметры запроса, данные из параметра будут отправлены на сервер.
параметры .
- запрос — Событие срабатывает, когда сервер отвечает на ранее запрошенное действие.
Первым аргументом обработчика будет экземпляр класса Jii.comet.client.RequestEvent с параметрами маршрут (строка) и параметры (объект).
Плагины
Плагины позволяют расширить возможности кометы клиента.По умолчанию установлен плагин для автоматического восстановления соединения.
Jii.comet.client.plugin.AutoReconnect .
Плагин очень легко создать и подключить.
Интерфейс плагина Jii.comet.client.plugin.PluginInterface не требует реализации методов, а лишь предоставляет доступ к клиенту Comet через параметр комета , с помощью которого можно подписаться на события кометы.
Плагин устанавливается и настраивается через конфигурацию, путем добавления его в раздел плагины : application: {
components: {
comet: {
className: 'Jii.comet.client.Client',
// .
plugins: {
autoReconnect: {
enable: false
},
myPlugin: {
Теги: #JavaScript #node.js #io.js #framework #jii #Yii #yii2 #coolshade #comet #comet #queue #sockjs #Socket.io #highload #балансировка нагрузки #Разработка веб-сайтов #открытый исходный код #node. js
-
Шорлеммер, Карл
19 Oct, 24 -
Поиск Корзины Для Кредитных Карт Стал Проще
19 Oct, 24 -
Александр Жаров Дал Интервью «Ведомостям»
19 Oct, 24 -
Основные Причины Отсутствия Ваших Данных...
19 Oct, 24 -
Chargepod, Раз И Навсегда!
19 Oct, 24