2015-04-16 8 views
0

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

Проблема

сервер имеет около 100 до 500 клиентов, подключенных в любой момент. Когда клиент подключается к серверу, сервер загружает часть своих данных и кэширует его в памяти для более быстрого доступа. Сервер будет получать от 200 до 1000 сообщений в секунду для всех клиентов. Эти сообщения относительно небольшие (около 500 байт). Любые изменения данных в кеше должны быть как можно скорее сохранены на диске. Когда клиент отключает все свои данные, они сохраняются на диск и удаляются из кеша. каждое сообщение содержит некоторую инструкцию и текстовое сообщение, которое будет сохранено как файл. Инструкции должны выполняться как можно быстрее (почти мгновенно), и все клиенты, использующие этот файл, должны получить обновление. Записывание измененного сообщения на диск может быть отложено.

Вот мое решение в диаграмме

Architecture

Мое решение состоит из веб-сервера (HTTP или сокетов) очереди сообщений и двух или более экземпляров файлового сервера и сервера команд.

  • Веб-сервер захватывает клиентские сообщения и, если есть сообщение, доступное для клиента в очереди сообщений, отталкивает его обратно клиенту.
  • Процессор инструкций захватывает инструкции из очереди и создает необходимое сообщение для обработки файловым сервером (Get/set file) и ожидает, что файл будет доступен в очереди и больше процесса для создания другого сообщения для клиента.
  • Файловый сервер предоставляет файлы только из кеша или физического файла в зависимости от типа файла.

проблемы:

  • Есть часы пик, что суммарная присоединенная клиенты могли бы пойти более 10000 сразу и общее количество сообщений, полученных от клиентов увеличится до 10 ~ 15К. Я должен быть в состоянии очистить очередь и вернуться в нормальное состояние как можно скорее (с запросами обработки явно).
  • Я должен иметь возможность добавлять дополнительные процессоры команд и файловые серверы «на лету» без необходимости закрывать другие экземпляры.
  • В случае сбоя файлового сервера он не должен терять файлы, поэтому он должен записывать файлы на диск, как только появятся какие-либо изменения, и время процесса доступно.
  • Файловая система должна быть в формате дерева б + поэтому некоторые приложения (локальные приложения отчетности) могут легко получить доступ к файлам без необходимости проходить через сервер очереди

Мое решение

Я имею в виду использование узла .js для сокета/веб-сервера. И может быть база данных NoSQL для файлового сервера и сервера очередей, таких как rabbitMQ или Node_Redis и Redis.

Вопросы:

  • есть лучший способ структурирования этой системы?
  • Каковы мои другие варианты компонентов этой системы?
  • Можно ли запускать все экземпляры на одном сервере или даже в одном приложении (в другом потоке)?

ответ

1

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

Я не знаю, какие «инструкции» должны быть выполнены, но сохранение сообщений в 1000 500 байт тривиально. Многие решения NoSQL имеют миллион + запись в секунду. Особенно, если вы позволите зафиксировать диск на отставание.

Не беспокойтесь о очереди на возврат файла. Хорошее решение NoSQL будет лучше масштабироваться. Создайте кластер Cassandra, загрузите его, пока он не справится с максимальной нагрузкой.

Это упрощает вашу архитектуру до 1 или более веб-серверов, клиентов, опрошенных этим сервером для обновления файлов, очереди для отправки «сообщений» на «сервер инструкций» (также известный как сервер приложений в условиях веб-разработчика) , и базу данных no-sql для сервера команд для записи файлов.

Это упрощает масштабирование, вы всегда можете добавить больше веб-серверов и с приличным размером кластера для своего сервера no-sql, вам также следует масштабировать его горизонтально. Единственным реальным узким местом является ваша очередь сервера команд, на которую вы всегда можете бросить больше серверов инструкций.

+0

Node.JS может корректно обрабатывать push-сообщения клиенту, это веб-узел. Клиентам не разрешается напрямую запрашивать NoSQL, сервер приложений (сервер инструкций) должен проверять запросы. +1 для кассандры. теперь у меня есть альтернатива учебе. если он может сохранить свои файлы в структуре дерева B +, это будет идеальным решением. – AaA

Смежные вопросы