Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement User GraphQL subscription #4

Closed
andrigel opened this issue Jun 21, 2022 · 0 comments · Fixed by #7
Closed

Implement User GraphQL subscription #4

andrigel opened this issue Jun 21, 2022 · 0 comments · Fixed by #7
Assignees
Labels
enhancement Improvement of existing features or bugfix k::design Changes of application architecture and implementation design

Comments

@andrigel
Copy link
Contributor

andrigel commented Jun 21, 2022

Background

Бэкэнд предоставляем нам подписку на события Userа.

Problem to solve

Обновления Userов нереактивны - пользователь обновляется только тогда, когда к стор стучится свежая модель данных пользователя, а стучится она только тогда, когда моделька пользователя прилетает с любым его содержащим событием. По-хорошему нужно использовать подписку.

Possible solutions

Реализовать подписку на Userа в сторе пользователей таким образом, чтобы подписка поднималась только на тех пользователей, которые нам интересны, а не на всех имеющихся в сторе юзеров. Нам однозначно интересные обновления пользователей:

  1. Когда мы находимся на странице пользователя, мы хотим получать его обновления.
  2. Когда пользователь у нас в списке контактов имеется.
  3. Когда есть чат-диалог с пользователем в списке чатов.
  4. Когда мы находимся в чате, мы хотим видеть обновления всех участников чата.

Стоит на ретро обсудить возможные пути реализации такого поведения. Я вижу два пути:

  1. Реализовывать какой-то счётчик заинтересованных в получении обновлений такого-то пользователя. Например, пустой StreamController.broadcast, у которого есть методы onListen и onCancel - стреляют они вот как раз как нам нужно, при появлении первого подписчика и при удалении последнего подписчика (т.е. 0 -> 1 -> onListen -> 2 -> 3 -> 2 -> 1 -> 0 -> onCancel). Мы в сторе смотрим на этот контроллер и поднимаем/опускаем подписку соответственно по колбэкам. Заинтересованный в подписке объект должен этот стрим получить, на него подписаться, а после потери интереса отписаться (сделать .cancel()).
  2. Забить и подписываться всегда, когда прилетает запрос UserRepository.get, если уже не подписаны.

Мне лично первый вариант нравится больше, т.к. он учитывает возможную нагрузку и в теории не будет сильно напрягать бэкэнд - мы сами выбираем, обновления каких пользователей нам интересны, их потенциально в разы меньше, чем все запросы UserRepository.get, да и мы всегда можем вернуться в "изначальное" состояние, когда нам никто не интересен. Второй вариант в разы проще, конечно, не требует манипуляций вне стора от слова совсем, сильно компактнее. Но и жрать бэкэнд он будет, вероятно, сильнее.

@andrigel andrigel added enhancement Improvement of existing features or bugfix k::design Changes of application architecture and implementation design labels Jun 21, 2022
@andrigel andrigel self-assigned this Jun 21, 2022
tyranron pushed a commit that referenced this issue Jul 11, 2022
- add `RxUser` listening to updates in `Contacts` tab and on `User` page
- impl `RxUser` and its subscription to `User` events

Additionally:
- add online status indicators to `Contacts` and `Chats` tab
- add `RxChatContact.id` getter
- fix `UserRepository.get` spamming backend
github-actions bot added a commit that referenced this issue Jul 11, 2022
- add `RxUser` listening to updates in `Contacts` tab and on `User` page
- impl `RxUser` and its subscription to `User` events

Additionally:
- add online status indicators to `Contacts` and `Chats` tab
- add `RxChatContact.id` getter
- fix `UserRepository.get` spamming backend 982cb49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement Improvement of existing features or bugfix k::design Changes of application architecture and implementation design
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant