Я реализовал парадигму производителя/потребителя с брокером сообщений в Spring, и мои производители используют WebSocket для извлечения и публикации данных в очереди.
Таким образом, производитель выглядит примерно так: AcmeProducer.java handler/AcmeWebSocketHandler.java.
и с обработчиком было трудно иметь дело.
Во-первых, в обработчике есть два события: onOpen() onMessage().
onOpen должен отправить сообщение в веб-сокет, чтобы подписаться на определенные каналы. onMessage получает сообщения из веб-сокета и добавляет их в очередь.
onMessage имеет некоторые зависимости от AcmeProducer.java, например, ему нужно знать валютные пары для подписки, ему нужна служба брокера сообщений, а также ObjectMapper (десериализатор json) и служба эталонного тестирования.
Когда сообщения потребляются из очереди, они преобразуются в формат OrderBook.java. Каждый производитель имеет свой собственный формат OrderBook и, следовательно, свой собственный AcmeOrderBook.java.
Я чувствую, что потоку сложно следовать, даже несмотря на то, что я поместил классы для одного производителя в один и тот же пакет. Каждый раз, когда я хочу что-то исправить в продюсере, мне приходится переключаться между классами и искать, где это находится.
Существуют ли какие-либо методы для преобразования сложного потока данных в нечто легкое для понимания?
Как вы знаете, обработчики событий, такие как AcmeHandler.java, содержат обратные вызовы, которые вызываются из другого места в системе (из реализации веб-сокета), и поэтому их может быть сложно организовать. Поток данных с событиями также более запутан, потому что, когда обработчики находятся в отдельных файлах, они не могут использовать переменные, определенные в основном файле.
Если бы этот код не использовал парадигму, управляемую событиями, за потоком данных было бы легко следить.
Наконец, есть ли наилучшая практика структурирования кода при использовании веб-сокетов с onOpen и onMessage? Producer/Consumer — это лучшее, что я смог придумать, но я не хочу разбрасывать классы Acme по разным пакетам. Например, AcmeOrderbook должен быть в потребительском классе, но поскольку он зависит от AcmeProducer.java и AcmeHandler.java, они часто редактируются одновременно, поэтому я собрал их вместе.
Поскольку зависимости внутри каждого обработчика WebSocket одинаковы (только разные реализации тех же интерфейсов), я думаю, что должна быть введена только одна вещь, и это будет некоторая переменная контекста. Это лучшая практика?