Задать вопрос
@4sadly

Как сделать отправку сообщений Websocket конкретному клиенту в Go (с использованием Gorilla)+ сохранение сообщений в бд?

есть код js клиента:
let socket = new WebSocket("wss://"+location.host+"/ws");
	console.log("Attempting Connection...");

	socket.onopen = () => {
		console.log("Successfully Connected");
	};

	socket.onclose = event => {
		console.log("Socket Closed Connection: ", event);
	};

	socket.onerror = error => {
		console.log("Socket Error: ", error);
	};
	socket.onmessage = event => {
		alert(event.data);
	};

сервер go:
package main

import (
	"fmt"
	"log"
	"net/http"
	"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
	ReadBufferSize:  1024,
	WriteBufferSize: 1024,
}

func handler(w http.ResponseWriter, r *http.Request) {
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Println(err)
		return
	}
	ReadAndWrite(conn)
}
func ReadAndWrite(conn *websocket.Conn){
	for {
		messageType, msg, err := conn.ReadMessage()
		stringMsg := string(msg)
		fmt.Println("message:" , stringMsg)
		if err != nil {
			log.Println(err)
			return
		}
		answerStringMsg := "your message is: "+stringMsg
		answerByteMsg := []byte(answerStringMsg)
		if err := conn.WriteMessage(messageType , answerByteMsg); err != nil {
			log.Println(err)
			return
		}
	}
}

func main() {
	http.HandleFunc("/ws", handler)
	http.ListenAndServe(":8080", nil)
}

Какую базу данных лучше использовать для сохранения сообщений?
Как лучше будет реализовать сообщения и диалоги?
Пока что я придумал 2 способа:
1 способ: отправлять сообщение определенному пользователю, добавлять сообщение в бд, а после перезагрузки просто восстановить старые сообщения из бд
2 способ: добавлять сообщение в бд и отправлять запрос другому пользователю, чтобы он обновил данные из бд и получил новое сообщение
Если у вас есть более продуманная реализация личных сообщений и диалогов, прошу поделиться ею в комментариях, также в использовании кода клиента допускается php
  • Вопрос задан
  • 573 просмотра
Подписаться 2 Сложный Комментировать
Ответ пользователя Евгений Мамонов К ответам на вопрос (3)
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Способ 2 создаст бОльшую нагрузку на базу, особенно если пользователей будет много.

Я бы использовал способ 1, только сначала сохранял бы сообщение в БД, а потом уже отправлял его получателю через WebSocket.

По выбору базы - тут зависит от того, какую нагрузку вы планируете выдерживать.
PostgreSQL хороший выбор, если вы ранее работали только с MySQL - тоже можете использовать.
Если же вы планируете огромные нагрузки - тогда Cassandra будет хорошим выбором.
Ответ написан