Это неделя с открытым исходным кодом в 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.
Он обеспечивает синхронизацию данных, а также pub-sub и классический запрос-ответ и обслуживает широкий спектр функциональных требований, таких как отработка отказа, разрешение, шифрование, согласованность и разрешение конфликтов.
Deepstream разработан для процветания в экосистемах с открытым исходным кодом и поставляется с целым рядом разъемов для популярных баз данных, кэшей или шин сообщений.
Но самое главное: это масштабируемо, надежно и очень быстро.
Использование Deepstream
Все это звучит хорошо и хорошо — но как это на самом деле работает? Давайте быстро коснемся основных моментов.
Установка
Deepstream поставляется в виде исполняемого файла для Mac и Windows, пакета yum
apt
странице установки .
конфигурация
Каждый аспект сервера может быть настроен в файле с именем 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 до требовательных приложений обмена сообщениями, панели мониторинга в реальном времени или даже многопользовательских игр. Это надежный, безопасный и предоставляет все функции, необходимые для запуска крупномасштабных приложений реального времени в производстве.