Websocket – это компьютерный протокол связи, предоставляющий полнодуплексные каналы связи через одно соединение TCP. Википедия
TCP обозначает протокол управления передачей. Это надежный протокол; Таким образом, гарантирует, что переданные данные будут отправлены во всей его полноте (A.k.a. без потерь). Существует множество различных протоколов более высокого уровня на основе TCP, каждая из которых служит общего назначения передачи данных из одной точки на другой. HTTP, основной протокол связи Интернета, является примером протокола высокого уровня, с которыми знакомы многие разработчики. Websocket работает аналогично HTTP, но имеет свои разнообразные различия.
Один из главных принципов Websocket является полный дуплекс каналы связи. Эти каналы позволяют одновременному двунаправленной передаче данных между двумя сверстниками. Это означает, что в любое время системы в любом конце соединения Websocket могут получать или отправлять данные.
HTTP отличается в этом принципе, потому что, как правило, только клиент может сделать запросы на сервер. Сервер завершает запрос, отправляет ответ обратно на клиента, а затем ждет, чтобы получить другой запрос.
Я использую «вообще» здесь, так как новые версии HTTP позволили вещи, как Server Push Отказ
Рассмотрим сценарий приложений в чате:
Все четыре клиента должны храниться в синхронизации. Когда Джон Отправляет сообщение, Крис , Сэм и Джейн , если все Получать Это как можно быстрее. Если это приложение использует HTTP, Отправить Операция проста, используйте запрос на почту на сервер с сообщением. Но получить Операция немного сложнее. Клиент надо одновременно быть Опрос Сервер для новых сообщений. В зависимости от интервала опроса и количества подключенных клиентов сервер может просматривать тревожный номер запросов для обработки.
С Websockets поток значительно упрощен. Все клиенты устанавливают соединение с сервером и начните Подписаться к определенному Канал Отказ Любой клиент (или сервер) может Опубликовать сообщение указанному Канал в любое время. Когда это так, сервер будет обработать Опубликовать Событие и в зависимости от реализации, будет трансляция Новое сообщение для всех клиентских соединений на Канал Отказ Этот шаблон часто скупится как PUB/Sub Model Отказ И используется множеством приложений, в том числе Гарпердб кластеризация Действительно
Внутренне, Harperdb Кластеры реплицируют данные между экземплярами с использованием двунаправленного паба/подпункта. Клиенты могут подписаться на одинаковые каналы Websocket Harperdb, используемые и получают доступ ко всем обновлениям данной таблицы. Используя этот механизм, разработчики могут создавать приложения с обновлениями данных в реальном времени. Чтобы сделать эту разработку приложению еще проще, Harperdb опубликовал новый модуль Harperdb-Websocket-Client Отказ
Следуйте вместе с демонстрацией ниже, чтобы увидеть его в действии.
Демонстрация
Исходный код для этой демонстрации можно найти в Ethan-Arrowood/Harperdb-Websocket-Tutorial
Эта демонстрация проведет вас через создание проекта Node.js, питаемого Websockets и Harperdb. Приложение станет записью данных CLI с дополнительным сценарием отображения.
Предварительные условия и настройки
Установите свой текущий рабочий каталог на новую папку:
mkdir hdb-websocket-demo cd hdb-websocket-demo
Создать Docker-Compose.yml Файл с этим содержимым:
version: '2'
services:
harperdb:
image: harperdb/hdb:latest
environment:
- INIT_HDB_USERNAME=HDB_ADMIN
- INIT_HDB_PASSWORD=password
- INIT_CLUSTER_USER=cluster_user
- INIT_CLUSTER_PASSWORD=password
- INIT_ENABLE_CLUSTERING=true
- INIT_NODE_NAME=docker_node
- INIT_CLUSTER_PORT=12345
ports:
- 9925:9925
- 31283:31283
- 12345:12345
volumes:
- ./hdb_data/:/opt/harperdb/hdb/
Инициализируйте новый проект NPM и установите два зависимости:
npm i -y npm i undici harperdb-websocket-client
Создайте три файла проекта:
touch init.js data-entry.js data-display.js
И, наконец, запустить Harperdb, используя Docker
docker-compose up
init.js.
Сценарий init содержит некоторые необходимые операции настроек, поэтому приложение CLI имеет схему и таблицу для запроса.
Начните, импортируя Undici Инициализация нового клиента UNDICI и создание двух методов Requestfactory и Readstream Отказ
Undici это новый клиент Node.js http 1.1. Он быстро пылает и имеет действительно расширяемый API.
const undici = require('undici')
const client = new undici.Client('http://localhost:9925') // make sure to use the http port for the HarperDB instance
/**
* This function takes a JSON operation and returns an undici
* client request with the given operation stringified in the
* `body` property.
*/
const requestFactory = op => client.request({
path: '/',
method: 'POST',
headers: [
'content-type', 'application/json',
'authorization', 'Basic SERCX0FETUlOOnBhc3N3b3Jk' // this token was generated based off of the credential settings in docker-compose.yml
],
body: JSON.stringify(op)
})
/**
* This is a helper function for processing the request responses.
* Undici response `body` are returned as streams.
*/
const readStream = async stream => {
let res = ''
for await (let chunk of stream) {
res += chunk
}
return res
}
Далее создайте четыре операции базы данных, используя Requestfactory метод
const dropSchema = () => requestFactory({
'operation': 'drop_schema',
'schema': 'dev'
})
const createSchema = () => requestFactory({
'operation': 'create_schema',
'schema': 'dev'
})
const createTable = () => requestFactory({
'operation': 'create_table',
'schema': 'dev',
'table': 'animals',
'hash_attribute': 'id'
})
const describeTable = () => requestFactory({
'operation': 'describe_table',
'schema': 'dev',
'table': 'animals'
})
Наконец, определить немедленно вызываемую функцию функции (IIFE), используя async/a ждать.
;(async () => {
await dropSchema()
await createSchema()
await createTable()
// destructure the body property from the request response
let { body } = await describeTable()
// process the body stream
let result = await readSTream(body)
// sometimes the table creation fails so retry
if (result.includes('Invalid table')) {
await createTable()
// re-destructure and process
;({ body } = await describeTable())
result = await readStream(body)
}
// Check the intended output in the next code block
console.log(JSON.parse(result))
// close the undici client
client.close()
})()
Теперь, с контейнером Harperdb Docker работает, запустите этот скрипт с помощью Node init.js Отказ Выход должен выглядеть что-то вроде этого (но с другим временем и ID):
{
__createdtime__: 1606254462088,
__updatedtime__: 1606254462088,
hash_attribute: 'id',
id: 'dc42484f-0586-44c7-9e80-9d2f36b6a4ed',
name: 'animals',
residence: null,
schema: 'dev',
attributes: [
{ attribute: 'id' },
{ attribute: '__updatedtime__' },
{ attribute: '__createdtime__' }
],
record_count: 0
}
data-intrent.js.
Наконец, какое-то действие WebStocket!
Начните, импортируя readline и HarprdbwebsocketClient , а также инициализация обоих:
readline это родная библиотека Node.js.
const HarperDBWebSocketClient = require('harperdb-websocket-client')
const readline = require('readline')
// The credentials used here are specific to the docker-compose file defined earlier
const hdbClient = new HarperDBWebSocketClient({
hostname: 'localhost',
socketClusterOptions: {
rejectUnauthorized: false,
autoReconnect: false,
ackTimeout: 10000,
secure: true
},
port: 12345,
username: 'cluster_user',
password: 'password',
implicitInit: true
})
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
// All of the \x1b things are color codes. When this runs in your terminal it should be multicolored!
prompt: '\x1b[34mEnter new animal record, in the format ,,\nExample:\x1b[89m \x1b[36mdog,harper,medium\x1b[89m \n\x1b[91m>\x1b[39m '
})
Далее, используя RL Интерфейс, создать базовый CLI
// kick off the cli
rl.prompt()
rl.on('line', line => {
// for this demo we are skipping any kind of input validation.
// trim the input, split it up into an array, and then trim each entry.
// desctructure into three variables
const [ type, name, size ] = line.trim().split(',').map(v => v.trim())
// Some useful debug info
console.log(`\x1b[33mInserting new animal record: ${JSON.stringify({ type, name, size })}\x1b[89m`)
// ✨ insert the new record using the websocket client
hdbClient.insert('dev:animals', [
{ type, name, size }
])
// prompt the user again for subsequent data entry
rl.prompt()
}).on('close', () => {
// print out a nice message when the user ends the CLI session
console.log('\n\x1b[92mThank you for using HarperDB Animal Data Entry CLI\x1b[39m')
process.exit(0) // exit safely
})
Ядро к этой демонстрации довольно короткое, hdbclient.insert ('dev: животные ", [{тип, имя, размер}]) Это все, что вам нужно для вставки записей через WebSockets! Клиент также поддерживает .Update и .удалять . В это время клиент Websocket не может управлять такими же такими же, как пользователи, таблицы или схемы.
Попробуйте запустить новый скрипт с Узел Data-entrent.js Отказ Следующее изображение показывает, что выводится в моем интерфейсе терминала.
Большой! CLI работает, но мы не можем увидеть новые записи … на data-display.js Отказ
data-display.js.
Начните снова, импортируя и инициализируя HarperdbwebsocketClient Отказ
const HarperDBWebSocketClient = require('harperdb-websocket-client')
const hdbClient = new HarperDBWebSocketClient({
hostname: 'localhost',
socketClusterOptions: {
rejectUnauthorized: false,
autoReconnect: false,
ackTimeout: 10000,
secure: true
},
port: 12345,
username: 'cluster_user',
password: 'password',
implicitInit: true
})
Далее подпишитесь на стол Ввод данных Сценарий вставляет записи в.
hdbClient.subscribe('dev:animals', data => {
const record = data.transaction.records[0]
console.log(`New record ${record.id} inserted`)
})
✨ И просто так, теперь Дисплей данных Будет ли войти каждый раз, когда новая запись добавлена в таблицу!
С контейнером докеров и Ввод данных Сценарий работает, откройте другой терминал и запустите Узел Data-display.js Отказ
Вернитесь к Ввод данных Терминал и введите новую запись. Вы должны увидеть новый идентификатор в Дисплей данных Терминал.
Следующий скриншот показывает тот же выход из Ввод данных Как и прежде, но и с Дисплей данных вывод справа.
Отличная работа! Теперь введите столько записей, сколько вам нравится, и посмотрите, как подключения WebSocket почти мгновенно выводят новые записи. И для особой трюки попробуйте открыть еще два клемма. Выполните обе сценарии снова, чтобы у вас были два экземпляра клемм для каждого сценария. Введите запись на первый Ввод данных терминал и увидеть его вывод в обоих Дисплей данных процесс. Введите другую запись во втором Ввод данных Терминал и увидеть его также вывод в обоих Дисплей данных Процессы! Websockets довольно потрясающие.
Я надеюсь, что вам понравилось эту статью. Меня зовут Итан Arrowood И я инженер для программного обеспечения полный рабочий день для Microsoft. Я также вкладчик с открытым исходным кодом для Застеживать и Node.js Отказ Приходи скажи привет в Twitter ( @arrowoodtech ) и github ( @ @ ethan-arrowood ).
Оригинал: “https://dev.to/ethanarrowood/harperdb-and-websockets-3p6k”