PubNub публикует сообщение между двумя частными каналами

Я использую Php и MySQL.

Я только что подписался на API push-уведомлений pubnub и успешно сделал свое первое push-уведомление, используя API-интерфейс PHP Push, предоставляемый Pubnub. Я новичок в этой технологии реального времени, поэтому у меня возникли некоторые вопросы, которые мне сложно понять. Я много раз гуглил и искал во всем стеке. Я не получал никаких соответствующих предложений или вопросов где-либо еще, поэтому я записываю свой вопрос здесь, чтобы получить ваш совет и помощь экспертов.

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

  1. Зарегистрированные пользователи слушают Channel1-Public
  2. Зарегистрированные пользователи слушают частный канал UsersOwnDynamic, чтобы получать уведомления, связанные и предназначенные только для него.

К вашему сведению: Эта ссылка в PubNub говорит о создании имен LongChannel, чтобы избежать отслеживания каналов

Мои вопросы приведены ниже:
A. Всегда ли мне нужно создавать новое частное имя динамического канала каждый раз, когда я захожу на сайт. Если да, то как другие пользователи узнают, как отправить уведомление на мой частный канал? Или мне просто нужно иметь только одно статическое имя канала, хранящееся в таблице базы данных, чтобы другие аутентифицированные пользователи запрашивали таблицу и получали мой частный канал имя для отправки мне уведомлений. Если это так, не думаете ли вы, что если хакер получит имя какого-то частного канала определенных пользователей, они смогут прослушать этот канал?

Б. Я использую PHP и MySQL, поэтому до сих пор не могу придумать способ или придумать решение для отправки сообщения на частные каналы другого пользователя.
Давайте рассмотрим пример простой системы запроса дружбы.
- Пользователь А отправляет пользователю Б запрос в друзья.
- UserB прослушивает свое собственное динамическое частное имя канала с именем DynamicPrivateChannelB
(как UserA найдет имя канала для UserB, которое является частным? Я думаю, что единственный способ для этого - это то, что частный канал UserB должен храниться в таблице базы данных для каждого пользователя, вошедшего в систему, чтобы запросить его. Верно ли я думаю?)

<?php 

    //first way. How can i possibly achieve this.
    $sqlquery = "sent friend request from userA to userB"; 
    require('Pubnub.php'); 
    $pubnub = new Pubnub( 'pubkey', 'subkey' );
    $pubnub->publish( array(
        'channel' => 'how do i find the private channel name for userB to sent this notification?', 
                    'message' => array('friend_request' => 'A friend request') ) 
                    );

  //2nd way ? Is this the right way ?
    $sqlquery = "sent friend request from userA to userB"; 
    $privatechannelofuserB = "get the channel name of userB from the db table";
    require('Pubnub.php'); 
    $pubnub = new Pubnub( 'pubkey', 'subkey' );
    $pubnub->publish( array(
        'channel' => '$privatechannelofuserB', 
                    'message' => array('friend_request' => 'A friend request') ) 
                    );
?>

C. Если мы всегда генерируем динамические имена частных каналов, сохраняем их в таблице базы данных и обновляем каждый раз при создании новых динамических имен каналов. Я думаю, это вызовет проблему, потому что некоторые сообщения не будут доставлены, поскольку новые динамические имена частных каналов заменяют старые.

D. Итак, у меня есть много уведомлений для отправки на один канал, таких как запрос новых друзей, ответы на новые личные сообщения, запросы новых подарков и многие другие подобные. Как мне отправить все эти данные в канал и как узнать и проанализировать данные входящих новых уведомлений. Я знаю, что JSON - это формат для отправки, но я не уверен в формате отправки.

Согласно эту ссылку, один канал Pubnub может содержать не более 100 сообщений. Означает ли это, что если на один канал приходит сразу 200 сообщений, первые 100 доставляются, а остальные находятся в очереди? Как насчет того, чтобы сразу 10 000 сообщений приходили на один канал? Все ли оставшиеся сообщения остаются в очереди? если да, то как он доставляется подписчику в реальном времени?

Позвольте мне предложить еще один простой сценарий, которого я пытаюсь достичь.

  • Пользователь A аутентифицирован и вошел на сайт.
  • UserA генерирует собственное имя динамического канала, UserAx732dsw3efsdfsdfsdf
  • UserA начинает слушать свой недавно созданный канал UserAx732dsw3efsdfsdfsdf
    (теперь userA должен начать получать сообщения от других)


- UserB отправляет личное сообщение пользователю userA.
(Теперь только пользователь A должен получать уведомления на своем частном канале о новом личном сообщении, как пользователь B или Система может узнать имя канала UserAx732dsw3efsdfsdfsdf, потому что это частный канал, динамически генерируемый userA, и ни System, ни userB не имеют к нему доступа. То же самое что-то происходит и с пользователемB, если userB должен быть снова уведомлен каким-либо другим лицом или системой, должен быть способ узнать имя динамического канала userB.

Другая проблема заключается в том, что в этом сценарии пользователь динамически генерирует имя канала каждый раз, когда он / она входит на сайт. Что произойдет со всеми сообщениями который был отправлен в динамический канал? Сохраняет ли pubnub все созданные имена каналов на своем сервере? Есть ли способ, которым система или пользователь могут узнать, Имя nnel все еще принадлежит и хотя бы один пользователь слушает канал?.

Мне любопытно это узнать, потому что у меня есть следующие концепции:

  • UserA создает dynamicChannelA при входе на веб-сайт в 1:00.
  • UserA начинает получать много уведомлений на его динамический канал dynamicChannelA
  • Теперь UserA выходит с веб-сайта в 1:30 AM, что произойдет со многими другими пользователями, которые все еще отправляют уведомление на его dynamicChannelA , потому что к следующему разу, когда UserA войдет на сайт, UserA будет прослушивать другое имя динамического канала. UserA не будет слушает его предыдущий канал dynamicChannelA.


Я думаю использовать метод получения имени канала конкретного пользователя из таблицы базы данных. Есть ли способ или способ предотвратить несанкционированную подписку на канал? Потому что любой может подписаться на имя канала, если у него есть ключ подписки и имя канала, независимо от длины имени канала. Мне просто любопытно, потому что вся подписка происходит на стороне клиента, и ключ подписки и названия каналов видны.


person RT Roger    schedule 01.06.2012    source источник
comment
Привет, RT Роджер. Спасибо за вопросы! Это действительно подробный список. Мы предоставим отзыв на этой неделе.   -  person Stephen Blum    schedule 04.06.2012
comment
Большое спасибо за то, что дали мне знать, я буду ждать отзывов.   -  person RT Roger    schedule 04.06.2012
comment
Отметьте этот ответ, если он полезен stackoverflow.com/questions/42666799/   -  person maytham-ɯɐɥʇʎɐɯ    schedule 17.03.2017
comment
@RTRoger У меня такие же сомнения   -  person Arj 1411    schedule 05.01.2018


Ответы (1)


Не существует единого способа решения проблем, с которыми вы столкнулись. Наши клиенты использовали самые разные шаблоны проектирования, чтобы справиться с ними. Я сам сталкивался с подобными вещами при создании приложений PubNub, и я помогу вам, насколько смогу.

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

Зарегистрированные пользователи слушают Channel1-Public Зарегистрированные пользователи слушают частный UsersOwnDynamic-Channel, чтобы получать уведомления, связанные и предназначенные только для него.

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

A.

Всегда ли мне нужно создавать новое частное имя динамического канала каждый раз, когда я захожу на сайт?

Не обязательно, хотя это хороший способ. Для этого вы можете использовать PUBNUB.uuid() в JavaScript на стороне клиента. Или сгенерируйте его на стороне сервера с помощью PHP и отобразите его клиенту. Возможно, вы могли бы установить его как файл cookie, чтобы у клиента всегда был к нему доступ.

Если да, то как другие пользователи узнают, как отправить уведомление на мой частный канал.

Они могли получить идентификаторы с сервера PHP; либо через глобальный канал, либо через собственный частный канал пользователя, который они слушают.

Или мне просто нужно иметь только одно статическое имя канала, хранящееся в таблице базы данных, чтобы другие аутентифицированные пользователи запрашивали таблицу и получали имя моего частного канала для отправки мне уведомлений.

Вы тоже можете это сделать. У вас может быть глобальный канал, который пользователи могут отправлять, отличаться от глобального канала, который они слушают. Только сервер имеет этот ключ подписки. Таким образом, аутентифицированные пользователи отправляют на сервер сообщение, в котором говорится: «Мне нужны соответствующие пользовательские ключи», затем сервер выполняет запрос и отправляет сообщение обратно по частному каналу этого пользователя.

Если это так, не думаете ли вы, что если хакер получит имя какого-то частного канала определенных пользователей, они смогут прослушать этот канал?

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

B.

Я использую PHP и mysql, поэтому я до сих пор не могу придумать способ или придумать решение для отправки сообщения на частные каналы другого пользователя. Давайте возьмем пример простой системы запросов на добавление в друзья. - UserA отправляет пользователю UserB запрос в друзья. - UserB прослушивает свое собственное динамическое имя частного канала под названием DynamicPrivateChannelB (как UserA найдет имя канала для UserB, которое является частным? Я думаю, что единственный способ для этого - то, что частный канал UserB должен храниться в таблице базы данных для каждого пользователи, вошедшие в систему для запроса. Я правильно думаю?)

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

Сторона сервера

  • Прослушивает сообщения пользователя по каналу Global-user-send-channel. Этот ключ подписки есть только у сервера.
  • Может запрашивать базу данных для получения идентификаторов пользователей, а затем отправлять их различным идентификаторам по желанию
  • Также можно отправлять по глобальному пользовательскому каналу приема, который слушают все клиенты. Этот ключ публикации есть только у сервера.

Сторона клиента

  • Слушает глобальный пользовательский канал приема. Вот как он получает массовые серверные трансляции. Невозможно отправить по этому каналу (есть только ключ подписки)
  • Отправляет сообщения сервера по глобальному пользовательскому каналу отправки. Невозможно получить на этом канале (есть только ключ публикации)
  • Слушает частный пользовательский канал. Так пользователь получает личные сообщения. Он также может использовать это для связи между клиентом.
  • Предотвратите злоупотребления, добавив ко всем личным сообщениям личный ключ для каждого пользователя, хранящийся на сервере и предоставляемый во время начальной загрузки страницы. Таким образом, клиент знает, является ли сообщение, которое якобы отправлено с сервера, законным.

C.

Если мы всегда генерируем динамические имена частных каналов, сохраняем их в таблице базы данных и обновляем каждый раз, когда генерируются новые имена динамических каналов. Я думаю, это вызовет проблему, потому что некоторые сообщения не будут доставлены, поскольку новые динамические имена частных каналов заменяют старые.

Если вы будете осторожны при создании новых имен каналов, это не должно быть проблемой. Имейте в виду, что клиент всегда может сказать на канале Global-user-send-channel: «Привет, я здесь! это мой идентификатор. держи меня в курсе'. Обычно я разрабатываю свои приложения так, чтобы клиенты автоматически выкрикивали это каждые 30 секунд или около того.

D.

Итак, у меня есть много уведомлений для отправки на один канал, таких как запрос новых друзей, ответы на новые личные сообщения, запросы новых подарков и многие другие подобные. Как отправить все эти данные в канал и как узнать и проанализировать данные входящих новых уведомлений. Я знаю, что JSON - это формат для отправки, но я не уверен в формате отправки.

JSON хорош для отправки и получения. Я делаю это так, чтобы иметь свойство с именем «name», которое определяет тип сообщения. Например:

{
    "id"   : "blah_blah_unique_id",    // sender_client_id 
    "name" : "friend_request",         // type of message
    "data" : {                         // the data itself
               "requested_friend_id" : "blah_blah_some_other_unique_id" 
             }
}

Фактически вы можете использовать любой формат, который хотите, но мы обернем его в JSON (обычно это означает просто заключить в кавычки), когда он будет проталкиваться через PubNub.

Надеюсь это поможет!

Новые вопросы

Согласно эту ссылку, один канал Pubnub может содержать не более 100 сообщений. Означает ли это, что если на один канал приходит сразу 200 сообщений, первые 100 доставляются, а остальные находятся в очереди? Как насчет того, чтобы сразу 10 000 сообщений приходили на один канал? Все ли оставшиеся сообщения остаются в очереди? если да, то как он доставляется подписчику в реальном времени?

Ограничение в 100 сообщений относится к PubNub.history. Если кто-то подписан и приходит 200 сообщений, они получат все 200 сообщений.

(Теперь только пользователь A должен получать уведомления на своем частном канале о новом личном сообщении, как пользователь B или Система может узнать имя канала UserAx732dsw3efsdfsdfsdf, потому что это частный канал, динамически генерируемый пользователем A, ни Система, ни пользователь B не получили доступа к То же самое происходит и с пользователем B. Если пользователь B должен быть уведомлен каким-либо другим лицом или системой снова, должен быть способ узнать имя динамического канала пользователя B.

На этот вопрос не существует универсального решения, но я бы сделал так, чтобы сервер генерировал этот уникальный идентификатор при загрузке страницы и отображал его клиенту по вашему первоначальному HTTP-запросу.

Другая проблема заключается в том, что этот сценарий заключается в том, что если пользователь динамически генерирует имя канала каждый раз, когда он / она входит в систему на веб-сайте. Что будет со всеми сообщениями, отправленными в динамический канал? Сохраняет ли pubnub все созданные имена каналов на своем сервере?

Вам не нужно динамически генерировать каждый раз. Вы могли бы ... но вы также устанавливаете cookie с этим уникальным идентификатором или извлекаете его из базы данных и передаете его клиенту при загрузке страницы (что я бы сделал). Мы не сохраняем названия каналов.

Есть ли способ, которым система или пользователь могут узнать, принадлежит ли имя канала и по крайней мере один пользователь его слушает?

Не из коробки, но это можно легко реализовать. Просто дайте серверу посылать пинг и настройте клиентов так, чтобы они всегда отвечали на пинги, если они их слушают.

Теперь UserA выходит с веб-сайта в 1:30, что произойдет со многими другими пользователями, которые все еще отправляют уведомление на его dynamicChannelA, потому что к следующему разу, когда UserA войдет на веб-сайт, UserA будет прослушивать разные динамические имя канала. Пользователь A не будет слушать свой предыдущий канал dynamicChannelA.

Вы можете предотвратить это с помощью периодических (каждые 30 секунд?) Эхо-запросов с сервера, который может отслеживать, есть ли пользователи. Кстати, в ближайшие месяцы мы запустим API присутствия, чтобы сделать это автоматически.

Я думаю использовать метод получения имени канала конкретного пользователя из таблицы базы данных. Есть ли способ или способ предотвратить несанкционированную подписку на канал? Потому что любой может подписаться на имя канала, если у него есть ключ подписки и имя канала, независимо от длины имени канала. Мне просто любопытно, потому что вся подписка происходит на стороне клиента, а ключ подписки и названия каналов видны.

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

person Phil Deschaine    schedule 04.06.2012
comment
Здравствуйте, @Phil Deschaine, большое спасибо за ваши ценные сведения о шаблоне проектирования, описанном выше. Итак, вы имели в виду, что мой серверный код может подписываться на каналы и отвечать на входящие сообщения, обрабатывать и публиковать сообщения для тех, для кого они предназначены? Должен ли я запускать специальный PHP-скрипт, который подписывается на Global-user-send-channel в фоновом режиме, правильно ли это? Как вы думаете, он будет съедать много памяти и ресурсов сервера? Также не могли бы вы проверить мои вопросы выше, я добавил больше вопросов после прочтения ваших ответов. Большое спасибо за ваш ответ. - person RT Roger; 06.06.2012
comment
@RTRoger Примите ответ, если он вам помог. - person Matt Harrison; 22.01.2014