Абоненты 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, который позволяет настроить топологию для распределенной обработки, добавив некоторую декларативную абстракцию вместо утомительной ручной разработки и предоставляя эквивалентную сервисную архитектуру.