RabbitMQ записки

Некоторые основные понятия

 Режиссер 

Производитель, отправить одно сообщение, клиент левой стороны на фигах.

потребитель

Потребитель клиент, один из принятого сообщения, в задней части фиг.

Маклер

Сообщения узла услуги промежуточного программного обеспечения, как правило, RabbitMQ Брокер как сервер RabbitMQ.

новости

Сообщение содержит две части: тело сообщения и тегов. Тело сообщения (полезная нагрузка) , имеющая логический структура бизнес - данные, такие как строки JSON. Тэг сообщение , используемое для описания этого сообщения, такие как имя и переключатель маршрутизации ключей. Продюсеры новости называют RabbitMQ, отправит сообщение заинтересованным потребителям под маркой после RabbitMQ.

соединение

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

Nobumichi

Подключение канала на основе виртуального соединения, каждая команда процесса RabbitMQ AMQP осуществляется по каналу.

Почему введение канала это? Представьте себе ситуацию, когда приложение имеет много потоков должны потреблять сообщения от RabbitMQ, или в производстве новостей, то неизбежно необходимо установить ряд Connection, который много TCP соединений. Однако, для операционной системы, соединение TCP создается и уничтожается очень дорогие накладные расходы, если они используют узкий пик производительность также будет отображаться. RabbitMQ аналогичный NIO «(Неблокирующая 1/0) это выбрано мультиплексирование соединение TCP, может не только уменьшить накладные расходы на производительность, но и легко управлять.

очередь

RabbitMQ внутренней очередь объекта для хранения сообщения, когда множество потребителей может подписаться на одной и ту же очередь, то очередь сообщений распределяются поровну (Round-Robin, т.е. опрос) для обработки для множества потребителей, и не каждый потребитель будет получать все лечение новостей хорошо.

переключатель

Производитель будет отправлять сообщения в Exchange (коммутаторы, могут быть обычно представлены прописной «Х»), коммутатор маршрутов сообщение одному или нескольким очередям. Если маршрут меньше, чем может быть возвращен производителю, и, возможно, отбрасываются.

 

клавиши маршрутизации

Когда сообщение производители к выключателю, как правило, назначает RoutingKey, он используется для указания маршрутизации сообщений правила, и это RoutingKey необходимо обмениваться типы и комбинации клавиш (BindingKey), используемые в сочетании с тем, чтобы в конечном счете, вступит в силу.

 переплет

RabbitMQ связан обменник, связанный с очередью, как правило, указать обязательный ключ (bindingKey) при связывании, так RabbitMQ знать, как маршрутизировать сообщения в нужную очередь.

Производитель посылает сообщение на коммутатор, потребность RoutingKey, и когда BindingKey RoutingKey матч, сообщение направляется в соответствующую очередь. Связанный к тому же в виде множества очередей коммутатора, эти привязки позволяет один и тот же BindingKey. не BindingKey вступают в силу во всех случаях, это зависит от типа коммутатора, такие как тип ветвления переключатель проигнорирует bindingKey, но сообщение направляется переключить все привязывается к очереди.

Тип переключателя

RabbitMQ распространенные типы обменник разветвление, прямой, тема, заголовки четыре. 

разветвление 

Было бы все быть направлены к выключателю, чтобы перенаправлять все сообщения, связанные с очередью переключателя, соответствующий режиму вещания.

непосредственный

Направляет сообщение для тех , кто BindingKey и RoutingKey точного совпадения очереди.

тема

И маршрутизация сообщений BindingKey RoutingKey матч очередь.

заголовки 

Заголовки обменник правило соответствия типа не зависит от маршрутизации ключей для маршрутизации сообщений, но в соответствии с матчем в сообщении передачи содержимого заголовков свойства.

 Производители и потребители процесса передачи

Процесс передачи Производители

 

Процесс передачи потребительских

 

Пример кода

пакет com.spring.hello.demo.mq;

импорт java.io.IOException;
импорт java.util.concurrent.TimeoutException;

импорт com.rabbitmq.client.Channel;
импорт com.rabbitmq.client.Connection;
импорт com.rabbitmq.client.ConnectionFactory;
импорт com.rabbitmq.client.MessageProperties;

общественный класс RabbitProducer {
	частный статическая окончательная Строка EXCHANGE_NAME = «exchange_demo»;
	частная статическая окончательная Строка ROUTING_KEY = «routingkey_demo»;
	частный статический окончательная Строка queue_name = «queue_demo»;
	частная статическая окончательная Строка IP_ADDRESS = «192.168.93.131»;
	частный статический окончательный ИНТ PORT = 5672; // RabbitMQ

	государственной статической силы основных (String [] арг) бросает IOException, TimeoutException, InterruptedException {
		ConnectionFactory завод = новый ConnectionFactory ();
		factory.setHost (IP_ADDRESS);
		factory.setPort (ПОРТ);
		factory.setUsername ( "гость");
		factory.setPassword ( "гость");
		Подключение Подключение = factory.newConnection (); // создать соединение
		Канал канал = connection.createChannel ();
		// // Создание канала для создания типа = «прямой», упорный, не автоматический выключатель удаления
		channel.exchangeDeclare (EXCHANGE_NAME, "прямой", правда, ложь, нуль); 
		// создать постоянные, неисключительные, неавтоматические очереди удаления
		channel.queueDeclare (queue_name, правда, ложь, ложь, нуль); 
		// перейти к очереди с помощью ключа маршрутизации связывания
		channel.queueBind (queue_name, EXCHANGE_NAME, ROUTING_KEY); 
		// отправить упорное сообщение: Hello World!
		Строка сообщения = "Hello World!";
		channel.basicPublish (EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes ());
		// Закрыть ресурс
		channel.close ();
		connection.close ();
	}
}


пакет com.spring.hello.demo.mq;

импорт java.io.IOException;
импорт java.util.concurrent.TimeUnit;
импорт java.util.concurrent.TimeoutException;

импорт com.rabbitmq.client.AMQP.BasicProperties;
импорт com.rabbitmq.client.Address;
импорт com.rabbitmq.client.Channel;
импорт com.rabbitmq.client.Connection;
импорт com.rabbitmq.client.ConnectionFactory;
импорт com.rabbitmq.client.Consumer;
импорт com.rabbitmq.client.DefaultConsumer;
импорт com.rabbitmq.client.Envelope;

общественный класс RabbitConsumer {
	частный статический окончательная Строка queue_name = «queue_demo»;
	частная статическая окончательная Строка IP_ADDRESS = «192.168.93.131»;
	частный статический окончательный ИНТ PORT = 5672; // RabbitMQ

	государственной статической силы основных (String [] арг) бросает IOException, TimeoutException, InterruptedException {
		Адрес [] адрес = новый адрес [] {нового адрес (IP_ADDRESS, ПОРТ)};
		ConnectionFactory завод = новый ConnectionFactory ();
		factory.setUsername ( "гость");
		factory.setPassword ( "гость");
		// Здесь связь с демо-производителей немного разные, обратите внимание, чтобы отличить разницу
		Подключение Соединения = factory.newConnection (адрес); // 创建 连接
		Окончательный канал Channel = connection.createChannel (); // Создать канал
		channel.basicQos (64); извед сообщение не было получено // установить максимальное количество клиентов
		Потребитель потребитель = новый DefaultConsumer (канал) {
			@Override
			общественного недействительный handleDelivery (строка consumerTag, конверт конверт, BasicProperties свойство, байты [] тело)
					бросает IOException {
				System.out.println ( "RECV сообщение:" + новый String (тело));
				пытаться {
					TimeUnit.SECONDS.sleep (1);
				} Задвижка (InterruptedException е) {
					e.printStackTrace ();
				}
				//channel.basicAck (envelope.getDeliveryTag (), ложные);
			}
		};
		channel.basicConsume (queue_name, потребитель); // ждать после того, как функция обратного вызова закончена, закройте ресурс
		TimeUnit.SECONDS.sleep (15);
		channel.close ();
		connection.close ();

	}
}

  

 

рекомендация

отwww.cnblogs.com/lostyears/p/10927131.html