прототип или одноэлементный компонент spring лучше, когда количество потребителей запросов велико, а входящие запросы растут до максимума

#java #spring-boot #apache-kafka #architecture

#java #spring-boot #apache-kafka #архитектура

Вопрос:

Существует внешний источник, который отправит запрос -> Kafka -> Потребитель Kafka вызывает бизнес-логику MyComputation. Предположим, что они развернуты в облаке (AWS или Azure, какое бы облако мы ни могли), у нас есть кластер Kafka с 4 узлами и служба потребителей Kafka с 4 узлами [Примечание: ConcurrentMessageListenerContainer используется в обоих приведенных ниже вариантах]. Все 8 виртуальных машин Linux с 2 ядрами, 2 ГБ оперативной памяти (просто для справки, это не так важно в моем вопросе)

Вариант-1:

  1. В spring bean есть элемент некоторой сложной бизнес-логики ( CPU amp; Memory intensive, but not IO intensive ), называемый MyComputation .java (с областью действия spring bean prototype ) для защиты от проблем параллелизма или обеспечения потокобезопасности.
  2. У нас есть потребитель Kafka для получения запросов от внешней службы
  3. У Kafka consumer есть логика, которая вызывает org.springframework.context.ApplicationContext getBean() во время выполнения, чтобы получить прототип компонента MyComputation.java и выполняет сложную бизнес-логику внутри него.

Вариант-2:

  1. В spring bean есть элемент некоторой сложной бизнес-логики ( CPU amp; Memory intensive, but not IO intensive ), называемый MyComputation .java (с областью действия spring bean singleton ) и сделать нашу логику с некоторым механизмом обработки безопасности потоков.
  2. У нас есть потребитель Kafka для получения запросов от внешней службы
  3. У Kafka consumer есть логика, которая будет автоматически подключать MyComputation.класс java (с singleton по умолчанию) и вызов бизнес-логики и избегайте создания всего объекта bean для каждого запроса.

Теперь я сомневаюсь, какой из них лучше — 1 или 2? когда скорость выполнения вычислений ниже скорости входящих запросов. И меня попросили выбрать один вариант из 2, упомянутых выше, помимо всего, что мы могли бы захотеть увеличить аппаратное обеспечение, которое мы можем добавить. Но цель вопроса — выбрать лучший вариант, упомянутый выше.

Пожалуйста, подскажите мне, какой вариант лучше Вариант # 1 или # 2??

Комментарии:

1. Вы пытались запустить какие-то тесты производительности? Я предлагаю вам вместо этого использовать параллельные прослушиватели Kafka (настройте concurrency параметр). См.: ConcurrentMessageListenerContainer .

2. @NikolasCharalambidis Вопрос больше касается выбора prototype компонента или singleton , поскольку prototype создание компонентов для каждого запроса будет потреблять огромную память, и меня попросили разработать потребительскую логику, которая не должна постепенно увеличивать потребление памяти и, безусловно, достигать ООМ.