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

18

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

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

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

Logged in users listens to Channel1-Public
Logged in users listens to private UsersOwnDynamic-Channel to receive notifications related and only meant for him.

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

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

B. Я использую PHP и MySQL, поэтому я до сих пор не могу придумать способ или найти решение для отправки сообщения в частные каналы другого пользователя.
Давайте рассмотрим пример простой системы запросов на добавление в друзья.
- UserA отправляет запрос на добавление в друзья UserB.
- Пользователь B слушает свое собственное динамическое имя частного канала, называемое 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 доставляются, а оставшиеся находятся в очереди? Как насчет того, чтобы 10000 сообщений приходили одновременно на один канал? Все ли оставшиеся сообщения остаются в очереди? если да, то как он доставляется подписчику в режиме реального времени?

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

UserA is authenticated and logged in to the website.
UserA generates his own Dynamic channel name, UserAx732dsw3efsdfsdfsdf
UserA starts listening to his newly created channel UserAx732dsw3efsdfsdfsdf
(Now, userA should start receiving messages from others)


- UserB sends a private message to userA.
(Now, only userA should get notified on his private channel about the new private message, how can userB or the System find out the channel name UserAx732dsw3efsdfsdfsdf because, this is a private channel generated dynamically by userA , neither the System or userB has accessed to it. This same thing is happening for userB as well, if userB should be notified by any other entity or by the system again, there should be a way to find out the dynamic channel name of userB .

Another issue is this scenario is that, if a user is dynamically generating channel name everytime he/she logged in to the website. What will happen to all the messages that was sent to the dynamic channel ? Do pubnub saves all the created channel names on their server? Is there any way that a system or a user can find out whether a channel name is still being own and atleast one user is listening to the channel ?.

I'm curious to know this because of the following concepts that I have:

UserA creates dynamicChannelA when he/she logged in to the website at 1AM.
UserA starts getting lots of notification pushout to his dynamic channel dynamicChannelA
Now, UserA logs out from the website at 1:30 AM, what will happen to the many other users who are still pushing out notification to his dynamicChannelA because by the next time when UserA logs into the website, UserA will be listening to different dynamic channel name.UserA won't be listening to his previous channel dynamicChannelA .


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

Огромное спасибо, что сообщили мне, я буду ждать обратной связи. RT Roger
Проверьте этот ответ, если это полезноstackoverflow.com/questions/42666799/… maytham-ɯɐɥʇʎɐɯ
Привет РТ Роджер. Спасибо за вопросы! Это действительно подробный список. Мы предоставим отзыв на этой неделе. Stephen Blum
@RTRoger У меня такие же сомнения Anand Raj

Ваш Ответ

1   ответ
30

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

Pubnub says its not a good thing to create more than two channels per client. So, in my application, i have a requirement to create more than two channels to listen to notifications happening everywhere on my website but i will go with two channels for every logged in users as Pubnub suggested.

Logged in users listens to Channel1-Public Logged in users listens to private UsersOwnDynamic-Channel to receive notifications related and only meant for him.

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

A.

Do i always have to create a new private Dynamic channel name everytime i logged into the website.

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

If so, how would other users know how to send a notification to my private Channel.

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

Or, do i just need to have only one static channel name stored in database table, so that other authenticated users will query the table and get my private channel name to sent me notifications.

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

If this is the case, don't you think if a hacker get hold of some private channel name of certain users, they will be able to listen to that channel?

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

B.

Im using PHP and mysql, so i still cannot think out a way or come up with a solution to send message to private channels of another user. Lets take an example for a simple friend request system. - UserA sends a friend request to UserB. - UserB is listening to his own dynamic private channel name called DynamicPrivateChannelB (how will UserA find the channel name for UserB which is private? Im thinking the only way for this is that the private channel of UserB should be stored in a database table for every loggedin users to query. Am i thinking the right way ? )

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

Server side Listens on Global-user-send-channel for user messages. The server is the only entity that has this subscribe key Can query db to get user-ids, and then send to the various ids at will Can also send on the Global-user-receive-channel, which all clients are listening on. The server is the only entity that has this publish key. Client side Listens on Global-user-receive-channel. This is how it gets mass server broadcasts. Cannot send on this channel (only has subscribe key) Sends server messages on Global-user-send-channel. Cannot recieve on this channel (only has publish key) Listens on private user channel. This is how user gets private messages. It can also use this for client-to-client communication. Prevent abuse by appending all private messages with a private, per-user key stored on the server, and provided during the initial page-load. That way, a client knows if a message claiming to be from the server is legit. C.

If we are always generating dynamic private channel names, storing in database table, updating whenever new dynamic channel names are generated. I think it will cause a problem because some message won't get delivered as new dynamic private channel names replaces old ones.

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

D.

So, i have many notifications to sent to a single channel like New Friends request, New Private message replies, New gifts requests and many others like that. How do i sent all these data to a channel and how to find out and parse the incoming new notifications data. I know JSON is the format to send but im not sure about the format of sending.

JSON хорош для отправки и получения. Я делаю так, чтобы у меня было свойство с именем & quot; имя & quot; который определяет тип сообщения. Например:

{
    "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.

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

New Questions

According to this link, a single Pubnub channel can contain only upto 100 messages. Does it mean that if 200 messages comes at once to a single channel the first 100 gets delivered and the remaining is on queue ? How about if 10,000 messages comes at once to a single channel ? Do all the remaining messages stays in queue ? if so, how does it gets delivered to the subscriber in realtime ?

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

(Now, only userA should get notified on his private channel about the new private message, how can userB or the System find out the channel name UserAx732dsw3efsdfsdfsdf because, this is a private channel generated dynamically by userA , neither the System or userB has accessed to it. This same thing is happening for userB as well, if userB should be notified by any other entity or by the system again, there should be a way to find out the dynamic channel name of userB .

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

Another issue is this scenario is that, if a user is dynamically generating channel name everytime he/she logged in to the website. What will happen to all the messages that was sent to the dynamic channel ? Do pubnub saves all the created channel names on their server?

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

Is there any way that a system or a user can find out whether a channel name is still being own and atleast one user is listening to the channel ?.

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

Now, UserA logs out from the website at 1:30 AM, what will happen to the many other users who are still pushing out notification to his dynamicChannelA because by the next time when UserA logs into the website, UserA will be listening to different dynamic channel name.UserA won't be listening to his previous channel dynamicChannelA .

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

Im thinking to use the method of retrieving channel name of a particular user from the database table. Is there any method or way to prevent unauthorised subscription of the channel? Because anybody can subscribe to the channel name if they have the subscribe key and channel name no matter how long the channel name is. Im just curious because all subscription is happening in the client side and the subscription key and channel names are visible

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded RT Roger

Похожие вопросы