WebSockets обеспечивают двусторонний канал связи между клиентом и сервером в режиме реального времени. Эта мощная технология позволяет превратить статические страницы в живые интерактивные платформы.
GoLang, или Go, – это статически типизированный компилируемый язык, известный своей простотой, эффективностью и сильной поддержкой параллельного программирования. Если объединить GoLang с Gin, высокопроизводительным веб-фреймворком HTTP, то получится динамичный дуэт, способный с легкостью работать с надежными приложениями.
Подготовка поля: Установка
Сначала необходимо установить GoLang. После установки GoLang проверьте установку, набрав:
go version
Убедившись, что GoLang установлен правильно, получим пакет Gin:
go get -u github.com/gin-gonic/gin
Наконец, нам понадобится пакет gorilla/websocket, который позволяет легко работать с WebSocket в Go:
go get github.com/gorilla/websocket
Имея в своем арсенале необходимые инструменты, мы готовы приступить к строительству.
10.2 What are Telegram Bots — Fun with WebSockets!
Создание базового WebSocket с помощью GoLang и Gin
Наша первая задача – построить простой WebSocket-сервер, отправляющий сообщение каждую секунду. Вот базовая схема:
package main import ( «github.com/gin-gonic/gin» «github.com/gorilla/websocket» «net/http» «time» ) var upgrader = websocket.Upgrader < ReadBufferSize: 1024, WriteBufferSize: 1024, >func main() < router := gin.Default() router.GET(«/ws», func(c *gin.Context) < conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil < return >defer conn.Close() for < conn.WriteMessage(websocket.TextMessage, []byte(«Hello, WebSocket!»)) time.Sleep(time.Second) >>) router.Run(«:8080») >
Этот базовый сервер выполняет три действия:
- Он модернизирует HTTP-соединение в WebSocket-соединение с помощью websocket.Upgrader.
- Запускается цикл, который каждую секунду непрерывно посылает сообщение “Hello, WebSocket!”.
- Оно передается на порт :8080.
Включение уведомлений в режиме реального времени
Теперь добавим функциональность реального мира: уведомления. В данном примере мы будем отправлять уведомление “новое сообщение” каждую секунду:
func main() < router := gin.Default() router.GET(«/ws», func(c *gin.Context) < conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil < return >defer conn.Close() i := 0 for < i++ conn.WriteMessage(websocket.TextMessage, []byte(«New message (#»+strconv.Itoa(i)+»)»)) time.Sleep(time.Second) >>) router.Run(«:8080») >
Теперь вместо простого приветствия мы каждую секунду отправляем сообщение “Новое сообщение (#i)”, где i – счетчик, увеличивающийся с каждым отправленным сообщением.
Проверка реальности: Проблемы WebSocket в производстве
Какими бы замечательными ни были WebSockets, они могут создавать проблемы при масштабировании на производстве. К числу наиболее распространенных проблем относятся:
- Масштабирование: WebSockets требует постоянного соединения для каждого пользователя, что может быть ресурсоемким при увеличении числа пользователей.
- Ограничения на количество соединений: Количество одновременных соединений на одном сервере может быть ограничено, что зависит от конфигурации сервера и его аппаратного обеспечения.
- Обрывы соединений: Соединения WebSocket могут обрываться из-за проблем в сети или отключения клиента. Очень важно иметь стратегию восстановления соединения.
- Проблемы перекрестного происхождения: WebSocket придерживается политики одинакового происхождения, что может стать препятствием при неправильном подходе.
Тактика масштабирования WebSocket-приложений
Вот несколько подходов к эффективному масштабированию WebSocket-приложения:
- Балансировка нагрузки: Распределите соединения WebSocket между несколькими серверами с помощью балансировщика нагрузки. Убедитесь, что балансировщик нагрузки поддерживает протокол WebSocket.
- Горизонтальное масштабирование: Вместо того чтобы модернизировать один сервер (вертикальное масштабирование), подумайте о добавлении дополнительных серверов (горизонтальное масштабирование).
- Управление соединениями: По возможности повторно используйте соединения, используя пул соединений.
- Брокер сообщений: Брокер сообщений, например RabbitMQ или Redis, может распределять сообщения между различными серверами, выдерживая большую нагрузку.
Интеграция RabbitMQ: Message Broker в помощь
Чтобы продемонстрировать, как брокер сообщений может помочь, давайте интегрируем RabbitMQ в наше приложение. Вот как это можно сделать:
package main import ( «github.com/gin-gonic/gin» «github.com/gorilla/websocket» «github.com/streadway/amqp» «log» «net/http» «os» ) var upgrader = websocket.Upgrader < ReadBufferSize: 1024, WriteBufferSize: 1024, >func main() < conn, err := amqp.Dial(os.Getenv(«AMQP_URL»)) if err != nil < log.Fatal(err) >defer conn.Close() ch, err := conn.Channel() if err != nil < log.Fatal(err) >defer ch.Close() msgs, err := ch.Consume( «notification_queue», «», true, false, false, false, nil, ) if err != nil < log.Fatal(err) >router := gin.Default() router.GET(«/ws», func(c *gin.Context) < ws, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil < log.Print(«upgrade:», err) return >defer ws.Close() for msg := range msgs < ws.WriteMessage(websocket.TextMessage, msg.Body) >>) router.Run(«:8080») >
В этом обновленном коде мы сначала подключаемся к нашему серверу RabbitMQ и начинаем потреблять сообщения из “notification_queue”. Затем мы передаем эти сообщения клиенту через WebSocket.
Визуализация системы: Mermaid Diagram
Понимание того, как все эти элементы связаны друг с другом, имеет решающее значение. Вот простая схема системы:
На этой схеме показано, как клиент подключается к GoLang Gin Server через WebSocket-соединение. Сервер GoLang Gin Server взаимодействует с брокером сообщений RabbitMQ, потребляя сообщения и передавая их клиенту.
Подведение итогов
Создание масштабируемых WebSocket-сервисов с помощью GoLang и Gin может стать увлекательным и познавательным путешествием. Хотя в производственных средах возникают свои сложности, при правильном проектировании, управлении ресурсами и использовании таких инструментов, как RabbitMQ, их можно преодолеть.
Так что продолжайте кодить, продолжайте исследовать, и пусть ваши WebSocket-приложения будут всегда надежными и эффективными!
Источник: uproger.com
Введение в библиотеку Websockets в python
Вы когда-нибудь задумывались, как ваши любимые чат-приложения остаются на связи? Или как вы получаете мгновенные уведомления на свой смартфон? Войдите в мир веб-сокетов. В эпоху непрерывного подключения и потока информации в режиме реального времени понимание WebSockets может дать вам конкурентное преимущество.
В этой статье мы расскажем о WebSockets и о том, как разработать простое соединение WebSocket, используя websocket с библиотекой Python. Это протокол прикладного уровня, обеспечивающий двустороннюю связь между клиентом и сервером. Веб-сокеты были изобретены разработчиками для эффективного обеспечения результатов в реальном времени.
Реализация веб-сокетов в Python
Давайте начнем с создания веб-сокета, чтобы лучше понять концепцию.
1. Настройка вашей среды
Python. Используем websocket (WebScrapping) [9]
На некоторых сайтах, данные о ценах предметов приходят по веб-сокету. В данной статье, мы научимся подключаться к веб-сокету на сайте quicksell.store, используя библиотеку websocket-client.
Что такое веб-сокет.
Веб-сокет — это протокол обмена сообщениями между клиентом и сервером.
На русском это значит что это, что-то вроде чата (наподобии ВК), где, например ты:
- отпраляешь серверу текст «скинь цены предметов»
- и он отвечает «держи 1 ключ = 1 реф, продавать будешь?»
Сообщения по веб-сокету можно отследить в браузере Mozilla Firefox, используя инструменты разработчика. Теперь. перейдем к делу.
Читаем переписки.
Зайдите на сайт quicksell.store. Откройте инструменты разработчика (F12), зайдите во вкладку Сеть, включите фильтр по веб-сокетам (WS), и обновите страницу.
Выберите любой из вебсокетов, и нажмите на кладку Ответ
Как вы видите, здесь отображены:
Сообщения получены, осталось отправить их через Python скрипт.
Пишем код.
Перед началом, установите библиотеку websocket-client, введя следующую комманду, в коммандной строке.
pip install websocket-client
Далее, cкопируйте себе данный скрипт:
import websocket header = < ‘user-agent’: ‘Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:82.0) Gecko/20100101 Firefox/82.0’ >def on_message(ws, message): try: print(«Got msg: «, message) pass except: print(‘error occured — ignorring’) def on_error(ws, error): print(«received error as <>».format(error)) def on_close(ws): print(«Connection closed») def on_open(ws): print(«Open connection») ws.send(‘<«event»:»load_stock»,»args»:[<«type»:»function»,»id»:»qbotk»>]>’) def start(): websocket.enableTrace(True) ws = websocket.WebSocketApp(«wss://quicksell.store/», on_message = on_message, on_error = on_error, on_close = on_close, header=header) ws.on_open = on_open ws.run_forever() start()
import websocket
Импортируем нужную библиотеку. Опустимся в функцию start.
websocket.enableTrace(True)
ws = websocket.WebSocketApp(«wss://quicksell.store/», on_message = on_message, on_error = on_error, on_close = on_close, header=header)
Здесь, я использую обьект websocket.WebSocketApp который принимает принимает обработчики события. Первым аргументом указал, к какому серверу нужно подключаться wss://quicksell.store.
Передал 3 callBack функции (функции которые вызываются другими функциями).
- on_message — будет вызываться в момент получения сообщения.
- on_error — вызывается, при получении ошибки.
- on_close — запускается перед закрытием веб-сокета.
И передал заголовок (header) с user-agent, на всякий случай.
После чего, передал callBack функцию on_open. Которая, запускается после открытия веб-сокета.
ws.on_open = on_open
И, в конце, открыл веб сокет.
ws.run_forever()
Далее, в функции on_open, я отправил сообщение с помощью функции ws.send, взятое ранее во время отладки, сообщение замените на свое.
ws.send(‘<«event»:»load_stock»,»args»:[<«type»:»function»,»id»:»qbotk»>]>’)
На выходе получили json данные.
Закрыть веб-сокет, можно коммандой ws.close()
Другой вариант написания кода.
Есть еще один способ написания кода. В нем используется обьект WebSocket вместо WebSocketApp. Чуть ниже, привел предыдущий код, адаптированный под обьект WebSocket.
ws = websocket.WebSocket() ws.connect(«wss://quicksell.store/») ws.send(‘<«event»:»load_stock»,»args»:[<«type»:»function»,»id»:»qbotk»>]>’) while True: data = ws.recv() print(data)
ws = websocket.WebSocket()
Создаем обьект WebSocket
ws.connect(«wss://quicksell.store/»)
Подключаемся к серверу
ws.send(‘<«event»:»load_stock»,»args»:[<«type»:»function»,»id»:»qbotk»>]>’)
Отправляем сообщение серверу
while True: data = ws.recv() print(data)
В бесконечном цикле while, получаем данные по веб-сокету (ws.recv), и выводим их в консоль.
Источник: under-prog.ru