CometQL — это api для работы с saas комет сервисом по протоколу MySQL.

Почему это круто


  • Единый api для более чем 12 языков программирования
  • Простой и понятный вид запросов
  • В php есть средства поддержания постоянных соединений с MySQL и теперь их можно так же использовать для работы с comet сервером.

Например для получения информации о том когда пользователь был online достаточно выполнить следующий запрос:
select id, time from users_time where id = 2;

А вот запрос для отправки сообщения в канал:
INSERT INTO pipes_messages (name, event, message)VALUES("pipe_name", "event_in_pipe", "text message");

Как подключится и попробовать самостоятельно


Вы можете сами подключится с демо данными и попробовать.
# Сервер app.comet-server.ru
# Логин 15
# Пароль lPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8
# База данных CometQL_v1

# Строка для подключения из консоли
mysql -h app.comet-server.ru -u15 -plPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8 -DCometQL_v1


Для тех кто хочет попробовать подключится но нет под рукой консольного mysql клиента
Вы можете опробовать работу CometQL с помощью online CometQL командной строки (расположена в правом нижнем углу на любой странице)

Общие сведения о CometQL


CometQL внешне представляет из себя некое подобие базы данных. При чём когда мы при подключении выбираем базу данных CometQL_v1 это фактически инструкция указывающая с какой версией api мы хотим взаимодействовать.
Надо понимать что не какого MySQL сервера на бекэнде нет, запросы парсятся и выполняются непосредственно comet сервером. А представление всех возможных действий в виде таблиц и запросов к ним просто удобно и привычно для многих вебмастеров.

Таблица pipes_messages


Таблица pipes_messages содержит сообщения передаваемые через каналы. Для отправки сообщения в канал надо выполнить запрос вставки ( insert ) в эту таблицу.
mysql> insert into pipes_messages (name, event, message)values("pipe_name", "event_in_pipe", "text message");
Query OK, 0 rows affected (0.13 sec)

Поля «name» и «event» должны соответствовать следующему регулярному выражению [0-9A-z=+/_]
Запрос выборки из pipes_messages вернёт историю сообщений в канале если функция сохранения истории включена для этого канала (о том как эту функцию включить написано ниже).
mysql> select * from pipes_messages where name = "p10";
+------+-------+-------+--------------+
| name | index | event | message      |
+------+-------+-------+--------------+
| p10  | 0     | event | msgData      |
| p10  | 1     | event | msgqqrrata   |
| p10  | 2     | evt3  | msgqqrrata   |
+------+-------+-------+--------------+
3 rows in set (0.00 sec)

Очищает историю сообщений в канале.
mysql> delete from pipes_messages where name = 'p10';
Query OK, 0 rows affected (0.13 sec)

Online пример отправки сообщений

Таблица pipes


Таблица pipes содержит информацию о том сколько человек подписались на сообщения из каналов. Таблица доступна только для чтения.
mysql> select * from pipes where name in( "web_admins", "web_php_chat");
+--------------+-------+
| name         | users |
+--------------+-------+
| web_admins   | 3     |
| web_php_chat | 2     |
+--------------+-------+
2 rows in set (0.30 sec)

Online пример подписок на каналы

Таблица users_in_pipes


Таблица users_in_pipes содержит данные о том кто из авторизованных пользователей подписался на канал. Таблица доступна только для чтения.
mysql> select * from users_in_pipes where name = "web_admins";
+------------+---------+
| name       | user_id |
+------------+---------+
| web_admins | 2       |
| web_admins | 4       |
| web_admins | 14      |
| web_admins | 9       |
+------------+---------+
4 row in set (0.32 sec)

Примечательно что поле users содержит суммарное количество подписчиков как авторизованных так и не авторизованных в то время как таблица users_in_pipes содержит список только авторизованных подписчиков.

Таблица pipes_settings


Таблица pipes_settings содержит настройки логирования каналов. По умолчанию сообщения проходящие через канал не запоминаются. Но если включить механизм логирования для канала то в комет сервере будет хранится n последних сообщений прошедших через этот канал.
Для включения механизма логирования в канале надо выполнить следующий запрос.
mysql> insert into pipes_settings (name, length) values ('p10', 10);
Query OK, 1 row affected (0.00 sec)

Здесь параметр length это то сколько последних сообщений будет запомнено. Принимает значения от 0 до 99.
Для того чтобы получить значения настроек канала нужно выполнить запрос выборки из pipes_settings.
mysql> select * from pipes_settings where name = 'p10';
+------+--------+
| name | length |
+------+--------+
| p10  | 10     |
+------+--------+
1 row in set (0.00 sec)

Для того чтобы отключить механизм логирования надо удалить из pipes_settings запись настроек.
mysql> delete from  pipes_settings where name = 'p10';
Query OK, 0 rows affected (0.00 sec)

Механизм авторизации пользователей на комет сервере


Помимо каналов где каждый кто знает имя канала может подписаться на него, есть возможность авторизации пользователей на комет сервере и отправки личных сообщений пользователям по их идентификаторам. Авторизация пользователя происходит в 2 этапа. Первый этап это отправка идентификатора пользователя в вашей системе и случайного хеша в комет сервер.

mysql> INSERT INTO users_auth (id, hash )VALUES (1, 'auth_hash1');

  • Здесь строка auth_hash1 — это текстовый ключ авторизации. Вы его сами генерируете на своём сервере и отправляете сначала в комет по средствам insert запроса в таблицу users_auth, а затем передаёте в JavaScript для авторизации конкретного пользователя на комет сервере.
  • id пользователя на вашем сайте, любое целое положительное число не более чем из 9 цифр.

На втором этапе эти сведения (идентификатор пользователя и хеш) надо передать в JavaScript Api
$(document).ready(function()
{
    CometServer().start({dev_id:1, user_key:"auth_hash1", user_id:"Числовой_Идентификатор_пользователя" })
});

Здесь dev_id это публичный идентификатор разработчика.
И теперь пользователь будет авторизован на комет сервере.

Доставка сообщений для авторизованных пользователей


При отправке сообщений авторизованным пользователям по их идентификатору (insert запрос в таблицу users_messages) сообщения доставляются пользователю на все устройства (До 16 устройств) на которых он прошёл авторизацию в данный момент. Это очень удобно в том случаи если человек зашёл на ваш сайт и авторизовался на нём более чем с одного устройства (к примеру телефон и компьютер или просто в двух разных браузерах сидит одновременно).

Если человек в данный момент ofline то сообщение помещается в очередь сообщений и будет доставлено когда человек появится online. В данный момент для каждого пользователя максимальный размер очереди ограничен.

Основное назначение очереди сообщений это доставка сообщений после кратковременного перехода человека в ofline. Например в тех случаях когда человек обновляет страницу сайта на которой было открыто соединение он уходит в ofline примерно на 1 секунду.

Таблица users_messages


Таблица users_messages предназначена для отправки сообщений авторизованным пользователям по их идентификатору.
Например для отправки сообщения пользователю с id = 2 и текстом сообщения 'message' надо выполнить следующий запрос
mysql> insert into users_messages (id, event, message)values (2, 'event', 'message');
Query OK, 0 row affected (0.00 sec)

Сообщение либо отправлено пользователю сразу либо помещено в очередь для отправки пользователю позже.
Для того чтобы получить все те сообщения которые ещё не доставлены пользователю и находятся в очереди надо выполнить запрос select
mysql> select * from users_messages where id = 2;
+----+-------+-------+---------+
| id | index | event | message |
+----+-------+-------+---------+
| 2  | 0     | evnt1 | message |
| 2  | 1     | evnt2 | messag2 |
+----+-------+-------+---------+
2 rows in set (0.00 sec)

Здесь видно что отправки ожидает 2 сообщения. Они будут отправлены сразу как пользователь появится online.
Таблица содержит колонки:
  • id — Идентификатор пользователя
  • index — Номер сообщения в очереди
  • event — Имя события
  • message — Тело сообщения

Для очистки очереди используйте запрос удаления.
mysql> delete from users_messages where id = 2;
Query OK, 0 rows affected (0.08 sec)

После того как сообщение будет доставлено пользователю оно автоматически удалится из очереди сообщений.

Таблица users_time


Таблица users_time содержит данные о том когда были пользователи online. Таблица доступна только для чтения. Данные о времени хранятся в UNIX-time
mysql> select * from users_time where id in( 2, 3, 145);
+-----+------------+
| id  | time       |
+-----+------------+
| 2   | 0          |
| 3   | 1438245468 |
| 145 | -1         |
+-----+------------+
3 rows in set (0.31 sec)

Здесь пользователь с id = 2 в данный момент на сайте, пользователь с id = 3 был online 30 июля, а для пользователя с id = 145 нет данных.

Таблица users_auth


Таблица users_auth содержит данные для авторизации пользователей на комет сервере.
mysql> insert into users_auth (id, hash )values (12, 'hash1');
Query OK, 1 row affected (0.13 sec)

mysql> select * from users_auth where id in(2, 3, 12);
+----+----------------------------+
| id | hash                       |
+----+----------------------------+
| 2  | bjl6knotdb2t1oov958mhuian7 |
| 12 | hash1                      |
+----+----------------------------+
2 rows in set (0.32 sec)

Здесь для пользователя с id = 3 нет данных, а для пользователей 2 и 12 данные присутствуют.

Важно отметить что в поле hash можно передавать только строки длиной не более 32 символов и соответствующие регулярному выражению [0-9A-z=+/_].
Для удаления данных авторизации пользователей используйте запрос delete
delete from users_auth where id = 12;
Query OK, 0 rows affected (0.00 sec)

Советы тем кто делает своё публичное api


Вот, на мой взгляд, 3 наиболее полезные статьи для любого кто собирается делать публичный api интерфейс:

Комментарии (5)


  1. affka
    10.08.2015 10:26
    +3

    Ни в статье, ни на сайте не нашел информации о том, какие нагрузки может выдержать комет сервер и вообще почему я должен купить ваш сервис и пользоваться им, а не написать свой простой комет-сервер, примеров которых есть 100500+ в интернете?

    И разве хабр не запрещает копировать статьи? Я про comet-server.ru/wiki/doku.php/comet:cometql


    1. Levhav
      10.08.2015 10:32

      Сервис бесплатный в данный момент.
      Копирование для блога компании допустимо.
      Вы можете написать своё решение, но с помощью моего сервиса вы можете сэкономить своё время.
      Своё решение надо хостить на своих серверах, не все хотят и/или могут арендовать vps ради нескольких плюшек для сайта.


    1. Levhav
      10.08.2015 10:37
      -2

      Совместное использование одного сервера для кучи небольших независимых проектов экономит ресурсы, так как иначе каждый должен хостить свой комет сервер на своём на своём vps.


      1. sulla
        12.08.2015 22:46

        И чуть рост нагрузок, падение-тупняк сервиса сказывается на все проектах.

        и так какие НАГРУЗКИ выдерживает сервис?


        1. Levhav
          13.08.2015 03:55

          Я проводил тестирование на VDS от fastvps.ru/vps на тарифе EVO-4-SSD (Intel® Xeon™ 1 Core, 25 GB SSD, 4 GB DDR4)
          На этом хостинге сервер выдерживал от 200 до 3000 сообщений в секунду и до 7200 online при работе по Http (c Https показатели были бы ниже). Сами по себе пользователи онлайн не сильно добавляют нагрузку но их действия (подключение, отключение, отправка сообщений) составляют большую часть нагрузки на сервер. В зависимости от типа сообщений сложность их обработки может отличатся в десятки раз, отсюда и есть такой разброс.

          Тестирование я проводил с целью определить границу при которой надо переходить на следующий тариф а не для того что бы получить максимально высокие значения нагрузки.

          Да любой тупняк или падение сервера заденет всех пользователей размещённых на сервере. Это недостаток любых веб сервисов где несколько человек используют один ресурс совместно. Эта же проблема присутствует на шаредхостингах где по несколько десятков сайтов на одном сервере но ими пользуются потому что это дешевле и проще аренды vps.