Apache Pulsar - ioThreads / listenerThreads и порядок сообщений - PullRequest
0 голосов
/ 09 июля 2019

Мы разрабатываем приложение, которое требует, чтобы сообщения с одним и тем же ключом обрабатывались строго последовательно.Кроме того, по соображениям производительности / пропускной способности нам необходимо ввести параллельную обработку.

Распараллеливание - это просто - у нас может быть один поток, получающий сообщения, вычисляющий хэш ключа и использующий хэш% числа рабочихраспределить сообщение в определенной очереди блокировки с работником на другой стороне.Это гарантирует, что сообщения с одним и тем же ключом отправляются одному и тому же работнику, поэтому упорядочение гарантируется - до тех пор, пока получатель получает сообщения в порядке.

Вопросы:

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

  2. Если мы увеличим их, мы все еще гарантируем заказ?

Документация Pulsar не ясна ...

1 Ответ

1 голос
/ 10 июля 2019

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

Может, в зависимости от различных факторов.

  1. IoThreads: это пул потоков, используемый для управления соединениями TCP с посредниками.Если вы работаете / работаете по многим темам, вы, скорее всего, будете взаимодействовать с несколькими брокерами и, следовательно, будете открывать несколько соединений TCP.Увеличение количества ioThreads может устранить «узкое место в одном потоке», хотя оно будет эффективным только в том случае, если такое узкое место действительно имеется (в большинстве случаев это не так) ...Вы можете проверить использование ЦП в пользовательском процессе во всех потоках, чтобы увидеть, есть ли какой-либо поток, приближающийся к 100% (одного ядра ЦП).

  2. ListenerThreads: это пул потоковразмер, когда вы используете приемник сообщений в приемнике.Обычно это пул потоков, используемый приложением для обработки сообщений (если только он не переходит на другой поток).Здесь может иметь смысл увеличить количество потоков, если обработка приложения достигает предела 1 ядра процессора.

Если мы увеличим их, мы по-прежнему гарантируем заказ?

Да.

  • Потоки ввода-вывода: 1 TCP-соединение всегда отображается на 1 поток ввода-вывода
  • ListenerThreads: 1 Потребитель назначен 1 потоку прослушивателя
...