2014-02-06 2 views
0

Мне нужен совет/понимание, как наилучшим образом реализовать определенные функции. Идея моей задачи - панель мониторинга системы в реальном времени.Play framework: сервис для обслуживания непрерывной связи

Допустим, у меня есть следующие настройки, основываясь на двух физических серверах:

Сервер1 работает Play приложение, которое отслеживает определенные файлы, услуги и т.д. для изменения. Как только происходит изменение, он предупреждает о другом приложении Play, запущенном на сервере Server2.

Сервер 2 запускает приложение Play, которое обслуживает веб-интерфейс, отображающий данные живой панели, отправляемые на него из приложения Play, сидящего на Server1.

Я знаком с платформой Play таким образом, что он обслуживает данные для http-запросов, но способ, которым он нужен для работы в этой конкретной ситуации, немного отличается.

Мой вопрос заключается в том, как сохранить эти два приложения Play в постоянном соединении так, как я описал выше? Требование состоит в том, что приложение Server1 будет толкать данные в приложение Server2 на основе потребности, в отличие от приложения Server2, работающего в бесконечном цикле, и запрашивать приложение Server1, если есть какие-либо новые данные каждые 5 секунд.

Я использую Play Framework 2.2.1 с Scala.

+0

Можете ли вы рассказать мне, почему они являются двумя отдельными приложениями для воспроизведения? –

+0

@VenkatSudheerReddyAedama Потому что может быть несколько Server1s (производственный сервер) и только один Server2 (сервер мониторинга). Я тоже не могу использовать JSONP, он слишком ограничен для моих нужд. – Caballero

ответ

2

Фактически Akka, представленный в Play 2.0, отлично соответствует вашим требованиям (как Venkat указал).

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

Scanerio может быть именно:

  • S1 давайте называть это Доктор использует планировщик AKKA для мониторинга ресурсов каждой несколько секунд
  • если доктор обнаруживает изменения посылает Akka сообщение для актера S2 (в FRONTEND) в противном случае ничего не делает.
  • Упомянутый актер FrontEnd может добавить событие в queue или нажать его прямо, т.е. на какой-то WebSocket, который вытолкнет его в браузер. Другой вариант устанавливает другой планировщик на FrontEnd, который проверит, queue содержит новые события.

Проверьте включены примеры приложений, как вы можете сообщить свои FRONTEND с браузером (то есть. commet-live-monitoring или eventsource-clock).

для связи между Доктор и FRONTEND приложений, akka-remote перспективно особенность.

+0

Спасибо, я понимаю, что то, что я хочу сделать, возможно, я просто не знаю, как это сделать. Некоторые подробности, объяснение, псевдо-пример - это все, что мне нужно. – Caballero

+0

Извините, не могу дать вам пример кода (сначала нужно проверить подход к тестированию), но в редактировании вы найдете несколько советов, наилучшим образом используйте его;) Также проверьте ответ Venkat, так как он описывает хороший подход. – biesior

1

Я думаю, что Server-Sent Events (SSE: http://dev.w3.org/html5/eventsource/) - это то, что вы ищете. Поскольку предполагается, что это только однонаправленный push (server1 толкает данные на сервер2), SSE, вероятно, является лучшим выбором по сравнению с WebSockets, которые являются полнодуплексными двунаправленными соединениями. Так как ваш Server2 имеет веб-интерфейс, браузер может автоматически подключаться к Server1, если вы используете SSE. Большинство современных браузеров поддерживают SSE (IE не работает).

Поскольку вы используете Play Framework: вы можете использовать Play WS API для связи Service to Service, а также можете использовать мощные абстракции для обработки данных асинхронно, например Enumerator и Iteratee. Как играть! легко интегрируется с Akka, вы можете управлять/контролировать HTTP-соединение с помощью Актеров.

Edit:

Ответ «Как именно один сервис может передавать данные на другой на основании необходимости» ступенчато:

  1. Manage соединение HTTP: Сервер1 должен иметь клиент WebService управлять HTTP-соединение с сервером2. Под «управлением HTTP-соединением» я имею в виду: повторно подключить/перезагрузить/отключить HTTP-соединение. Акка Актеры - отличная возможность для решения этой проблемы. В основном, этот актер получает сообщения, такие как CONNECT, CHECK_CONN_STATUS, DISCONNECT, RESET и т. Д. У вас есть планировщик для вашего актера HttpSupervisor, чтобы проверить состояние соединения, чтобы вы могли подключиться, если соединение мертво.

    вал Система = ActorSystem ("Монитор")

    вал supervisorRef = system.actorOf (Подпорки (новый HttpSupervisor (system.eventStream)), "MonitorSupervisor")

    system.scheduler.schedule (60 секунд, 60 секунд, supervisorRef, CHECK_CONN_STATUS)

  2. Прослушать изменения и PUSH по необходимости: Создать перечислитель, который производит изменения.Создайте Iteratee для асинхронного использования изменений. Опять же, некоторый код, который может быть полезен:

    вал monitorIteratee = play.api.libs.iteratee.Iteratee.foreach [Array [Byte]] (WS.url (postActionURLOnServer2) .post (новая строка (_, «UTF-8»)))

Прикрепите итератор к перечислителю.

+0

Я знал многое из того, что вы указали, но это не отвечает на мой вопрос. Как именно я делаю одну услугу для перевода данных в другую на основе потребностей? – Caballero

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