Статьи

Deepstream: сервер с открытым исходным кодом для создания приложений реального времени

Неделя с открытым исходным кодом

Это неделя с открытым исходным кодом в SitePoint! Всю неделю мы публикуем статьи, посвященные всему, что связано с открытым исходным кодом, свободным программным обеспечением и сообществом, поэтому постоянно проверяйте тег OSW на наличие последних обновлений.

Элтон, глубокий талисман

Элтон, глубокий талисман

Приложения в реальном времени становятся действительно популярными, но их также сложно создавать.

Рост приложений реального времени

В реальном времени есть мир! Или, по крайней мере, это требует все больших и больших укусов. Будь то совместное редактирование в Документах Google, общение через мессенджер Facebook, финансовая торговля в движении, средства управления IoT, живые панели мониторинга или многопользовательские игры — пользователи все чаще ожидают, что изменения произойдут по мере их возникновения.

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

Но как бы ни были популярны приложения реального времени, их также сложно создавать. В то время как для небольших проектов или POC- проектов возможно внедрение функций реального времени, просто добавив щепотку Socket.io, для масштабных сценариев использования требуется принципиально иная архитектура. Такие понятия, как одновременные соединения, отработка отказа, согласованность потоковых данных, постоянство, шифрование и разрешения, должны быть вплетены в структуру, которая обеспечивает работу приложений нового поколения.

Одна из отраслей, где я слишком хорошо это усвоил, — это инвестиционный банкинг. Серверы, которые приводят в действие множество мигающих экранов на мировых торговых площадках, являются монолитными животными, сложными и невероятно дорогими. Но они быстрые. Очень быстро. И у них есть что-то правильное: они используют концепцию, называемую «синхронизация данных».

Концепции в реальном времени

Если вы уже создали приложение реального времени, скорее всего, вы использовали шаблон, который называется «publish-subscribe» или «pub-sub» для краткости: подписчики прослушивают события на канале, а другие публикуют эти события. Это эффективный механизм связи «многие ко многим», который поддерживается широким спектром технологий и сервисов, таких как Socket.io или SocketCluster на стороне открытого исходного кода, или Pusher , PubNub или Ably в пространстве PaaS.

Но есть одна важная вещь, которую pub-sub не может предоставить: состояние. Практически у каждого приложения есть какое-то состояние — данные, которые нужно создавать, читать, обновлять и удалять, но pub-sub доставляет только одноразовые сообщения, которые немедленно исчезают. Обычный обходной путь — использование событий в качестве уведомлений об обновлениях, которые, в свою очередь, побуждают клиента получить последнее состояние с помощью традиционного запроса-ответа. Но это сложно, склонно к несоответствиям и, самое главное, медленно.

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

Технологии, которые поддерживают это, гораздо реже. На стороне открытого исходного кода раньше был прекращенный horizon.io ; в пространстве PaaS есть Firebase от Google .

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

Deepstream.io

Deepstream — это новый тип сервера, который обрабатывает данные в реальном масштабе времени. Он установлен аналогично базе данных или HTTP-серверу. Конечные пользователи и серверные службы подключаются к нему через облегченные SDK, которые поставляются на разных языках программирования, таких как JS / Node, Java / Android или Swift / ObjC.

Deepstream Талисман Элтон печатать

Он обеспечивает синхронизацию данных, а также pub-sub и классический запрос-ответ и обслуживает широкий спектр функциональных требований, таких как отработка отказа, разрешение, шифрование, согласованность и разрешение конфликтов.

Deepstream разработан для процветания в экосистемах с открытым исходным кодом и поставляется с целым рядом разъемов для популярных баз данных, кэшей или шин сообщений.

Но самое главное: это масштабируемо, надежно и очень быстро.

Использование Deepstream

Все это звучит хорошо и хорошо — но как это на самом деле работает? Давайте быстро коснемся основных моментов.

Установка

Deepstream поставляется в виде исполняемого файла для Mac и Windows, пакета yumaptстранице установки .

различные глубокие дистрибутивы

конфигурация

Каждый аспект сервера может быть настроен в файле с именем config.yml/etc/deepstream/conf/conf

Запуск сервера

Сервер запускается либо запуском deepstream start

Получение клиентского SDK

Для подключения к Deepstream требуется SDK для данного языка программирования. Например, для браузеров и Node это можно установить с помощью npm install deepstream.io-client-js

Подключение к серверу

Самый простой способ подключения — это вызвать var client = deepstream('localhost:6020').login() В эту строку можно добавить намного больше, например, передачу параметров клиента, параметров аутентификации или ожидание обратного вызова после входа в систему, но давайте просто оставим это в покое.

Использование синхронизации данных

Синхронизация данных Deepstream использует концепцию, называемую «записи» — документы JSON, которыми можно манипулировать и наблюдать, которые синхронизируются между всеми подключенными клиентами, а также сохраняются на серверной части. Это звучит сложнее, чем есть. Записи идентифицируются уникальным именем и создаются или загружаются на лету:

 pizzaGuy = ds.record.getRecord( 'driver/14' )

Значение записи может быть установлено так:

 pizzaGuy.set({
  name: 'John Doe',
  position: { x: 4234, y: 2454 },
  speed: 22
})

… или частично, вот так:

 pizzaGuy.set( 'position.x', 4244 )

Точно так же другие клиенты могут подписаться на изменения всей записи:

 pizzaGuy.subscribe(( data )=>{
  //...
})

… или к пути внутри него:

 pizzaGuy.subscribe( 'position', updateMapMarker )

Использование событий

События — это паб-суб механизм Deepstream. Они обеспечивают эфемерный обмен сообщениями «многие ко многим». Каждый клиент может подписаться на событие:

 ds.event.subscribe( 'something-happened', data => {})

… или испустить это:

 ds.event.emit( 'something-happened', { size: 'big' })

Использование RPC

Удаленные вызовы процедур — это механизм Deepstream для связи запрос-ответ. Deepstream маршрутизирует запросы между поставщиком и запросчиком, управляет аварийным переключением, повторной попыткой и сериализацией данных.

Процессы могут зарегистрироваться в качестве поставщиков RPC:

 ds.rpc.provide( 'add-two', input, ( response ) => {
  response.send( input + 2 )
})

… и попросить их:

 ds.rpc.make( 'add-two', 5, ( err, result ) => { /* result = 7 */})

Аутентификация и разрешение

Deepstream предлагает целый ряд различных стратегий для аутентификации входящих соединений, например, через файлы конфигурации или http-webhooks . Каждый входящий запрос аутентифицируется с использованием языка разрешений в реальном времени под названием Valve .

 record:
  #an auctioned item
  auction/item/$sellerId/$itemId:

    #everyone can see the item and its price
    read: true

    #only users with canBid flag in their authData can bid
    #and bids can only be higher than the current price
    write: "user.data.canBid && data.price > oldData.price"

    #only the seller can delete the item
    delete: "user.id == $sellerId"

Добавление разъемов

Легко добавить базы данных, такие как Mongo , Rethink или Postgres , кэши, такие как Redis , Memcached или Hazelcast , или системы обмена сообщениями, такие как RabbitMQ или Kafka, для глубокого распространения с использованием коннекторов. Все соединители устанавливаются через командную строку — например, с помощью следующего:

 deepstream install cache redis

Собираем все вместе

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