Подписка на список групповых / частных чатов в AWS AppSync

В настоящее время я оцениваю AWS AppSync как серверное решение для приложения для обмена сообщениями.

У пользователей будет представление для изучения новых групп чатов и другое представление, в котором они увидят список своих объединенных и закрытых чатов (в списке должны отображаться имя и последнее сообщение чатов). Каждый чат, конечно же, будет иметь подробный вид, в котором отображаются все сообщения.

Вопрос в том, как оформить подписку. Моя Мутация для отправки сообщения будет выглядеть примерно так:

createMessage( content: String, conversationId: ID!, createdAt: String!, id: ID! ): Message

Согласно документации по подписке у меня есть только две возможности создать подписку. Либо я подписываюсь на все новые сообщения, либо на все новые сообщения из определенного разговора, используя идентификатор разговора в качестве аргумента. Поэтому в моем случае мне нужно было бы получить все разговоры пользователей, а затем сделать звонок по подписке для каждого отдельного разговора. Почему-то это кажется проблемой, но я не вижу другого пути (например, пользовательская фильтрация в настоящее время невозможна (по этой ссылке))

Есть ли лучший способ подписаться на новые сообщения для определенного набора сообщений (только в разговорах, на которые я подписан)? Является ли проблемой наличие потенциально сотен активных подписок на клиенте?

заранее спасибо Лука

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
3
0
967
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ты прав. Единственные два способа сделать это из коробки - это:

  1. Подпишитесь на каждую беседу, используя аргумент.
  2. Подпишитесь на все разговоры и фильтруйте сообщения на клиенте.

Если вы подписываетесь на каждый диалог с помощью аргумента (вариант №1), вы можете пакетно отправлять запросы на подписку в одном HTTP-запросе. Например. Отправляйте до 50 подписок с разными аргументами разговора в одном запросе.

Есть третий вариант, при котором вы можете больше поработать, чтобы обеспечить эффективность работы с клиентами. Этот вариант предполагает настройку обратного индекса разговоров с клиентом.

  1. Создайте индекс, в котором вы сможете найти клиентов в ходе беседы. Клиент сделает одну подписку с одним аргументом (возможно, с идентификатором клиента). Когда вы публикуете сообщения, у вас есть промежуточный шаг (вероятно, бэкэнд-задание, которое подписано на все сообщения), на котором вы смотрите в индекс, чтобы определить, какие клиенты заинтересованы в разговоре, для которого вы публикуете сообщение. Затем опубликуйте для каждого клиента.

Большое спасибо, Мичил, я рассмотрю второй и третий варианты. Что касается варианта 3: я не знаю, как выполнить часть «публиковать для каждого клиента». Предположим, что моя бэкэнд-работа будет lamda-функцией, которая будет потреблять все сообщения, затем фильтровать нужных клиентов (используя индекс идентификатора клиента) и публиковать. Как мне закодировать часть публикации?

Luca 10.09.2018 20:21

Если бы вы использовали лямбда-функцию, лямбда-функция выполняла бы следующие действия: 1) Подпишитесь на все новые сообщения 2) Для каждого нового сообщения: 2.1) Определите, для какого разговора это сообщение было. 2.2) Найдите клиентов, которые заинтересованы в этом сообщении 2.3) Для каждого заинтересованного клиента опубликуйте новое сообщение. Чтобы реализовать часть публикации для отдельных клиентов, вы должны отправить мутацию в AppSync для каждого клиента. Примерно так: mutation {publishMessage (client: $ clientId) {yourMessage}}

Michael Willingham 10.09.2018 20:56

Хорошо понял. Поскольку написание одного сообщения может привести, скажем, к 100 мутациям (если в беседах участвуют 100 пользователей), я немного поэкспериментирую с вариантом 1 и, возможно, просто проведу опрос для просмотра моего списка и подпишусь на конкретный чат только в деталях. чтобы быть более рентабельным. Еще раз спасибо за помощь, Майкл, очень признателен!

Luca 10.09.2018 22:43

Другие вопросы по теме