#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:
- В spring bean есть элемент некоторой сложной бизнес-логики (
CPU amp; Memory intensive, but not IO intensive
), называемый MyComputation .java (с областью действия spring beanprototype
) для защиты от проблем параллелизма или обеспечения потокобезопасности. - У нас есть потребитель Kafka для получения запросов от внешней службы
- У Kafka consumer есть логика, которая вызывает
org.springframework.context.ApplicationContext
getBean() во время выполнения, чтобы получить прототип компонента MyComputation.java и выполняет сложную бизнес-логику внутри него.
Вариант-2:
- В spring bean есть элемент некоторой сложной бизнес-логики (
CPU amp; Memory intensive, but not IO intensive
), называемый MyComputation .java (с областью действия spring beansingleton
) и сделать нашу логику с некоторым механизмом обработки безопасности потоков. - У нас есть потребитель Kafka для получения запросов от внешней службы
- У Kafka consumer есть логика, которая будет автоматически подключать MyComputation.класс java (с
singleton
по умолчанию) и вызов бизнес-логики и избегайте создания всего объекта bean для каждого запроса.
Теперь я сомневаюсь, какой из них лучше — 1 или 2? когда скорость выполнения вычислений ниже скорости входящих запросов. И меня попросили выбрать один вариант из 2, упомянутых выше, помимо всего, что мы могли бы захотеть увеличить аппаратное обеспечение, которое мы можем добавить. Но цель вопроса — выбрать лучший вариант, упомянутый выше.
Пожалуйста, подскажите мне, какой вариант лучше Вариант # 1 или # 2??
Комментарии:
1. Вы пытались запустить какие-то тесты производительности? Я предлагаю вам вместо этого использовать параллельные прослушиватели Kafka (настройте
concurrency
параметр). См.: ConcurrentMessageListenerContainer .2. @NikolasCharalambidis Вопрос больше касается выбора
prototype
компонента илиsingleton
, посколькуprototype
создание компонентов для каждого запроса будет потреблять огромную память, и меня попросили разработать потребительскую логику, которая не должна постепенно увеличивать потребление памяти и, безусловно, достигать ООМ.