Показать сообщение отдельно
Старый 20.10.2015, 15:19   #15
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
Ответ: Чат: PHP + MySQLi или что то другое?

Принцип понял, наверно.

Сейчас, распишу что понял и задам вопросы, если не затруднит - ответьте и поправьте ошибки в логике.
Базу буду использовать примерно как использовал бы MySQL (без избыточной информации, с ссылками по id).
Для переписки достаточно будет 2 коллекции - users и chats.
Коллекция Users - содержит инфу для авторизации и вообще инфу о пользователях.
Коллекция Chats - содержит сами чаты, в которых имеются подколлекции users (id состоящих в них пользователей) и messages (собственно сообщения со всеми нужными данными).
Можно сделать ещё третью коллекцию - Attachments (передача файлов тоже планируется, каждый аттач будет связан со своим сообщением).

Имеем (допустим идеальный случай) 3 зареганых пользователя - A, B, C). Каждый пользователь сидит ТОЛЬКО С ОДНОГО устройства и никак иначе (идеальные условия).
Пользователь C находится офлайн.
Пользователь A создаёт беседу "Room1" и приглашает в неё пользователей B и C.
Комната прилетает на сервер и записывается в БД. Начало общения в ней положено.

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

Далее. Пользователи приглашены в беседу, всё хорошо.
Пользователь A отсылает в беседу сообщение.
Сообщение прилетает на сервер, записывается в базу к беседе (для истории). Попутно оно отсылается через коннект пользователю B.
Пользователи A и B общаются между собой, пользователь C всё ещё офлайн.
Через какое то время пользователь C таки появляется онлайн и входит в данную беседу.

Вопрос 3 и 4. Как пользователю получить историю сообщений? Когда у него нет истории всё просто - скачиваем что есть (грубо всё, или лимитировано по 10-20 сообщений со смещениями). А что делать если пользователь вошёл в диалог, какое то время там был, а потом стал оффлайн? То есть, что ему отдавать когда он снова станет онлайн? Всю историю беседы точно отдавать ненадо (она ведь уже есть), но существуют некоторые пробелы, которые надо заполнить. Можно конечно забить болт на это дело и пойти по принципу "пропустил - твои проблемы", но не хотелось бы, ведь во всяких вконтактах и вайберах же нету такого "болтозабивательства", вайбер так вообще очень слаженно скачивает историю. То есть, если общался на мобилке, то на компе всегда появляется достоверная без пробелов история, если запустить приложение после переписки на мобилке (и наоборот соответственно тоже работает), проверял специально.

И вопрос 5. Вычитал что у MongoDB ограничение на коллекцию 16 мегабайт. Что делать когда коллекция chats достигнет этого предела (16 мегабайт не так то и много)? Надо как то будет распределять данные в другие коллекции?
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием