Оглавление:
- Знакомство с MQ
- Быстрый старт RabbitMQ
- ВеснаAMQP
Исходный МК:
- синхронная связь
- асинхронная связь
- Общая структура MQ
Преимущества и недостатки начальной MQ-синхронной связи
Синхронная и асинхронная связь
Синхронное общение: например, видео WeChat, вы можете снимать видео только с одним человеком за раз, если другие люди хотят снимать видео с вами, вам нужно подождать, пока ваше видео не закончится.
Асинхронное общение: например, при отправке сообщения в WeChat, после отправки сообщения человеку, другой человек может не ответить вам, но вы все равно можете отправлять сообщения другим людям.
Проблема с синхронными вызовами
Вызовы между микросервисами на основе симуляции являются синхронными методами, и здесь есть некоторые проблемы.
1. Высокая степень сцепления
- Каждый раз, когда добавляется новое требование, исходный код необходимо модифицировать.
2. Снижение производительности
- Звонящему необходимо дождаться ответа поставщика услуг.Если цепочка вызовов слишком длинная, время ответа равно сумме времени каждого вызова.
3. Пустая трата ресурсов
- Каждая служба в цепочке вызовов не может освободить ресурсы, занятые запросом, в ожидании ответа.В сценариях с высоким уровнем параллелизма системные ресурсы будут потрачены впустую.
4. Каскадный сбой
- Если есть проблема с сервис-провайдером, у всех звонящих тоже будут проблемы, прямо как ребрышки домино, что быстро приведет к выходу из строя всей микросервисной группы.
Подведем итог
Преимущества синхронных вызовов:
- Чувствителен ко времени, результаты могут быть получены немедленно
Проблемы с синхронными вызовами:
- Высокая связь
- Снижение производительности и пропускной способности
- имеет дополнительное потребление ресурсов
- Существует проблема каскадного отказа
Преимущества и недостатки начальной MQ-асинхронной связи
Распространенной реализацией асинхронных вызовов является режим, управляемый событиями.
Преимущество событий
Преимущество 1: Развязка сервисов
Преимущество 2: Повышение производительности и повышение пропускной способности
Преимущество 3: Нет сильной зависимости от сервисов, не нужно беспокоиться о каскадных сбоях
Преимущество 4: Снижение пикового трафика
краткое содержание
Преимущества асинхронной связи
- низкое сцепление
- Повышение пропускной способности
- локализация отказов
- отсечение потока
Недостатки асинхронной связи:
- Положитесь на надежность, безопасность и пропускную способность Broken
- Структура сложная, в бизнесе нет четкой технологической линии, сложно отслеживать и управлять
Первоначальное внедрение общей технологии MQ-mq
Что такое МК
MQ, по-китайски это очередь сообщений, буквально очередь для хранения сообщений. То есть Брокер в событийно-управляемой архитектуре.
RabbitMQ | ActiveMQ | RocketMQ | Кафка | |
---|---|---|---|---|
Компания/Сообщество | Кролик | Апачи | Али | Апачи |
Язык разработки | Эрланг | Джава | Джава | Скала и Java |
поддержка протокола | AMQP, XMPP, SMTP, STOMP | OpenWrite, STOMP, REST, XMPP, AMQP | пользовательский протокол | пользовательский протокол |
доступность | высокий | в целом | высокий | высокий |
Автономная пропускная способность | в целом | Разница | высокий | очень высоко |
область задержки сообщения | микросекундный уровень | Миллисекунда | Миллисекунда | в течение миллисекунд |
надежность сообщения | высокий | в целом | высокий | в целом |
Kafka подходит для передачи массивных данных, но не требует высокой безопасности данных, таких как данные журналов.
RabbitMQ рекомендуется для малых и средних предприятий
Если это крупное предприятие, которому необходимо выполнить более глубокую настройку, рекомендуется использовать RocketMQ.
Быстрый старт RabbitMQ — введение в установку
Обзор RabbitMQ
RabbitMQ — промежуточное ПО для обмена сообщениями с открытым исходным кодом, разработанное на основе языка Erlang, адрес официального сайта: http://www.rabbitmq.com/
Руководство по развертыванию RabbitMQ
1. Автономное развертывание
Используйте Docker для установки на виртуальную машину Centos7
1.1 Скачать зеркало
Способ 1: онлайн-вытягивание
docker pull rabbitmq:3-management
Способ 1: загрузка с локального
После загрузки пакета изображения, предоставленного в документе, на виртуальную машину, используйте команду для загрузки изображения:
docker load -i mq.tar
1.2 Установка MQ
Выполните следующую команду, чтобы запустить контейнер MQ.
docker run \
-e RABBITMQ_DEFAULT_USR=luxifa \ #设置环境变量
-e RABBITMQ_DEFAULT_PASSWORD=1234 \ #设置环境变量
--name mq \ #起名
--hostname mql \ #配置主机名,不配也没关系,如果将来做集群部署的话,就得配
--p 15672:15672 \ # 开放了两个端口 15672是rabbitmq 管理平台的端口
--p 5672:5672 \ # 做消息通信的端口
-d \ # 后台运行
rabbitmq:3-management # 镜像的名称
Выполните команду в консоли, и контейнер может быть создан.Проверьте
его через docker ps
Введите в браузере: http://machine IP:15672 для входа в интерфейс управления RabblitMQ
В интерфейсе:
Обзор: Обзор, в основном какая-то подробная информация об узле, потому что сейчас он работает на одном узле, кластера нет, поэтому есть только один
Соединения в узле: соединение, в будущем, будет ли оно издатель сообщения или потребитель сообщения, вы должны установить соединение с mq
Channels: канал, после того, как соединение установлено, канал должен быть установлен, и производитель или потребитель может завершить отправку или получение сообщений на основе каналов. считать, что канал — это отправка или получение сообщения в mq и т. д. Различные операции В дальнейшем каждый, кто подключается, должен создать один или несколько каналов
Обмены: переключатель
Очереди: очередь, используется для хранения сообщений
Администратор: управление, в этом интерфейсе вы можете управлять текущей информацией о пользователе
Структура и концепция RabbitMQ
Издатель отправит сообщение на биржу, биржа отвечает за маршрутизацию и доставку сообщения в очередь, очередь отвечает за временное хранение сообщения, а потребитель получает сообщение из очереди и обрабатывает сообщение.
краткое содержание
Несколько концепций в RabbitMQ:
- канал: инструмент для работы с MQ
- exchange: маршрутизация сообщений в очереди
- очередь: кешировать сообщения
- виртуальный хост: виртуальный хост, который представляет собой логическую группу ресурсов, таких как очередь и обмен
Быстрый старт RabbitMQ — введение в модель сообщений
Общая модель сообщений
Официальная документация MQ (http://rabbitmq.com/getstarted.html) дает 5 демонстрационных примеров MQ, соответствующих нескольким различным масштабам:
- Базовая очередь сообщений (BasicQueue)
- Очередь рабочих сообщений (WorkQueue)
Оба они выполняются на основе очередей сообщений без использования коммутаторов.
Публикация и подписка (Publish, Subscribe) делятся на три типа по разным типам переключателей:
- Разветвленная биржа: трансляция
- Прямой обмен: маршрутизация
- Обмен темами: тема
Кейс HelloWorld
Официальный HelloWorld реализован на основе самой простой модели очереди сообщений, включающей всего три роли:
- publicsher: издатель сообщений, отправить сообщение в очередь очереди
- очередь: очередь сообщений, отвечающая за прием и кэширование сообщений.
- потребитель: подписаться на очередь и обрабатывать сообщения в очереди
Кейс: завершите кейс hello world в официальной демо-версии.
Этапы реализации:
- Импорт демонстрационного проекта в данные
- Запустите тестовый метод testSendMessage() в тестовом классе PublisherTest в службе издателя.
- Просмотр сообщений в консоли RabibitMQ
- Запустите службу потребителя, чтобы узнать, может ли она получать сообщения.
PublisherTest.java
public class PublisherTest {
@Test
public void testSendMessage() throws IOException, TimeoutException {
// 1.建立连接
ConnectionFactory factory = new ConnectionFactory();
// 1.1设置连接参数 分别是:主机名、端口号、vhost、用户名、密码
factory.setHost("192.168.150.101");
factory.setPort(5672);
factory.setVirtualHost("/");
factory.setUsername("luxifa");
factory.setPassword("123456");
// 1.2建立连接
Connection connection = factory.newConnection();
// 2.创建通道Channel
Channel channel = connection.createChannel();
// 3.创建队列
String queueName = "simple.queue";
channel.queueDeclare(queueName,durable:false,exclusive:false,qutoDelete:false,arguments:null);
// 4.发送消息
String message = "hello rabbitmq!";
channel.basicPublish(exchange:"",queueName,props:null,message.getBytes());
System.out.println("发送消息成功:【" + message + "】");
//5.关闭通道和连接
channel.close();
connection.close();
}
}
Потребительский тест.java
public class ConsumerTest{
@Test
public static void main(Strign[] args) throws IOException,TimeoutException {
// 1.建立连接
ConnectionFactory factory = new ConnectionFactory();
// 1.1设置连接参数 分别是:主机名、端口号、vhost、用户名、密码
factory.setHost("192.168.150.101");
factory.setPort(5672);
factory.setVirtualHost("/");
factory.setUsername("luxifa");
factory.setPassword("123456");
// 1.2建立连接
Connection connection = factory.newConnection();
// 2.创建通道Channel
Channel channel = connection.createChannel();
// 3.创建队列
String queueName = "simple.queue";
channel.queueDeclare(queueName,durable:false,exclusive:false,qutoDelete:false,arguments:null);
// 4.订阅消息
channel.basicConsume(queueName,autoAck:true,new DefaultConsumer(channel) {
@Ovrride
public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body) throws IOException {
// 5.处理消息
String message = new String(body);
System.out.println("接收到消息:【" + message + "】");
}
});
System.out.println("等待接收消息......");
}
}
краткое содержание:
Процесс отправки сообщений в базовой очереди сообщений:
1. Предложить соединение
2. Создать канал
3. Использовать канал для объявления очереди
4. Использовать канал для отправки сообщений в очередь
Процесс получения сообщений в базовой очереди сообщений:
1. Предложить соединение
2. Создать канал
3. Использовать канал для объявления очереди
4. Определить поведение потребления потребителя handleDelevery()
5. Использовать канал для привязки потребителя к очередь