Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Как работает ВК? (https://javascript.ru/forum/offtopic/29035-kak-rabotaet-vk.html)

9xakep 12.06.2012 13:10

Как работает ВК?
 
У них очень интресная система чата. Я сам пытаюсь сделать что-то подобное, но пока мой алгоритм сыроват (готовый вариант - скрин в подписи)


Мой алгоритм:

0) При заходе отправляем запрос и берем, и берем последнее сообщение в БД
1) При отправке сообщения, я добавляю его в БД
2) У других юзверей каждые 10 секунд отпрвляется ajax запрос, который проверяет, если id последнего сообщение > id в пункте 0, то добавить все сообщения в массив
3) после я этот массив с помощью json привожу к номарльному виду, и отправляю в js, где ответ eval'иться, и получается обычный массив вида:

[
{
    autor:'9xakep',
    message: 'Привет'
},
{
    autor:'9xakep',
    message:'Как дела?'
}
]


4) Добавляю всю инфу в окно чата(опять же смотреть скрин в подписи)

Естественно, что вся эта система работает хорошо, если я это тестю на локалке, да и еще с самим собой, а представьте что будет если например 1000 юзеров, будут каждые 10 секунд теребить БД. Хотя...с 1000 еще может и ничего не будет, но система не оптимальна на мой счет. Тем более, в вк, например, сообщения отправляются мгновенно, а у меня нажно ждать от 1-10 секунд (как повезет)

VK:
Мне не понятно, как работает же вк:

Небольшая предыстория:
У вк есть 2 основных запроса, один идет с интервалом в 25, и начинается сразу же как закончиться(назовем его запрос проверки, http://s019.radikal.ru/i643/1206/cd/7201103a7161.png), а второй говорит, что ты в онлайн (http://s019.radikal.ru/i607/1206/23/31cb51d4d33c.png)



Например, я начинаю печатать:

1)

На странице собеседника сразу появляется запрос-проверка, который "говорит", что я печатаю



2) Когда я отправляю сообщение, там опять "заставляют" совершить запрос-проверку, и после него соответственно выводятся новые сообщения..



И образуется такой дебильный вопрос: "как заставить удаленную страницу сделать запрос?"

B@rmaley.e><e 12.06.2012 13:22

Ничего не понял, но для чатов в самый раз http://en.wikipedia.org/wiki/Server-sent_events

9xakep 12.06.2012 13:51

B@rmaley.e><e,
Похоже это то что мне надо, спасибо.
P.S. B@rmaley.e><e, ты в вики случайно не работаешь?) Сколько ты помогаешь, всегда ссылки на википедию даешь)
P.P.S. если у кого еще мысли есть выкладывайте)

Deff 12.06.2012 15:16

9xakep,
Чаты мон делать чисто скриптом - фреймом и перезаписью сообщений в теме

9xakep 12.06.2012 16:50

Deff,
Но перезапись-то будет происходить с определенным интервалом, я прав? А мне именно надо без интревала.

Deff 12.06.2012 17:22

9xakep,
Интервал равен скорости буквопечати плюс нажатия на клик или энтер, вот по клику и отправка

Пока ти не отправил сообщение о какой перезаписи мон говорить ?
Рефрешь страницы стандартно для чата - раз в 3-5 секунд , если юзер Активен в Окне, И раз в 10 - если пассивен(курсор вне чата

9xakep 12.06.2012 21:37

Deff,
то есть я правильно понимаю, что при обновлении iframe у меня, его можно будет обновить у другого юзера?
Цитата:

Сообщение от Deff
Рефрешь страницы стандартно для чата - раз в 3-5 секунд , если юзер Активен в Окне, И раз в 10 - если пассивен(курсор вне чата

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

dmitriymar 12.06.2012 22:52

Цитата:

Сообщение от 9xakep
И образуется такой дебильный вопрос: "как заставить удаленную страницу сделать запрос?"

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

Джэксон 13.06.2012 10:40

Уважаемый юзер. Сайт ВК существует уже около 10-ти лет и всё время обновляется. Они если вы помните тоже начинали с обновления страницы, нужно было всё время тыкать F5, чтобы увидеть сообщение. Просто у них целый офис веб-программистов и они всё время обновляют сайт. Мой вам совет: Начните с малого, а потом совершенствуйте своё творение до того, что вам нужно.

Gozar 13.06.2012 15:35

Цитата:

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

Неужели целый офис сидит и обновляет страницы? :)

9xakep 13.06.2012 15:38

Джэксон,
сделать сообщения с F5 - проще простого, и у меня получилось сделать эти сообщения и без F5 (они сами приходили без обновления), но (читать 1ый пост) система оочень не оптимизированна.
Цитата:

Сообщение от Джэксон
Сайт ВК существует уже около 10-ти лет и всё время обновляется.

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

Сообщение от Джэксон
Начните с малого, а потом совершенствуйте своё творение до того, что вам нужно.

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

Сообщение от dmitriymar
в фаирбаге посмотри внимательно на запросы контакта:
твой ид,ид кому идёт и информация

ты не представляешь сколько я в него уже просмотрел)

dmitriymar 13.06.2012 15:54

Цитата:

Сообщение от 9xakep
ты не представляешь сколько я в него уже просмотрел)

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

альтернатива применяемая ими сокетам это длинные запросы
схема такая:
запрос передаётся в node.js
определяются связанные пользователи с этими данными(исходя из полученных данных в запросе)
через сокты отдаётся информация связанным с этой информацией пользователям
на клиенте обрабатывается ответ полученный через сокет и производятся действия со страницей

9xakep 13.06.2012 17:45

dmitriymar,
то бишь, я могу на странице вот так сделать (P.S. моя страница: chat.com?with=2, собеседник: chat.com?with=1)
$message = " Hello World!!! "
$with = $_GET['with'];
$my_id = 1;
 При отправке сообщения, с помощью сокетов отправляю post запрос на страницу вида: "from=".$my_id."&to=".$with."&message=".$message;
При этом, так как все это на одной странице:
if ($_POST['with'] == $my_id && $_POST['to'] == $with) {
echo $message;
}

Ну это в общем? Я тебя правильно понял?
=====
node js я немного изучил, но мне кажется это слишком муторно?

dmitriymar 13.06.2012 18:03

http://i-novice.net/sokety-v-php/
с нодой будет всё проще намного. Изза того что в рнр всякий раз новый экземпляр создаётся приложения а в ноде колво операций сократиться в разы ну и базы нужно будет дёргать для постоянного получения ip того кому отсылать

B@rmaley.e><e 15.06.2012 17:53

Цитата:

Сообщение от 9xakep
P.S. B@rmaley.e><e, ты в вики случайно не работаешь?) Сколько ты помогаешь, всегда ссылки на википедию даешь)

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

tadjik1 16.06.2012 14:08

http://habrahabr.ru/post/127525/
UPD
https://github.com/LearnBoost/socket.../examples/chat

а в nginx роутишь чаты на ноду. это вообще 5 минут делов, на самом деле)
нода создана для чата =)

9xakep 19.06.2012 23:55

dmitriymar,
tadjik1,
B@rmaley.e><e,
Всем спасибо. Буду учить сокеты.


Часовой пояс GMT +3, время: 20:46.