[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mikroservisy-kak-organizovat-asinkhronnoe-vzaimodeystvie-cherez-brokery-soobshcheniy":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},824,"kak-organizovat-asinkhronnoe-vzaimodeystvie-cherez-brokery-soobshcheniy",23,"mikroservisy","Микросервисы","🔗","Как организовать асинхронное взаимодействие через брокеры сообщений?","Асинхронное взаимодействие позволяет сервисам обмениваться данными без ожидания немедленного ответа. Два основных брокера: Apache Kafka (распределённый лог событий) и RabbitMQ (классическая очередь сообщений).\n\n\u003Cdetails>\u003Csummary>Apache Kafka: продюсер и консьюмер\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Продюсер (сервис платежей)\n@Service\n@RequiredArgsConstructor\npublic class PaymentEventProducer {\n    private final KafkaTemplate\u003CString, PaymentEvent> kafkaTemplate;\n\n    public void publishPaymentCompleted(Payment payment) {\n        PaymentEvent event = new PaymentEvent(\n            payment.getId(),\n            payment.getAmount(),\n            payment.getCustomerId(),\n            EventType.PAYMENT_COMPLETED,\n            Instant.now()\n        );\n        kafkaTemplate.send(\"payment-events\",\n            payment.getId().toString(), event);\n    }\n}\n\n\u002F\u002F Конфигурация продюсера\n@Configuration\npublic class KafkaProducerConfig {\n    @Bean\n    public ProducerFactory\u003CString, PaymentEvent> producerFactory() {\n        Map\u003CString, Object> config = Map.of(\n            ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, \"kafka:9092\",\n            ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class,\n            ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class,\n            ProducerConfig.ACKS_CONFIG, \"all\",\n            ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true\n        );\n        return new DefaultKafkaProducerFactory\u003C>(config);\n    }\n}\n\n\u002F\u002F Консьюмер (сервис уведомлений)\n@Service\n@Slf4j\npublic class NotificationEventConsumer {\n\n    @KafkaListener(\n        topics = \"payment-events\",\n        groupId = \"notification-service\",\n        containerFactory = \"kafkaListenerContainerFactory\"\n    )\n    public void handlePaymentEvent(PaymentEvent event) {\n        log.info(\"Получено событие платежа: {}\", event.getPaymentId());\n        notificationService.sendPaymentNotification(event);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\u003Csummary>RabbitMQ: продюсер, консьюмер и конфигурация\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Продюсер\n@Service\n@RequiredArgsConstructor\npublic class NotificationProducer {\n    private final RabbitTemplate rabbitTemplate;\n\n    public void sendNotification(NotificationMessage message) {\n        rabbitTemplate.convertAndSend(\n            \"notifications-exchange\",\n            \"notification.email\",\n            message\n        );\n    }\n}\n\n\u002F\u002F Консьюмер\n@Service\npublic class EmailNotificationConsumer {\n\n    @RabbitListener(queues = \"email-notifications-queue\")\n    public void handleEmailNotification(NotificationMessage message) {\n        emailService.send(message);\n    }\n}\n\n\u002F\u002F Конфигурация\n@Configuration\npublic class RabbitConfig {\n    @Bean\n    public TopicExchange exchange() {\n        return new TopicExchange(\"notifications-exchange\");\n    }\n\n    @Bean\n    public Queue emailQueue() {\n        return QueueBuilder.durable(\"email-notifications-queue\")\n            .withArgument(\"x-dead-letter-exchange\", \"dlx-exchange\")\n            .build();\n    }\n\n    @Bean\n    public Binding binding(Queue emailQueue, TopicExchange exchange) {\n        return BindingBuilder.bind(emailQueue)\n            .to(exchange).with(\"notification.email\");\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Kafka vs RabbitMQ\n\n| Критерий | Kafka | RabbitMQ |\n|---|---|---|\n| Модель | Распределённый лог | Очередь сообщений |\n| Хранение | Сообщения хранятся после прочтения | Удаляются после подтверждения |\n| Пропускная способность | Очень высокая (миллионы msg\u002Fsec) | Высокая (десятки тысяч msg\u002Fsec) |\n| Порядок | Гарантирован в рамках партиции | Гарантирован в рамках очереди |\n| Маршрутизация | По топикам и партициям | Гибкая (direct, topic, fanout, headers) |\n| Применение | Event streaming, event sourcing | Task queues, RPC, маршрутизация |\n\n> **На собеседовании:** ключевое различие — Kafka хранит сообщения после прочтения (лог), а RabbitMQ удаляет после подтверждения (очередь). Kafka — для event-driven архитектуры и event sourcing, RabbitMQ — для task queues и гибкой маршрутизации.","","middle",[15],"microservices",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Как организовать асинхронное взаимодействие через брокеры со — Gymterview","Асинхронное взаимодействие позволяет сервисам обмениваться данными без ожидания немедленного ответа. Два основных брокера: Apache Kafka (распределённый лог собы","Асинхронное взаимодействие позволяет сервисам обмениваться данными без ожидания немедленного ответа. Два основных брокер",[15,13],"Асинхронное взаимодействие позволяет сервисам обмениваться данными без ожидания немедленного ответа. Два основных брокера: Apache Kafka (распределённый лог событий) и RabbitMQ (классическая очередь сообщений).",true]