Лучшие практики для кодирования многопоточной системы обмена сообщениями с несколькими получателями? - PullRequest
2 голосов
/ 20 апреля 2011

Я рвал на себе волосы, пытаясь понять, как кодировать систему обмена сообщениями, способную к следующему:

  1. Несколько получателей, где получатели не могут видеть других получателей, но толькоотправитель.В отправленных сообщениях отправитель видит сообщения, отправленные нескольким получателям в одном потоке, а не в миллиарде отдельных потоков.
  2. Относительно легкие запросы (у нас относительно 20 000 пользователей - около 10% из которых регулярно отправляют сообщения200-300 человек одновременно).

Наша нынешняя система невероятно неэффективна, и запросы убивают наши серверы из-за чрезмерного количества соединений.Я ищу концептуальные советы по созданию масштабируемой системы потокового обмена сообщениями в PHP и MySQL - какая структура базы данных лучше, как хранить получателей, лучшие методы для запросов.Кто-нибудь может помочь ?!

Спасибо!

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

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

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

1 голос
/ 20 апреля 2011

Похоже, что местом для начала будут просто три таблицы, таблица получателей, таблица сообщений и таблица сопоставления «многие ко многим».Примерно так:

получатель

  • receient_id
  • имя
  • электронная почта

сообщение

  • message_id
  • message_text

message_recipient

  • message_id
  • receient_id

Будьте уверенысоздать индекс в обоих полях таблицы message_recipient, а затем он станет центром всех запросов к сообщениям.

Вы пробовали что-нибудь подобное?Это самый простой и простой.Если это не сработает, возможно, оно настроено.

...