Трансляция данных между экземплярами распределенного сервера

Я пытаюсь получить отзывы о рекомендациях для службы «список» в моем конкретном приложении. У меня есть серверное приложение, которое поддерживает постоянные соединения сокетов с клиентами. Я хочу доработать сервер для поддержки распределенных экземпляров. Сервер «А» должен иметь возможность передавать данные другим экземплярам онлайн-сервера. То же самое касается всех других активных экземпляров.

Варианты, которые я пытаюсь исследовать:

  1. Redis / Zookeeper / Doozer - Each server instance would register itself to the configuration server, and all connected servers would receive configuration updates as it changes. What then?
    1. Maintain end-to-end connections with each server instance and iterate over the list with each outgoing data?
    2. Некоторая пользовательская многоадресная рассылка UDP, но мне нужно было бы добавить мою собственную дополнительную надежность поверх нее.
  2. Пользовательский брокер сообщений — служба, которая запускает и поддерживает реестр, когда каждый сервер подключается и информирует его. Поддерживает соединение с каждым сервером, чтобы принимать данные и ретранслировать их на другие серверы.
  3. Некоторый надежный многоадресный транспорт UDP, где каждый экземпляр сервера просто транслирует напрямую, и список не поддерживается.

Вот мои опасения:

  • Я бы хотел не полагаться на внешние приложения, такие как zookeeper или doozer, но я бы использовал их, очевидно, если это лучшее решение.
  • Я бы не хотел, чтобы пользовательский брокер сообщений стал узким местом в пропускной способности. Что означало бы, что мне, возможно, придется иметь возможность запускать несколько брокеров сообщений и использовать балансировщик нагрузки при масштабировании?
  • многоадресная рассылка не требует никаких внешних процессов, если мне удастся запустить свой собственный, но в противном случае мне, возможно, придется использовать ZMQ, что снова ставит меня в ситуацию зависимости.

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

* ИЗМЕНИТЬ цель *

На самом деле я спрашиваю, как лучше всего реализовать широковещательную передачу данных между экземплярами распределенного сервера, учитывая следующее:

  1. Каждый экземпляр сервера поддерживает постоянные соединения TCP-сокетов со своими удаленными клиентами и передает сообщения между ними.
  2. Сообщения должны иметь возможность широковещательно передаваться другим работающим экземплярам, ​​чтобы их можно было доставить по соответствующим клиентским соединениям.
  3. Низкая задержка важна, поскольку обмен сообщениями может осуществляться с высокой скоростью.
  4. Важна последовательность и надежность.

* Обновленная сводка вопросов *

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


person jdi    schedule 20.09.2011    source источник
comment
Хотел бы упомянуть, что Redis в любом случае неизбежно может стать частью системы в качестве постоянного хранилища для истории данных. Поэтому я предполагаю, что это может быть очевидный путь для регистрации сервисов и уведомления через функцию pub/sub.   -  person jdi    schedule 20.09.2011
comment
каковы ваши требования к задержке?   -  person lunixbochs    schedule 20.09.2011
comment
Это высокоскоростной сервер сообщений, поэтому задержка должна быть низкой. Сообщения приходят и передаются подписчикам канала, но в конечном итоге с постоянным сервером сокетов я достигну как ограничений файлового дескриптора, так и, в конечном итоге, ограничений диапазона клиентских портов. Поэтому мне пришлось бы запускать несколько экземпляров и по-прежнему разрешать сообщениям переходить в очереди в других экземплярах для распространения среди всех, кто может быть подписан на один и тот же канал в этих экземплярах.   -  person jdi    schedule 20.09.2011
comment
Я вижу, что этот вопрос действительно движется к решению передачи сообщений с малой задержкой, а не к обнаружению службы. Часть обнаружения гораздо более последовательна, так как службы не будут появляться и исчезать все время. Вы бы начали, скажем, 4 экземпляра. Может быть, один из них дает сбой и его нужно перезапустить. Возможно, вам придется начать еще один в какой-то момент, чтобы масштабироваться.   -  person jdi    schedule 20.09.2011
comment
Какое ограничение файлового дескриптора вы имеете в виду? В Linux вы сначала ограничены ulimit (который можно удалить). Go использует epoll на серверной части, поэтому он не наследует ограничение select в 1024 fd. Если вы используете 30 000 пар сокетов для достижения лимита портов, вы можете рассмотреть возможность разделения его на несколько IP-адресов. (У вас действительно 30 000 отдельных клиентов?)   -  person lunixbochs    schedule 20.09.2011
comment
Похоже, вы пытаетесь задать довольно специфический вопрос об архитектуре — возможно, перефразируйте или уточните свою точную конечную цель, чтобы мы могли лучше ответить?   -  person lunixbochs    schedule 20.09.2011
comment
Хотя Go может использовать epoll для выбора каналов, горутин и многого другого, я считаю, что проблема все еще не связана с Go. Клиенты подключаются через постоянные соединения сокетов TCP, которые по-прежнему используют дескрипторы файлов, если я прав. А также потреблять порты. Если бы существовал веб-сайт, скажем, такой как YouTube, на котором одновременно могут легко находиться сотни тысяч человек, и я хотел бы разрешить им всем поддерживать соединение с сервером, мне нужно было бы иметь возможность масштабировать экземпляры и по-прежнему иметь возможность перекрестного вещания между ними.   -  person jdi    schedule 20.09.2011
comment
давайте продолжим это обсуждение в чате   -  person lunixbochs    schedule 20.09.2011


Ответы (1)


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

Группы многоадресной рассылки

  • Центральная база данных (скажем, Redis) может отслеживать карту групп многоадресной рассылки (IP:PORT) ‹--> каналов.
  • Когда конечная точка получает нового клиента с новым каналом для подписки, она может запросить у базы данных многоадресный адрес канала и присоединиться к группе многоадресной рассылки.

Надежная многоадресная рассылка UDP

  • Когда конечная точка получает опубликованное сообщение для канала, она отправляет сообщение в многоадресный сокет этого канала.
  • Пакеты сообщений будут содержать упорядоченные идентификаторы для каждого сервера в каждой группе многоадресной рассылки. Если конечная точка получает сообщение, не получив предыдущее сообщение с сервера, она отправит сообщение «не подтверждено» для всех сообщений, которые она пропустила, обратно на сервер публикации.
  • Сервер публикации отслеживает список последних сообщений и повторно отправляет сообщения с NAK.
  • Чтобы справиться с пограничным случаем, когда сервер отправляет только одно сообщение и не может достичь сервера, сервер может отправить количество пакетов в группу многоадресной рассылки за время существования своей очереди NAK: «Я отправил 24 сообщения», давая другие серверы шанс NAK предыдущие сообщения.

Возможно, вы захотите просто реализовать PGM.

Постоянное хранилище

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

person lunixbochs    schedule 20.09.2011