Vladislav
А models.CALL и т.п. это константы?
Vladislav
Какого типа?
Александр
да, интовые
Александр
Пока мысли примерно такие: Events = map[string]string{ "request_messages": fmt.Sprintf("%s-%s", models.CALL, models.GET), "send_message": fmt.Sprintf("%s-%s", models.CALL, models.POST), }
Vladislav
Ну я регистрацией обычно такое делаю.
Vladislav
Мапа(лучше массив если константы позволяют), в которой соответствие константе функции.
Александр
Один из вариантов есть такой
Александр
И тестить потом проще будет
Anonymous
Вы по книгам го учите? Линкс?
Александр
Вы по книгам го учите? Линкс?
нет, я просмотрел на pluralsight курсы, параллельно с ноутбуком на коленках и с паузами: https://app.pluralsight.com/library/courses/go-fundamentals/table-of-contents https://app.pluralsight.com/library/courses/go-concurrent-programming/table-of-contents + я давно знаю другие языки, немного легче понять
Александр
выглядит как шаблон observer https://gist.github.com/sayden/d3ab61726057b7a37963
Реактивщина в golang?) Не приходило в голову)
Александр
Хотя чё, в java/node/js же есть
Александр
выглядит как шаблон observer https://gist.github.com/sayden/d3ab61726057b7a37963
Этот паттерн по сути реализуют каналы, только с разницей в синтаксисе и с буферизацией
Александр
Ну, если полный rx не рассматривать, а паттерн Observer
Slach
а я правильно понял текущую концепцию работы с database/sql ? повторно *Rows пройтись через .Next() нельзя??? т.е. надо обязательно после запроса профетчить и сложить куда нибудь себе в буфер? если хочешь повторно использовать?
Anonymous
Ребят, хотел бы узнать как правильно будет реализовать следующие. Есть СУБД, бэкенд на Го и фронт на Vue По ходу добавления новых записей в СУБД (Postgresql) на фронтенд должна передаваться эта запись. Как я вижу это: Триггер в СУБД срабатывает при добавление новой записи и отправляет запрос в бэкенд на го (с этой новой записью), на фронте раз в несколько секунд делается запрос к бэкенду на проверку новых записей и если есть, то получит его уже с бэкенда...
Anonymous
Вроде того, что если кто добавил через этот бэкенд новую запись, то все его клиенты должны обновить свой items?
клиенты могут быть подключены к чему-то вроде publish-subscribe (например вебсокет или редис) и они автоматом смогут получать обновления
Anonymous
Александр
Можно поподробнее, не понимаю про что вы
запрос раз в несколько секунд приведет к геометрическому росту нагрузки на сервак при увеличении кол-ва пользователей. Если подключиться к сокетам и сервак будет сообщать об изменениях только тогда, когда они произошли, то даже арифметического увеличения не будет
Александр
Ну вот так я и предлагал изначально
Зависит от конкретных целей задачи. Может слушать базу, может только по f5 обновлять данные, может с бэка отправлять после изменений в базе. Смотря что вы делаете)
Александр
Вообще лучше забудьте об опросе с клиента с интервалом навсегда)
Александр
Сами себя заддосите
Anonymous
Нужно по пабсаб почитать
Александр
А когда проблема появится (внезапно) - вы вообще ничего не сможете сделать, кроме как остановить сервер
Anonymous
Можно слушать изменения в постгре. Более того, можно написать триггеры, которые будут в кролика что-то отправлять при изменениях
посмотрел, на основе этого работает https://www.postgresql.org/docs/9.5/static/sql-notify.html никогда не сталкивался, интересно
Александр
до сокетов как делали?
так и делали, появилась проблема - пришло решение с вебсокетами
Kirill
а если какой-нибудь firebase Cloud messaging юзать?
Anonymous
Можно пример реализации pub/sub на Go?
Александр
а если какой-нибудь firebase Cloud messaging юзать?
Он по сокетам проде работает?
Anonymous
Можно пример реализации pub/sub на Go?
я лично предлагал конкретно вот это. реализация на стороне редиса https://redis.io/topics/pubsub
Kirill
я хз, это либа гугловая которая тебе оповещения кидает на события
Александр
Можно пример реализации pub/sub на Go?
Пакет http и gorilla/websocket, там в вашем случае скорее всего нечего делать, если нет всяких авторизаций и т.п.
Anonymous
Авторизация есть
Александр
я лично предлагал конкретно вот это. реализация на стороне редиса https://redis.io/topics/pubsub
В редисе сработал publish и исчез. Прослушал - досвидос, тут лучше кролика
Nikita
Rabbitmq
Anonymous
кролик с персистент очередями - не для хайлоада решение
Александр
ну кто слушает события, тот услышит, если упал, то прослушал своё сообщение)
Александр
кролик с персистент очередями - не для хайлоада решение
Я не думаю, что у парня хайлоад. Скорее всего, для админа смотреть изменения в таблицах или для девелопера
Anonymous
ну кто слушает события, тот услышит, если упал, то прослушал своё сообщение)
зависит от требований - надо ли оффлайн события получать или нет
Anonymous
Извините не совсем понимаю как это будет выглядеть, как редис будет получать инфу о новых записях в БД Postgresql
Anonymous
Anonymous
Извините не совсем понимаю как это будет выглядеть, как редис будет получать инфу о новых записях в БД Postgresql
моя реализация полностью такова: в базу вставляет код на го. он же посылает в пабсаб редиса данные. подписчики редиса получают эти данные.
Nikita
Либо отлавливать на уровне бизнес-логики
Nikita
Мне это даже более приемлемым кажется
Александр
зависит от требований - надо ли оффлайн события получать или нет
согласен. Если не нужен офлайн - проще с редисом
Kirill
на уровне бд шустрее же, не?
Kirill
Либо отлавливать на уровне бизнес-логики
Kirill
Мне это даже более приемлемым кажется
Александр
моя реализация полностью такова: в базу вставляет код на го. он же посылает в пабсаб редиса данные. подписчики редиса получают эти данные.
Блин, так ты хочешь не базу слушать, а отправлять при запросе в БД? тогда никакие pg_notify и redis не нужны, шли сразу в сокеты
Anonymous
А на фронте напрямую ходят к редису за инфой, или через бэкенд?
клиенты могут коннектиться к вебсокету, который написан на го и слушает уведомления из редиса
Anonymous
у меня было 2 хайлоад проекта на такой схеме на одной из старых работ.
Nikita
на уровне бд шустрее же, не?
Заранее вряд ли об этом имеет смысл задумыаться
Anonymous
хотя если pg_notify не тупит, но можно и его слушать а редис не добавлять. так меньше баз будет. я просто никогда не работал с pg_notify и не знаю, что он и как он. редис точно для хайлоада подойдет
Anonymous
Смотрите что откопал https://github.com/go-redis/redis Правильно я понимаю, что для этого лучше сделать отдельный микросервис?
Александр
Смотрите что откопал https://github.com/go-redis/redis Правильно я понимаю, что для этого лучше сделать отдельный микросервис?
Ты скажи, тебе достаточно будет, если из приложухи изменяется база и ты в приложухе можешь отловить это событие, или если руками в базе или из другого сервиса что-то поменяли - тоже бывает и это нужно?
Александр
в 1 случае всё просто - без триггеров в базе/кролика и т.п.
Anonymous
есть даже сразу проекты вебсокет + пабсаб редиса https://github.com/cooperhewitt/go-pubsocketd
Александр
Тогда pg_notify -> redis -> go -> ws
Anonymous
Тогда pg_notify -> redis -> go -> ws
тогда можно так: pg_notify -> go -> ws
Александр
Вешается триггер на базу, который шлёт с помощью pg_notify publish в редис, go слушает редис, при сообщениях шлёт в ws клиенту
Anonymous
Вешается триггер на базу, который шлёт с помощью pg_notify publish в редис, go слушает редис, при сообщениях шлёт в ws клиенту
А клиент (ws) получается постоянно подключен через сокет к бэкенду и слушает обновления?