Introduction to RabbitMQ – RabbitMQ简介

最后修改: 2017年 2月 26日

1. Overview

1.概述

Decoupling of software components is one of the most important parts of software design. One way of achieving this is using messaging systems, which provide an asynchronous way of communication between components (services). In this article, we will cover one of such systems: RabbitMQ.

软件组件的解耦是软件设计中最重要的部分之一。实现这一目标的方法之一是使用消息传递系统,它为组件(服务)之间的通信提供了一种异步方式。在这篇文章中,我们将介绍这种系统之一。RabbitMQ。

RabbitMQ is a message broker that implements Advanced Message Queuing Protocol (AMQP). It provides client libraries for major programming languages.

RabbitMQ 是一个消息代理,实现了高级消息队列协议(AMQP)。它提供了用于主要编程语言的客户端库。

Besides using for decoupling software components RabbitMQ can be used for:

除了用于解耦软件组件外,RabbitMQ还可用于。

  • Performing background operations
  • Performing asynchronous operation

2. Messaging Model

2.信息传递模式

First, let’s have a quick, high-level look at how messaging works.

首先,让我们快速、高层次地看看信息传递是如何工作的。

Simply put, there are two kinds of applications interacting with a messaging system: producers and consumers. Producers are those, who sends (publishes) messages to a broker, and consumers, who receive messages from the broker. Usually, this programs (software components) are running on different machines and RabbitMQ acts as a communication middleware between them.

简单地说,有两种与消息系统互动的应用:生产者和消费者。生产者是那些向经纪人发送(发布)消息的人,而消费者是那些从经纪人那里接收消息的人。通常,这些程序(软件组件)在不同的机器上运行,RabbitMQ 在它们之间充当通信中间件。

In this article, we will discuss a simple example with two services which will communicate using RabbitMQ. One of the services will publish messages to RabbitMQ and the other one will consume.

在这篇文章中,我们将讨论一个简单的例子,其中有两个服务将使用 RabbitMQ 进行通信。其中一个服务将向 RabbitMQ 发布消息,另一个服务将消费。

3. Setup

3.设置

For the beginning let’s run RabbitMQ using official setup guide here.

在开始时,让我们使用官方设置指南这里运行RabbitMQ。

We’ll naturally use the Java client for interacting with RabbitMQ server; the Maven dependency for this client is:

我们自然会使用 Java 客户端与 RabbitMQ 服务器进行交互;该客户端的Maven 依赖性是。

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>4.0.0</version>
</dependency>

After running the RabbitMQ broker using the official guide, we need to connect to it using java client:

在使用官方指南运行 RabbitMQ 代理后,我们需要使用 java 客户端连接到它。

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

We use the ConnectionFactory to setup the connection with the server, it takes care of the protocol (AMQP) and authentication as well. Here we connect to the server on localhost, we can modify the host name by using the setHost function.

我们使用ConnectionFactory来建立与服务器的连接,它也负责协议(AMQP)和认证。这里我们在localhost上连接到服务器,我们可以通过使用setHost函数来修改主机名。

We can use setPort to set the port if the default port is not used by the RabbitMQ Server; the default port for RabbitMQ is 15672:

如果 RabbitMQ 服务器不使用默认端口,我们可以使用 setPort 来设置端口;RabbitMQ 的默认端口是 15672

factory.setPort(15678);

We can set username and the password:

我们可以设置用户名和密码。

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

Further, we will use this connection for publishing and consuming messages.

此外,我们将使用这个连接来发布和消费信息。

4. Producer

4.生产者

Consider a simple scenario where a web application allows users to add new products to a website. Any time when new product added, we need to send an email to customers.

考虑一个简单的场景,一个Web应用程序允许用户在网站上添加新产品。当添加新产品时,我们需要向客户发送一封电子邮件。

First, let’s define a queue:

首先,我们来定义一个队列。

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

Each time when users add a new product, we will publish a message to a queue:

每次当用户添加一个新产品时,我们会向队列发布一条消息。

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

Lastly, we close the channel and the connection:

最后,我们关闭通道和连接。

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

This message will be consumed by another service, which is responsible for sending emails to customers.

这个信息将被另一个服务所消耗,该服务负责向客户发送电子邮件。

5. Consumer

5.消费者

Let’s see what we can implement the consumer side; we’re going to declare the same queue:

让我们看看我们能在消费者方面实现什么;我们将声明同样的队列。

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

Here’s how we define the consumer that will process messages from queue asynchronously:

下面是我们如何定义消费者,它将异步处理来自队列的消息。

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. Conclusion

6.结语

This simple article covered basic concepts of RabbitMQ and discussed a simple example using it.

这篇简单的文章涵盖了RabbitMQ的基本概念并讨论了一个使用它的简单例子。

The full implementation of this tutorial can be found in the GitHub project.

本教程的完整实现可以在GitHub项目中找到。