RocketMq部署、使用,名词概念学习

目录

1.名词概念

Message Model

Name Server

Bocker Server

Producer

Producer Group

Consumer

Consumer Group

Topic

Message

Tag

2.安装部署

3.使用


1.名词概念

 

Message Model

RocketMQ主要由 Producer、Broker、Consumer 三部分组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker。Message Queue 用于存储消息的物理地址,每个Topic中的消息地址存储于多个 Message Queue 中。ConsumerGroup 由多个Consumer 实例构成。

Name Server

Name Server名称服务充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的Broker IP列表。多个Namesrv实例组成集群,但相互独立,没有信息交换。就有点像微服务的注册中心(eureka)的角色

Bocker Server

消息中转角色,负责存储消息、转发消息。代理服务器在RocketMQ系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。

Producer

负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到broker服务器。RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要Broker返回确认信息,单向发送不需要。

Producer Group

同一类Producer的集合,这类Producer发送同一类消息且发送逻辑一致。如果发送的是事务消息且原始生产者在发送之后崩溃,则Broker服务器会联系同一生产者组的其他生产者实例以提交或回溯消费。

Consumer

负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从Broker服务器拉取消息、并将其提供给应用程序。从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费。

Consumer Group

同一类Consumer的集合,这类Consumer通常消费同一类消息且消费逻辑一致。消费者组使得在消息消费方面,实现负载均衡和容错的目标变得非常容易。要注意的是,消费者组的消费者实例必须订阅完全相同的Topic。RocketMQ 支持两种消息模式:集群消费(Clustering)和广播消费(Broadcasting)。

Topic

表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位。

Message

消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。RocketMQ中每个消息拥有唯一的Message ID,且可以携带具有业务标识的Key。系统提供了通过Message ID和Key查询消息的功能。

Tag

为消息设置的标志,用于同一主题下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统。消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性。

大致的流程图如下:

broker启动起来后像NameServer汇报自己的信息,然后producer和consumer去NameServer上获取broker的信息,向broker生产或者从broker消费,每个broker上的topic中的queue的数量可以是不一样的,RocketMQ的数据负载是依赖所有节点的queue的总数的

2.安装部署

以下是测试内容

下载rocketmqhttps://dlcdn.apache.org/rocketmq/4.9.2/rocketmq-all-4.9.2-bin-release.zip

将下载下来的压缩包传到服务器上

#解压压缩包到/opt目录
unzip rocketmq-all-4.9.2-bin-release.zip /opt
#进入rocketmq目录
cd /opt/rocketmq-4.9.2/bin
#启动NameServer
./mqnamesrv

启动成功后如下

 从新开一个ssh连接启动broker

#进入目录
cd /opt/rocketmq-4.9.2/bin/
#启动broker
./mqbroker -n localhost:9876

这里如果虚拟机内存不够的话可以用vim打开他的启动脚本(runbroker.sh)把Xmx和Xms参数调小一点,脚本默认的是8g我调成了2g

 因为NameServer的默认端口是9876,所以我们启动broker的时候要把这个broker注册到NameServer上面去,-n Nameserver的ip:9876

再启动一台服务器,把压缩包传上去,然后启动一个broker注册到上面启动的NameServer上面

现在,我们的RockerMQ就安装好了,下面写些java代码测试下

3.使用

创建一个maven项目

导入依赖

    <dependencies>
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>4.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-tools</artifactId>
            <version>4.9.2</version>
        </dependency>
    </dependencies>

下面是我自己写的一些测试代码,如果要生产用可能你拿去还需要自己改一下

producer

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.remoting.exception.RemotingException;

/**
 * @author Dragon
 * @version 1.0
 * @date 2022/1/23 18:52
 */

public class Producer {

    private final DefaultMQProducer defaultMQProducer;

    public Producer() {
        //创建一个生成者组
        DefaultMQProducer groupA = new DefaultMQProducer("groupA");
        //填写nameserver地址
        groupA.setNamesrvAddr("192.168.101.92:9876");
        try {
            //启动
            groupA.start();
        } catch (MQClientException e) {
            e.printStackTrace();
        }
        this.defaultMQProducer = groupA;
    }

    /**
     * 同步生产消息
     */

    public void syncProducer(Message message) {
        try {
            SendResult send = defaultMQProducer.send(message);
            System.out.println(send);
        } catch (MQClientException e) {
            e.printStackTrace();
        } catch (RemotingException e) {
            e.printStackTrace();
        } catch (MQBrokerException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 异步生产消息
     */
    public void asyncProducer(Message message) {
        try {
            defaultMQProducer.send(message, new SendCallback() {
                @Override
                public void onSuccess(SendResult sendResult) {
                    System.out.println(sendResult);
                }

                @Override
                public void onException(Throwable throwable) {
                    throwable.printStackTrace();
                }
            });
        } catch (MQClientException e) {
            e.printStackTrace();
        } catch (RemotingException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生产不要返回值的消息
     */
    public void oneWayProducer(Message message) {
        try {
            defaultMQProducer.sendOneway(message);
        } catch (MQClientException e) {
            e.printStackTrace();
        } catch (RemotingException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 给指定broker的指定topic的queue发送
     */
    public void xxx(Message message){
        MessageQueue queue=new MessageQueue(message.getTopic(),"node-01",0);
        try {
            SendResult send = defaultMQProducer.send(message, queue);
            System.out.println(send);
        } catch (MQClientException e) {
            e.printStackTrace();
        } catch (RemotingException e) {
            e.printStackTrace();
        } catch (MQBrokerException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


}

consumer

import org.apache.rocketmq.client.consumer.DefaultLitePullConsumer;
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.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.message.MessageQueue;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * @author Dragon
 * @version 1.0
 * @date 2022/1/26 22:51
 */

public class Consumer {

    public void pushConsumer(){

        DefaultMQPushConsumer consumer=new DefaultMQPushConsumer("B");
        consumer.setNamesrvAddr("192.168.101.92:9876");
        try {
            consumer.subscribe("topicA","*");
        } catch (MQClientException e) {
            e.printStackTrace();
        }
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                for (MessageExt msg : msgs) {
                    System.out.println(new String(msg.getBody()));
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        try {
            consumer.start();
        } catch (MQClientException e) {
            e.printStackTrace();
        }
        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void pullConsumer(){
        DefaultLitePullConsumer defaultLitePullConsumer = new DefaultLitePullConsumer("A");
        defaultLitePullConsumer.setNamesrvAddr("192.168.101.92:9876");

        try {
            defaultLitePullConsumer.start();
            //获取所有的queue
            Collection<MessageQueue> topicA = defaultLitePullConsumer.fetchMessageQueues("topicA");
            topicA.forEach(messageQueue -> System.out.println(messageQueue));

            Collection<MessageQueue> queue = new ArrayList<>();
            MessageQueue qu = new MessageQueue("topicA", "node-01", 0);
            queue.add(qu);
            //手动分配去哪个topic的哪个broker的哪个队列去消费消息
            defaultLitePullConsumer.assign(queue);
            //指定MessageQueue的偏移量
            defaultLitePullConsumer.seek(qu,2);
            List<MessageExt> poll = defaultLitePullConsumer.poll();

            poll.forEach(s-> {
                System.out.println(new String(s.getBody()));
            });

        } catch (MQClientException e) {
            e.printStackTrace();
        }
    }


}

admin

import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.protocol.body.TopicList;
import org.apache.rocketmq.common.protocol.route.TopicRouteData;
import org.apache.rocketmq.remoting.exception.RemotingException;
import org.apache.rocketmq.tools.admin.DefaultMQAdminExt;

import java.util.Set;

/**
 * @author Dragon
 * @version 1.0
 * @date 2022/1/26 21:14
 */

public class Admin {

    private DefaultMQAdminExt ext;

    public Admin(){
        DefaultMQAdminExt defaultMQAdminExt = new DefaultMQAdminExt();
        defaultMQAdminExt.setNamesrvAddr("192.168.101.92:9876");
        try {
            defaultMQAdminExt.start();
            this.ext=defaultMQAdminExt;
        } catch (MQClientException e) {
            e.printStackTrace();
        }
    }

    public void xxx(){
        try {
            TopicList topicList = ext.fetchAllTopicList();
            Set<String> topicList1 = topicList.getTopicList();
            topicList1.forEach(s -> {
                System.out.println(s);
            });
            System.out.println("----------------------------------------\n");
            TopicRouteData topicA = ext.examineTopicRouteInfo("topicB");
            System.out.println(topicA);
        } catch (RemotingException e) {
            e.printStackTrace();
        } catch (MQClientException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值