Абоненты SSE - распределены по нескольким серверам?

Глядя на демонстрацию sse-chat в Clojure Pedestal Framework, которая опирается на функции SSE в Pedestal, я заметил следующий код:

(defn publish
  [request]
  (doseq [sse-context @subscribers]
    (try
      (sse/send-event sse-context "message" (-> request :form-params (get "msg")))
      (catch java.io.IOException e
        (remove-subscriber sse-context))))
  {:status 204})

В основном это сохраняет карту подписчиков (карту клиентов EventSource) и отправляет им события чата.

У меня вопрос - предположим, вы хотели масштабировать это приложение на нескольких серверах. В чем заключается закономерность, по которой это можно сделать? (надеюсь, в Clojure Pedestal - но может быть решением по всему спектру Java)

1 ответ

В настоящее время не существует бесплатного обеда / серебряной пули для многоузлового параллелизма. Большинство людей используют подход SOA (REST, очереди и т. Д.) Для распараллеливания своего приложения. Конечно, в целом вы теряете способность координировать доступ к ресурсам, и обходные пути могут быть неудачными. Я слышал хорошие новости о транзакциях XA Immutant (Jboss), которые автоматически применяются к тому, как работает их кэширование и обмен сообщениями, но лично я не использовал этот подход. Еще одним инструментом, который может оказаться полезным, является Storm, который позволяет настроить топологию для распределенной обработки, добавив некоторую декларативную абстракцию вместо утомительной ручной разработки и предоставляя эквивалентную сервисную архитектуру.

Другие вопросы по тегам