generated from PenaSide/GolangTemplate
Общая реактивность: единая шина #12
No reviewers
Labels
No Label
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed/Requested
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: PenaSide/customer#12
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "event_bus"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
нам нужно реализовать возможность отдавать сообщения для реактивности от любого сервиса через некоторый ебинфй интерфейс. даже если произошло что-то в воркере, мы должны оповестить об этом пользователя. для этого нужно
использовать будем https://github.com/golang-queue/queue в качестве единого интерфейса
единой шиной пусть будет редис. т.е. сразу фигачим не через кольцевой буффер, а через редис
единая очередь должна реализовывать максимально простую логику:
сама работа с очередью крайне проста получается. но вот вопрос подписывания, отписывания и отправки конкретному пользователю это сложный момент. тут есть следующие подводные камни:
у меня есть идеи, как это сделать, но я думаю тебе будет придумать своё решение, описать его сюда и потом сравним идеи
так я надумал, попытаюсь кратко изложить что надумал
всего я надумал 5 точек
1 самая незначительная, просто нужно упомянуть это модель sse события
туда бы положить следующие поля:
и модель sse соединения которая будет хранится в мапе
туда я думаю сложить вот это - но не уверен что этого может быть достаточно:
вот в принципе по моделям все
некст точка - продюсер, почтальон
примерно я представляю его структуру так:
довольно нищая, но больше ничего и не нужно
тут будут методы отправки сообщения
пинга
закрытия
ну и самое важное что тут нужно будет реализовать это поключение с помощью - https://github.com/golang-queue/queue для того чтобы отправлять в очередь т.е. в редиску
второй микро чел, но побольше это консюмер
его структру вижу примерно такой:
тут в теории будет мало кода:
самый большой это будет конструктор - тк нам нужно определить правильно queue чтобы читала правильно и как бы тут будет основная логика обработки сообщений
по дефолту Start Stop
в теории можно еще добавить что в продюсер что в консюмер такие штучки как хелсчеки и "статистику" для прометеуса ( но это на будущее, пока хз надо ли оно нам, просто как предложение)
в принципе тут все
и последний мега чел это ConnectionDispatcher - это будет управляющий соединениями пользователей
думал структурку для него примерно вот это надумал:
тут будут методы регистрации соединения, удаления зарегистрированного соединения, отправка юзеру события (и даже нескольким) и воркер который будет следить за контекстом соединений по контексту из первой структуры и удалять погибшие соединения
вроде все ключевое описал... довольно тяжко слов не хватает все это описать более подробно
ctx и cancel в структуры не складываем. управлять соединением должен fiber, с нашей стороны не должно быть инструментов для его обрыва, мы лишь должны узнать, что оно оборвалось
что будет ключем этой мэпы? с подключениями? можем ли мы обойтись без мьютекса в сценарии, когда добавляется ещё один коннект для одного и того же пользователя?
насчет метода пинга я не понял. ты предлагаешь пинг гонять через очередь?
а для чего в ConnectDispatcher мэпа мэп?
окей
мапа будет примерно такая - [key1-userid] = [key2-deviceid]SSEConnection
без мьютекса думаю не получится, велик шанс гонки данных, надо подумать может как то подругому это реализовать есть способ...
для того чтобы отправлять на каждое подключенное устройство пользователя, достаточно будет иметь только его id тогда можем потом ренжить по мапе с девайс-конекшндата
эээ, это я что то чиканулся видимо когда писал, вообще про очередь не подумал - думал прежде чем подключать "пакет очередь" делать пинг в редис, чтобы его проверить что работает, но наверное лишнее
у нас не будет необходимости послать сообщение на конкретное устройство пользователя. гарантирую. поэтому мэпа тма лишняя, достаточно слайса. и слайс будет не сильно большой кроме случаев, когда нас будут хотеть досить. так что пришло сообщение - в цикле разослал по всем элементам слайса. т.е. не мэпа мэп, а мэпа слайсов
в случае с мэпой в целом довольно сложно избежать гонки. но мне кажутся два варианта довольно рабочими в случае слайса:
окей, понял
попробую с мэпой слайсов сделать
вроде годно звучит
Checkout
From your project repository, check out a new branch and test the changes.