Заметки об исследовании MQ - (RabbitMQ)

Оглавление:

  • Знакомство с 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. Использовать канал для привязки потребителя к очередь

Guess you like

Origin blog.csdn.net/weixin_42594143/article/details/130841717