Я руководитель проекта для HornetQ, но я постараюсь дать вам общий ответ, который можно применить к любой системе сообщений, которую вы выберете.
Обычный вопрос, который я вижу, это то, что люди спрашивают, почему один производитель / один потребитель не даст вам ожидаемой производительности.
Когда вы отправляете сообщение и сразу запрашиваете подтверждение, вам нужно подождать:
- Передача сообщений от клиента к серверу
- Сообщение сохраняется на диске
- Сервер, подтверждающий получение сообщения, отправив обратный вызов клиенту
Аналогично, когда вы получаете сообщение, вы отправляете ACK на сервер:
- ACK отправляется с клиента на сервер
- ACK сохраняется
- Сервер отправляет обратный вызов, сообщая, что обратный вызов достигнут
И если вам нужно подтверждение для всех ваших отправок сообщений и сообщений, вам нужно подождать этих шагов, поскольку у вас есть оборудование, необходимое для сохранения диска и отправки битов в сети.
Системы сообщений будут стремиться к расширению со многими производителями и многими потребителями. То есть, если многие производят, все они должны использовать ресурсы, доступные на сервере, совместно используемом для всех потребителей.
Есть способы ускорить одного производителя или одного потребителя:
Одним из них является использование транзакций. Таким образом, вы минимизируете блоки и синхронизацию, которые вы выполняете на диске, сохраняя при этом на сервере и циклические переходы в сети. (Это фактически одинаково для любой базы данных)
Еще один способ - использовать обратные вызовы вместо блокирования у потребителя. (JMS 2 предлагает Callback, похожий на ConfirmationHandler на HornetQ).
Кроме того: большинство знакомых мне провайдеров будут иметь разделы по производительности в своих документах с требованиями и предложениями для этого конкретного продукта. Вы должны смотреть индивидуально на каждый продукт