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



Предыстория


Ранее мой опыт работы с платформой был близок к нулю, поэтому чтобы разобраться в огромном количестве сервисов платформы, я снова обратился к своему знакомому из IBM. Мне казалось очевидным использовать сервис Message Hub, но в итоге оказалось, что для решения нашей задачи лучше подойдет MQ Light. Основные причины:
  • тариф в бесплатные 10 тысяч сообщений в месяц
  • хорошая масштабируемость
  • простой в использовании API



Так же рассматривали вариант использования сервиса IoT Foundation, но, как оказалось, устройства не могут подписываться на получение любых других событий кроме команд, а отправлять собственно команды они тоже не могут. Получается, отправлять данные мы можем как хотим, а получать только в виде команд.

Итак, перейдем в Dashboard IBM Bluemix.

Регистрируем облачный сервис


Так как для чата нам не потребуется никаких обёрток на стороне сервера, нужно только зарегистрировать сервис и получить данные для подключения.

Заходим в панель, нажимаем “Use services or APIs”:


Ищем MQ Light:


И берём один такой себе.


Возвращаемся в Dashboard, выбираем MQ Light – Service Credentials. Создаём себе данные для авторизации наших приложений.


Получаем:

Проверьте заранее наличие “;” в логине и пароле. Компилятору оно не очень понравится, лучше сгенерировать новую пару.

Создаём десктопное приложение


Поскольку нам нужно быстро создать рабочее приложение – используем Node.JS и устанавливаем библиотеку MQ Light.
npm install mqlight


… и открываем нашу среду разработки. Первым делом необходимо подключить библиотеку:
var mqlight = require('mqlight');


Теперь, чтобы создать реалтайм чат, нам придётся работать с вводом данных из консоли. Для этого отлично подойдёт стандартная библиотека из набора Node.JS – readline.
var readline = require('readline');


Добавим немного переменных для MQ Light.
var TOPIC = "mqlight/simplechat"; 
var SHARE_ID = "";
var opts = {
  service: 'connectionLookupURI', //Данные из предыдущего этапа
  user: 'username',
  password: 'password'
};


И не забываем про ввод/вывод:
var rl = readline.createInterface(process.stdin, process.stdout);


Далее, при запуске спрашиваем ник и подписываемся на канал с ником в share id:
Скрытый текст
mqlightClient.on('started', function() {
  rl.question("Please, choose your nickname: ", function(result) {
    SHARE_ID = result;
    console.log("Welcome,", SHARE_ID, "!");
    rl.setPrompt(SHARE_ID + '> ');
        
    mqlightClient.subscribe(TOPIC, SHARE_ID, 
    { credit : 5,
      autoConfirm : true,
      qos : 0}, 
    function(err) {
      if (err) console.error("Failed to subscribe: " + err); 
      else {
        console.log("Subscribed to " + TOPIC);
        rl.prompt();
      }
    });
  });
});


И обрабатываем получение сообщения (событие 'message' в MQ Light) и отправку сообщения (ловим событие 'line' в readline):
Скрытый текст
mqlightClient.on('message', function(data, delivery) {
  data = JSON.parse(data);
  if (data.id != SHARE_ID) {
    readline.clearLine(process.stdout, 0);
    rl.setPrompt(data.id + '> ');
    rl.prompt();
    console.log(data.message + '                 ');
    rl.setPrompt(SHARE_ID + '> ');
    rl.prompt();
  }
});

rl.on('line', function(message) {
  if(message != "") {
    var data = JSON.stringify({
      id: SHARE_ID,
      message: message
    });
    mqlightClient.send(TOPIC, data, {
      ttl: 60*60*1000
    });
    rl.prompt();
  }
});


Приложение готово. При запуске оно попытается подключится к серверам IBM, затем спросит ник, и подпишется на канал /mqlight/simplechat с ником в качестве SHARE ID. На всё ушло всего 64 строки! Кажется, весьма неплохой результат для одного вечера.

Тестирование


Проверяем, всё ли работает:


Profit! А вот так это выглядит в панели управления:


Заключение


Теперь о результатах.
  • 64 строчки кода
  • Следуя инструкции на создание чата уйдет 20-30 минут
  • Сервисы платформы сокращают ~40% времени, учитывая, что нужно поднять сервер, написать код для бекэнда
  • Дополнительным плюсом, данные передаются в зашифрованном виде из коробки, с помощью TLS


Итак, мы решили поставленную задачу: создать чат с минимальными затратами ресурсов, всего за один вечер. С помощью IBM Bluemix можно быстро создавать приложения любой сложности, используя множество уже готовых сервисов и API. Что же, облачные технологии развиваются, и в будущем работа программиста может стать гораздо проще и интереснее, а как вы считаете?

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


  1. SOLON7
    05.12.2015 13:46

    кроме чата, какие еще функции есть из коробки?


    1. Moon_darker
      05.12.2015 14:33

      Из коробки MQ Light позволяет создавать каналы (топики) и обмениваться в них данными по защищённому (или не защищённому, на ваше усмотрение) соединению. С этим вы можете делать абсолютно всё, что хотите, чат я сделал просто потому, что это очень простой пример :)


      1. Levhav
        05.12.2015 15:35

        А помимо каналов что то ещё есть? Может бд или какие то ещё возможности. Просто облачных комет сервисов не так уж и мало, что может этот такого чего не умеет pusher.com или parse.com или comet-server.ru?


        1. Moon_darker
          05.12.2015 16:46

          Конкретно MQ Light разработан не совсем для этих целей, но в наборе IBM Bluemix есть куча различных инструментов. Я узнал об этой платформе относительно недавно, поэтому ничего конкретного про сервисы кроме MQ Light сказать не могу, но вы можете ознакомиться со списком сервисов в панели управления Bluemix (регистрация необязательна, конечно же).


        1. millstone
          05.12.2015 17:46

          Если говорить об MQ Light, то это просто реализация AMQP, т.е. все достаточно низкоуровневое. Если нужно больше готовых «плюшек» — push, awareness и т.п., в Блюмиксе есть PubNub. Но с ним статья получится совсем не интересной, поскольку код писать вообще не придется )