Docker Compose与RocketMQ

导言

在大规模分布式系统中,消息中间件扮演着重要的角色,用于在不同的组件之间传递消息。RocketMQ是一款开源的分布式消息中间件,具有高吞吐量、高可用性和可扩展性的特点。Docker Compose则是一个用于定义和运行多容器Docker应用程序的工具。本文将介绍如何使用Docker Compose来部署RocketMQ集群,并通过示例代码演示其用法。

准备工作

在开始之前,我们需要安装Docker和Docker Compose。请根据操作系统的不同,参考官方文档进行安装。

  • Docker官方文档:[
  • Docker Compose官方文档:[

安装完成后,我们可以通过以下命令验证其是否成功安装:

docker version
docker-compose version

部署RocketMQ集群

在使用Docker Compose部署RocketMQ集群之前,我们需要先编写一个docker-compose.yml文件来定义我们要运行的容器。下面是一个简单的示例:

```yml
version: '3'

services:
  namesrv:
    image: rocketmqinc/rocketmq:4.9.0
    container_name: namesrv
    ports:
      - "9876:9876"
    command: sh mqnamesrv
    restart: always

  broker:
    image: rocketmqinc/rocketmq:4.9.0
    container_name: broker
    ports:
      - "10909:10909"
      - "10911:10911"
    links:
      - namesrv
    environment:
      - NAMESRV_ADDR=namesrv:9876
    command: sh mqbroker -n namesrv:9876 -c /opt/rocketmq-4.9.0/conf/broker.conf autoCreateTopicEnable=true
    restart: always

在上面的示例中,我们定义了两个服务,namesrvbrokernamesrv服务用于启动RocketMQ的Namesrv服务,监听9876端口。broker服务用于启动RocketMQ的Broker服务,监听10909和10911端口。我们通过links选项将broker服务连接到namesrv服务,并通过environment选项传递Namesrv的地址给Broker。

启动RocketMQ集群

在编写完docker-compose.yml文件后,我们可以使用以下命令来启动RocketMQ集群:

docker-compose up -d

等待一段时间后,我们可以通过以下命令查看容器是否成功启动:

docker-compose ps

如果一切正常,我们应该可以看到namesrvbroker两个容器处于运行状态。

使用RocketMQ集群

一旦RocketMQ集群成功启动,我们就可以使用它来进行消息传递。以下是一个示例代码,演示如何使用RocketMQ的Java客户端发送和接收消息:

```java
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;

public class RocketMQProducer {

    public static void main(String[] args) throws MQClientException, InterruptedException {
        DefaultMQProducer producer = new DefaultMQProducer("test_group");
        producer.setNamesrvAddr("localhost:9876");
        producer.start();

        try {
            for (int i = 0; i < 10; i++) {
                Message message = new Message("test_topic", "TagA", ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
                SendResult result = producer.send(message);
                System.out.printf("Send Result: %s%n", result);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        producer.shutdown();
    }
}

```java
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.List;

public class RocketMQConsumer {