Implement User
GraphQL subscription
#4
Labels
enhancement
Improvement of existing features or bugfix
k::design
Changes of application architecture and implementation design
Background
Бэкэнд предоставляем нам подписку на события
User
а.Problem to solve
Обновления
User
ов нереактивны - пользователь обновляется только тогда, когда к стор стучится свежая модель данных пользователя, а стучится она только тогда, когда моделька пользователя прилетает с любым его содержащим событием. По-хорошему нужно использовать подписку.Possible solutions
Реализовать подписку на
User
а в сторе пользователей таким образом, чтобы подписка поднималась только на тех пользователей, которые нам интересны, а не на всех имеющихся в сторе юзеров. Нам однозначно интересные обновления пользователей:Стоит на ретро обсудить возможные пути реализации такого поведения. Я вижу два пути:
StreamController.broadcast
, у которого есть методыonListen
иonCancel
- стреляют они вот как раз как нам нужно, при появлении первого подписчика и при удалении последнего подписчика (т.е. 0 -> 1 ->onListen
-> 2 -> 3 -> 2 -> 1 -> 0 ->onCancel
). Мы в сторе смотрим на этот контроллер и поднимаем/опускаем подписку соответственно по колбэкам. Заинтересованный в подписке объект должен этот стрим получить, на него подписаться, а после потери интереса отписаться (сделать.cancel()
).UserRepository.get
, если уже не подписаны.Мне лично первый вариант нравится больше, т.к. он учитывает возможную нагрузку и в теории не будет сильно напрягать бэкэнд - мы сами выбираем, обновления каких пользователей нам интересны, их потенциально в разы меньше, чем все запросы
UserRepository.get
, да и мы всегда можем вернуться в "изначальное" состояние, когда нам никто не интересен. Второй вариант в разы проще, конечно, не требует манипуляций вне стора от слова совсем, сильно компактнее. Но и жрать бэкэнд он будет, вероятно, сильнее.The text was updated successfully, but these errors were encountered: