Как я могу кэшировать маршал SOAP XML, сгенерированный Apache CXF для конкретного объекта Java, чтобы повысить производительность? - PullRequest
5 голосов
/ 13 июня 2009

В моем приложении у нас есть метод веб-сервиса getFoo (), который возвращает объект Foo. Метод getFoo () вызывается несколько сотен раз в секунду . Объект Foo переносится из нашего Java-объекта в ответ SOAP XML с использованием Apache CXF.

По результатам профилирования нашего приложения мы определили, что сортировка этого объекта (java-объект -> кодированный мылом xml) является единственным наибольшим потребителем циклов ЦП. , и поскольку наш объект Foo не меняется часто повторная обработка этого объекта каждый раз не нужна.

Я подумал, что это обычная оптимизация, и поинтересовался, как к ней относятся другие. Я кратко посмотрел на документы CXF, и есть перехватчик Маршалла, который я, вероятно, мог бы использовать. Я мог бы создать карту, которая могла бы сопоставить объекты Foo с версией в кодировке XML. Но затем возникает несколько других проблем, например, как вы удаляете объекты с этой карты, когда они больше не нужны и т. Д. Было бы хорошо, если бы была встроенная поддержка для какого-либо обнаружения изменений в объекте и повторного маршалинга. Ничего невозможного, но не хотел изобретать велосипед.

РЕДАКТИРОВАТЬ (16.06.09) : добились определенного прогресса, создав собственный BareOutInterceptor и изменив цепочку перехватчиков для вызова пользовательского. Пользовательский интерфейс добавляет некоторую дополнительную логику для вызова только метода «writeParts (....)», который выполняет маршалинг только один раз для данного объекта Java. Разместим решение, как только закончим. Также я переименовал вопрос.

Ответы [ 3 ]

3 голосов
/ 13 июня 2009

Хорошо, не совсем тот ответ, который вы ищете, но в любом случае: причина, по которой REST используется в веб-сервисах с высоким трафиком (например, в Google), заключается в том, что REST предназначен для кэширования, тогда как SOAP просто НЕ предназначен кэшировать.

SOAP в основном основывается (на определении HTTP) не кешируемых POST-запросов, а REST использует GET - который легко кэшируется.

Вам нужно будет проверить запрос SOAP (POST), прежде чем он перейдет к действительному веб-сервису, т. Е. С использованием прокси. «Стандартные» прокси обычно не знают синтаксиса SOAP.

IBM WebSphere Application Server, хотя может это сделать

С уважением, Olaf

0 голосов
/ 13 июня 2009

Объект Foo переносится из нашего Java-объекта в ответ SOAP XML с использованием Apache CXF.
.. самый большой потребитель процессорных циклов. и поскольку наш объект Foo меняется не очень часто, повторная обработка этого объекта каждый раз не нужна.

Нужно ли клиентскому приложению знать об изменениях в Foo мгновенно или как можно скорее?

Почему бы не кэшировать его на стороне потребителя / клиента? Дизайн, в котором вы вызываете один и тот же метод веб-службы сотни раз в секунду, вероятно, не самый лучший.

0 голосов
/ 13 июня 2009

В SOAP нет строгих требований о том, что вам нужно использовать такую ​​среду, как CXF, для обработки конечных точек SOAP сервера или клиента. Мы только что столкнулись с взаимоблокировками клиентских потоков при использовании SOAP-клиента на основе Axis 1.4 для связи с сервером на основе Axis 1.1 и исправили их, отключив Axis и выполнив запросы в рукописном коде. Нам пришлось лгать серверу Axis, сказав, что у нас все еще есть клиент Axis, но мы не чувствовали сожаления! ; -)

Точно так же вы должны быть в состоянии обойти CXF и генерировать ответы SOAP в своем собственном рукописном коде Java. Затем вы можете использовать карту для кэширования ваших маршализованных (неразобранных, сериализованных) XML-строк и устранения этой горячей точки.

Полностью согласен с Олафом в отношении REST: если вы полностью используете HTTP, то все это кеширование происходит бесплатно во всех промежуточных кешах между вашим сервером и вашими клиентами. Это, безусловно, нужно учитывать для новых услуг.

Обновление: CXF имеет понятие настраиваемых цепочек перехватчиков . Один тип исходящих перехватчиков предназначен для фазы MARSHAL, так что, похоже, вы могли бы добавить этот кеш туда без необходимости отбрасывать CXF. Возможно, эксперт CXF сможет это проверить для нас?

...