Распределенные вычисления с Java.Лучший подход? - PullRequest
3 голосов
/ 25 февраля 2012

Я занимаюсь разработкой системы, которая может быть очень просто описана ниже:

  1. Существует несколько серверов, на каждом из которых запущено одно и то же приложение Java (для масштабируемости).
  2. Существует общий сервер базы данных, с которым общается каждый сервер приложений.
  3. Миллионы клиентов, каждый из которых подключается к одному случайному серверу. У каждого клиента есть один открытый сокет с одним сервером.

Теперь скажите, клиент A подключен к серверу A и хочет отправить сообщение клиенту B.

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

Это специфическая проблема Java. Если бы был только один сервер, это можно было бы сделать с помощью межпотоковой связи. Но проблема для нескольких серверов. Кроме того, есть ли библиотеки с открытым исходным кодом, которые облегчают эту задачу?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2012

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

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

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

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

0 голосов
/ 28 мая 2013

Я полагаю, вы ищете распределенную хэш-таблицу.Вы можете использовать протокол Chord и использовать хеш IP в качестве ключа.Используя этот ключ, протокол сможет маршрутизировать на соответствующий сервер, который содержит ключ.(сервер, который поддерживает соединение с клиентом B).Вы также можете проверить существующие реализации Java DHT, такие как http://tomp2p.net/

...