F
Flutter Friendly
@flutterfriendly1.0K подп.
714просмотров
70.0%от подписчиков
11 февраля 2026 г.
📷 ФотоScore: 785
💭Привет, это Катя, Flutter Dev Friflex В прошлом посте мы разобрали основы работы с библиотекой dart_amqp 0.3.1: подключение к серверу, создание каналов, работу с очередями и обменниками. Сегодня я покажу, как работать с несколькими RabbitMQ инстансами одновременно в проекте. AmqpMessage Класс AmqpMessage — это обертка над входящими сообщениями, которая предоставляет удобные методы для работы с данными. consumer.listen((AmqpMessage message) { &nbsp;&nbsp;// Сырые байты &nbsp;&nbsp;Uint8List rawBytes = message.payload; &nbsp;&nbsp; &nbsp;&nbsp;// UTF8 строка &nbsp;&nbsp;String text = message.payloadAsString; &nbsp;&nbsp;print('Текст: &#036;text'); &nbsp;&nbsp; &nbsp;&nbsp;// JSON &nbsp;&nbsp;Map<String, dynamic> json = message.payloadAsJson; &nbsp;&nbsp;print('User ID: &#036;{json['userId']}'); &nbsp;&nbsp; &nbsp;&nbsp;// Метаданные &nbsp;&nbsp;print('Exchange: &#036;{message.exchangeName}'); &nbsp;&nbsp;print('Routing key: &#036;{message.routingKey}'); }); Publisher Confirms Publisher Confirms — это механизм подтверждения от брокера о том, что сообщение было принято и обработано. Важно: ACK от брокера означает, что сообщение сохранено на сервере, но не гарантирует, что его получил потребитель Зачем нужно несколько RabbitMQ соединений? В микросервисной архитектуре часто возникает необходимость подключаться к разным RabbitMQ серверам: ✔️Разные окружения (dev, staging, production) ✔️Географически распределенные кластеры ✔️Разделение ответственности между сервисами ✔️Миграция между серверами Паттерн Registry для управления соединениями Вместо создания множества отдельных клиентов, используйте паттерн Registry — централизованное хранилище соединений с разными RabbitMQ инстансами: class RabbitRegistry { &nbsp;&nbsp;RabbitRegistry(); &nbsp;&nbsp;final Map<String, RabbitService> _registry = {}; &nbsp;&nbsp;/// Инициализация соединений для всех хостов &nbsp;&nbsp;void saveAll(List<String> hosts) { &nbsp;&nbsp;&nbsp;&nbsp;_removeAllExcept(hosts.toSet()); &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;for (final host in hosts) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_registry[host] ??= RabbitService( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;host: host, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)..initialize(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;/// Получить соединение по хосту &nbsp;&nbsp;RabbitService read(String host, {bool canCreate = false}) { &nbsp;&nbsp;&nbsp;&nbsp;if (canCreate) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return _registry.putIfAbsent( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;host, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;() => RabbitService( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;host: host, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)..initialize(), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;final rabbit = _registry[host]; &nbsp;&nbsp;&nbsp;&nbsp;if (rabbit == null) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw StateError( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'RabbitService для "&#036;host" не найден. ' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Инициализируйте его через saveAll().', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return rabbit; &nbsp;&nbsp;} &nbsp;&nbsp;/// Удалить соединение &nbsp;&nbsp;void remove(String host) { &nbsp;&nbsp;&nbsp;&nbsp;_registry.remove(host)?.dispose(); &nbsp;&nbsp;} &nbsp;&nbsp;/// Закрыть все соединения &nbsp;&nbsp;void dispose() { &nbsp;&nbsp;&nbsp;&nbsp;for (final service in _registry.values) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service.dispose(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;_registry.clear(); &nbsp;&nbsp;} } Как это работает 1️⃣ Инициализация реестра при старте приложения При запуске приложения создаем экземпляр RabbitRegistry и передаем ему список хостов RabbitMQ-серверов из конфигурации. Реестр автоматически создаст и инициа
714
просмотров
4000
символов
Нет
эмодзи
Да
медиа

Другие посты @flutterfriendly

Все посты канала →
💭Привет, это Катя, Flutter Dev Friflex В прошлом посте мы р — @flutterfriendly | PostSniper