Skip to content

Add send event to kafaka about post create#3536

Open
Pavel-Lukyanov wants to merge 3 commits intotriton-master-stream12from
feature/BJS2-97236
Open

Add send event to kafaka about post create#3536
Pavel-Lukyanov wants to merge 3 commits intotriton-master-stream12from
feature/BJS2-97236

Conversation

@Pavel-Lukyanov
Copy link
Copy Markdown

No description provided.

@github-actions
Copy link
Copy Markdown

⚠️ ОШЫБКА: Сборка завалилась: либо ошибки компиляции, либо не прошли тесты, либо возникли ошибки в стиле кода. Пожалуйста, проверь логи и внеси соответствующие изменения в ПР. После этого красная ошибка ниже должна пропасть, но этот комментарий останется - так и должно быть.

@github-actions
Copy link
Copy Markdown

⚠️ ОШЫБКА: Сборка завалилась: либо ошибки компиляции, либо не прошли тесты, либо возникли ошибки в стиле кода. Пожалуйста, проверь логи и внеси соответствующие изменения в ПР. После этого красная ошибка ниже должна пропасть, но этот комментарий останется - так и должно быть.

@github-actions
Copy link
Copy Markdown

⚠️ ОШЫБКА: Сборка завалилась: либо ошибки компиляции, либо не прошли тесты, либо возникли ошибки в стиле кода. Пожалуйста, проверь логи и внеси соответствующие изменения в ПР. После этого красная ошибка ниже должна пропасть, но этот комментарий останется - так и должно быть.


do {
Pageable pageable = PageRequest.of(page, PAGE_SIZE);
subscriberPage = userRepository.findFollowerIdsPaged(event.getAuthorId(), pageable);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Душка, но чисто добавлю, что по сути ты должен ходить в сервис юзеров и оттуда брать id юзеров


ack.acknowledge();
log.info("Finished processing PostCreatedEvent for postId={}", event.getId());
} catch (Exception e) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Слишком обобщенное исключение, много операций и не понятно что может вылететь, мб несколько сценариев как-то обработать

private Map<OutboxEventType, OutboxEventPublisher> publisherMap;

@PostConstruct
void init() {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

модификатор потерял

public class OutboxPublisher {

private final OutboxRepository outboxRepository;
private final List<OutboxEventPublisher> publishers;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ставлю класс, задумка на перспективу

Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если в топике отправляются JSON объекты, они будут десериализованы как строки, а не как объекты.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

используй дженерики для фабрики)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Понял, спасибо!

private final String topic;

@Async
public void publish(Object message) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

почему Object а не дженерик класс

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо большое! Учел этот момент, теперь понимаю зачем дженерики нужны, чтобы нельзя было другой объект подсунуть и на этапе компиляции можно было отловить ошибку типов. Поправил)

.whenComplete((result, ex) -> {
if (ex != null) {
log.error("Failed to send message: {}", message, ex);
throw new KafkaSendMessageException(
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

нормально ошибка выбрасывается? она точно тут нужна?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нет, из-за асинхронности отправитель не ловит ее, переделал на синхронную отправку

objectMapper.readValue(payload, PostToFeedEvent.class);

postToFeedProducer.publish(event);
} catch (Exception e) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не надо так обрабатывать ошибки

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поправил


@Transactional
@KafkaListener(topics = "${kafka.topics.post-created:post.created}", groupId = "user-service-group")
public void listen(String message, Acknowledgment ack) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Вся обработка в одной транзакции может привести к:
Длинным блокировкам
Out of memory

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Действительно, хотел оптимизировать, а получилось как всегда)

Поправил


@Transactional
@KafkaListener(topics = "${kafka.topics.post-created:post.created}", groupId = "user-service-group")
public void listen(String message, Acknowledgment ack) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

что будет если будет ошибка на бд? и транзакция откатится

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Будет плохо)

Переделал, чтобы каждая пачка подписчиков была в отдельной транзакции

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants