2009-04-27 3 views
2

У нас есть продукт, построенный на архитектуре Client-Server. Некоторые сведения о используемом стеке технологий.Как повысить производительность приложения «Архитектура клиент-сервер»?

  • Client - Java Swing
  • Сервер - RMI
  • Java Database - Oracle

клиенты находятся в разных частях мира, но сервер Java & базы данных Oracle расположены на та же машина в Швеции. Из-за этого существует много задержек в сети. Клиенты, расположенные в отдаленных местах, имеют ужасную производительность. Приложение используется для обработки файлов размером более 50 МБ. Для каждой операции обычно требуется более 1000 сетевых вызовов.

Основываясь на вашем опыте, как вы решаете эту проблему и улучшаете производительность?

EDIT: Для того, чтобы ответить на несколько вопросов

  1. Files содержит фактические бизнес-данные, которые должны быть обработаны и обновлены в базе данных не могут быть отправлены в части.
  2. Некоторые сетевые вызовы могут быть собраны, но для этого потребуется большой рефакторинг кода. Это очень старое приложение, написанное еще в 2001 году. И дизайн приложения таков, что сервер хранит все службы, и они становятся многоразовыми по всему коду, а бизнес-логика написана на стороне клиента. Таким образом, эта бизнес-логика вызывает сервер много раз и, следовательно, астрономическую фигуру.

-Snehal

+0

Я исследователь, поэтому я могу указать вам на _research_, как решить вашу проблему и автоматически выполнять групповые вызовы. Возможно, их прототипы достаточно полезны, я не пытался их использовать: http://research.cs.vt.edu/vtspaces/best/ http://research.cs.vt.edu/vtspaces/brmi/ – Blaisorblade

ответ

4

Снизить количество обходов

1000 обзорные экскурсии для одной операции является астрономическая цифра. Вы не должны видеть эти цифры.

У вас все еще есть проблема, хотя с файлами 50 МБ. В этом случае вам нужно будет либо найти способ сделать передачу более эффективной (передавать только дельта между двумя подобными файлами?), Либо использовать кэширование какого-то рода.

WAN-трафик убивает ваше приложение, и похоже, что у вас есть основной рефакторинг.

сервера
+0

Что такое WAN-трафик? – Snehal

+0

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

+0

Я фактически поддерживаю это старое приложение, и мне была назначена задача улучшить производительность. В любом случае, спасибо, что указали это. – Snehal

1

-Сделать без гражданства, если это еще не тот случай

легкие удаленных рассмотрят протоколы, такие как Гессе

-Latency, вероятно, ваше горлышко бутылки, рекомендуется использовать кэш клиентов и читать большие массивы данных , 1000 круговых поездок - огромная нагрузка.

рефакторинг рассмотрит клиент, чтобы сделать его способным работать локально и он синхронизируется в фоновом режиме

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

+0

Забудьте профилировщик. Приложение имеет 1K однократную поездку за операцию, с 50 МБ файлами. WAN является узким местом. –

+0

Вот почему последний профайлер;) – Miquel

+0

Не делайте сервер без гражданства. Это увеличивает проблемы –

1

Вы проводили какие-либо измерения относительного потребления времени в разных частях операции? Я бы ничего не трогал, пока вы не измерили, сколько времени проходят отдельные процессы.

I подозреваемый проблема с задержкой - это ключ. Но я бы измерил и определил это первым, прежде чем рассматривать любые решения.

0

Для каждой операции требуется 1000 запросов. Это убьет любой сервер. Обычно это проблема, которая не может быть решена путем добавления дополнительного оборудования или добавления большей полосы пропускания. Это проблема дизайна. В любом случае, я бы установил профилировщик, чтобы увидеть статус сервера (потребление памяти, процессор и т. Д.) . Посмотрите на лямбда-зонда (http://www.lambdaprobe.org)

+0

Является ли LambdaProbe Tomcat конкретным? –

+0

Да !. Фактически этот профилировщик ранее назывался Tomcatprobe. – Luixv

+0

BTW, он работает также под Jboss – Luixv

1

Пожалуй, лучше всего сделать, было бы получить лучшее понимание того, как работает infrastrucure

  1. Почему файлы очень большого размера?
  2. Должен ли быть отправлен весь файл или вы могли бы получить с отправкой только необходимых частей для обработки
  3. Что это за сетевые вызовы? Все ли они необходимы? Если да, можно ли переадресовывать вызовы в один звонок?
1

Не уверен, но похоже, что у вас есть данные в файле размером 50 МБ, которые вы хотите проверить/обработать и сохранить в базе данных. Правильно ли это?

Почему клиент может просто передать файл на сервер, а сервер выполнит задачу проверки/процесса и сохранит его в базе данных? Это будет отсутствие сетевых вызовов, кроме передачи данных файла на сервер.

Другая возможность заключается в том, что вы можете использовать несколько операций в одном вызове, то есть шаблон фасада сеанса.

1

«Высокопроизводительные веб-сайты: основные знания для инженеров-фронтовиков» Стива Соудера - действительно хорошая книга об этом. См. here.

Веб-сайт Стива - here.

+0

Разве это не только о веб-сайтах? – Blaisorblade

2

Отправка больших файлов и много запросов по сети стоит много времени. Период. Даже если вы можете перейти на гигабитный Ethernet, протокол по-прежнему требует, чтобы ваш клиент простоял несколько миллисекунд между двумя последовательными сетевыми пакетами (так что другие хосты также могут поговорить).

Но гигабитный Ethernet невозможен, поскольку клиенты находятся далеко (возможно, подключены через Интернет).

Таким образом, единственный путь, который будет работать, - это перемещение бизнес-кода ближе к серверу. Наиболее простым решением будет установка клиентов на небольшие ящики в той же локальной сети, что и сервер, и использование VNC или аналогичного протокола для удаленного доступа к ним.

Следующим уровнем будет вырезание клиентов на бизнес-уровень и уровень отображения. Превратите бизнес-уровень в службу и установите уровень отображения на клиентах. Таким образом, данные только нажимаются на (быструю) интрасеть. Когда результаты готовы для отображения, клиенты получают только результаты (небольшие данные).

1

Я предложил бы сделать так, чтобы процесс был настолько асинхронным, насколько это возможно. Нужно ли клиентам реагировать в режиме реального времени на обработку? Если нет, вы можете перейти к концепции MOM (Messaging Oriented Middleware) и разместить JMS очереди/темы между клиентом и сервером.

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

0

RMI - очень дорогой протокол. Я бы посмотрел на его замену.

+0

Java-RMI стоит очень дорого. Существует несколько альтернатив, которые намного быстрее. –

+0

RMI медленный, но AFAIK очень мало альтернатив уменьшает количество раундов. – Blaisorblade

1

Либо реорганизуйте код основным способом, либо перепишите все приложение. Если ваш менеджер говорит, что потребуется много времени, добавьте индикатор выполнения, чтобы пользователь считал, что он идет быстрее.

0

Если вы не можете изменить протокол, по крайней мере изменить полезную нагрузку:

1) Это звучит как закрытая система. Если да, нет необходимости использовать обобщенный протокол Serializable. Переключитесь на Externalizable и напишите минимальные данные, необходимые для захвата состояния объекта для переноса.

2) Сжатие данных, отправленных с сервера на клиент. Помимо состояния объекта в (1), вы также должны уменьшить количество данных («файлы»), которые вы перемещаете по сети.

Помимо этого (и это, очевидно, зависит от системы) вы должны исследовать узлы кэширования вперед. Во многих приложениях существует шаблон для доступа к сущностям домена. Если есть шаблоны географического доступа, которые могут быть использованы, вы должны иметь возможность тривиально создавать новые прокси-узлы, являющиеся клиентами удаленного сервера, а затем выступать в качестве сервера (rmi) для ближайших клиентов (rmi).

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