Въведение в RabbitMQ

1. Общ преглед

Отделянето на софтуерни компоненти е една от най-важните части на софтуерния дизайн. Един от начините да се постигне това е използването на системи за съобщения, които осигуряват асинхронен начин на комуникация между компоненти (услуги). В тази статия ще разгледаме една от тези системи: RabbitMQ.

RabbitMQ е посредник за съобщения, който прилага разширен протокол за опазване на съобщения (AMQP). Той предоставя клиентски библиотеки за основните програмни езици.

Освен да се използва за отделяне на софтуера компоненти RabbitMQ може да се използва за:

  • Извършване на фонови операции
  • Извършване на асинхронна операция

2. Модел за съобщения

Първо, нека да разгледаме бързо на високо ниво как функционират съобщенията.

Просто казано, има два вида приложения, взаимодействащи със система за съобщения: производители и потребители. Производители са тези, които изпращат (публикуват) съобщения до брокер, и потребителите, които получават съобщения от брокера. Обикновено тези програми (софтуерни компоненти) се изпълняват на различни машини и RabbitMQ действа като комуникационен междинен софтуер между тях.

В тази статия ще обсъдим прост пример с две услуги, които комуникират с помощта на RabbitMQ. Една от услугите ще публикува съобщения до RabbitMQ, а другата ще консумира.

3. Настройка

За началото нека стартираме RabbitMQ, като използваме официалното ръководство за настройка тук.

Естествено ще използваме Java клиента за взаимодействие със сървъра RabbitMQ; зависимостта на Maven за този клиент е:

 com.rabbitmq amqp-client 4.0.0 

След като стартираме брокер RabbitMQ с помощта на официалното ръководство, трябва да се свържем с него с помощта на Java клиент:

ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); 

Използваме ConnectionFactory за настройка на връзката със сървъра, той се грижи и за протокола (AMQP) и удостоверяването. Тук се свързваме със сървъра на localhost , можем да модифицираме името на хоста, като използваме функцията setHost .

Можем да използваме setPort, за да зададем порта, ако портът по подразбиране не се използва от RabbitMQ Server; портът по подразбиране за RabbitMQ е 15672 :

factory.setPort(15678);

Можем да зададем потребителско име и парола:

factory.setUsername("user1"); factory.setPassword("MyPassword");

Освен това ще използваме тази връзка за публикуване и консумиране на съобщения.

4. Продуцент

Обмислете прост сценарий, при който уеб приложение позволява на потребителите да добавят нови продукти към уебсайт. Всеки път, когато се добавя нов продукт, трябва да изпратим имейл до клиентите.

Първо, нека дефинираме опашка:

channel.queueDeclare("products_queue", false, false, false, null);

Всеки път, когато потребителите добавят нов продукт, ние ще публикуваме съобщение на опашка:

String message = "product details"; channel.basicPublish("", "products_queue", null, message.getBytes());

Накрая затваряме канала и връзката:

channel.close(); connection.close();

Това съобщение ще бъде използвано от друга услуга, която отговаря за изпращането на имейли до клиентите.

5. Потребител

Нека видим какво можем да приложим от страна на потребителя; ще декларираме същата опашка:

channel.queueDeclare("products_queue", false, false, false, null);

Ето как дефинираме потребителя, който ще обработва асинхронно съобщенията от опашката:

DefaultConsumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery( String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); // process the message } }; channel.basicConsume("products_queue", true, consumer);

6. Заключение

Тази проста статия обхваща основните понятия на RabbitMQ и обсъжда прост пример, използващ го.

Пълното изпълнение на този урок може да бъде намерено в проекта GitHub.