Советы по разработке схемы обмена мгновенными сообщениями - PullRequest
0 голосов
/ 30 сентября 2019

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

  • В чатах может участвовать более 2 участников (групповые чаты)
  • Если участникЕсли удалить сообщение, оно все равно должно быть видно участнику B (поэтому я использовал таблицу «Участники сообщения»)
  • То же самое относится к разговору.
  • По той же логике, если все участники удаляют беседу/ сообщение, оно должно быть удалено из БД.

l

Вопросы:

  1. I 'я боюсь, что эта схема слишком громоздка, что означает, что запросы будут слишком медленными, когда приложение получит определенную отметку трафика (1 тыс. активных пользователей? Я предполагаю)

  2. Сообщение Участники получатнесколько записей для каждого сообщения - по одной для каждого участника чата. Мгновенный обмен сообщениями означает, что он будет включать в себя те записи с очень сжатым временем. Разве это не проблема?

  3. Должен ли я добавить слой Redis DB, чтобы управлять сообщениями активного сеанса чата? он будет хранить последние сообщения и активно синхронизировать базу данных PostgreSQL с этими сообщениями (возможно, с функциональностью асинхронных транзакций, которая есть в postgresql?)

ОБНОВЛЕНО схема:

enter image description here

  • Я бы также с удовольствием выслушал идеи о том, чтобы иметь статус «прочитан». Я предполагаю, что это намного сложнее с групповыми чатами, поэтому, по крайней мере, было бы неплохо предлагать их для чатов 1: 1.

1 Ответ

0 голосов
/ 01 октября 2019

Меня немного смущает ваша диаграмма. Разве участники беседы не должны быть связаны с беседами вместо сообщения? ФК выглядят хорошо, просто линии выглядят неправильно.

Я бы пока не беспокоился о производительности. Анти-шаблон преждевременной оптимизации предупреждает нас не отказываться от чистого дизайна по соображениям производительности, пока мы не узнаем, не возникнет ли у нас проблема с производительностью. Вы ожидаете 1000 пользователей - это не так много для современной информационной системы. Даже если они все активны в одно и то же время и вводят сообщение каждые 10 секунд, это будет означать 100 транзакций в секунду, чего не стоит бояться. Конечно, я не знаю платформу, на которой вы собираетесь это запустить. Но это должно быть простой задачей - настроить эти таблицы и написать простую тестовую программу, которая вставит эти записи как можно быстрее.

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

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

Относительно ваших дополнительныхкомментарии:

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

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

Отметить сообщение как прочитанноеэто просто: введите логический атрибут read в Message Участники и установите его в значение true, как только пользователь прочитает сообщение. Это зависит от ваших бизнес-требований, в каких случаях и кому вы это показываете.

...