消息中间件-RocketMQ

        RocketMQ是阿里巴巴开源的消息分布中间件,在阿里内部使用非常更广泛,已经经过了“双11”这种万亿级的应用场景考验。

1.安装

        下载地址:http://rocketmq.apache.org/release_notes/release-notes-4.4.0/

        下载完成后解压缩安装包到指定目录。

2.配置

           (1)环境变量:ROCKETMQ_HOME

              15cc86086691442bb67803f7f0e9f1e0.png

           (2)Path

              9c392ee87366476887da013e1fe6cb32.png

3.启动

          切换到当前下载RocketMQ的bin目录下

        (1)启动NameServer ---> start mqnamesrv.cmd

2a3aea30ac1d4813b6176b516b2a5405.png

              7300e1a85d5b41f6a6cd98004311fe5f.png

        (2)启动Broker --->   start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true

91f08c10361a4758b1e988029b56fbd8.png

4.RocketMQ的架构及概念

        看下面这张图

        26ce0840bfc043a2a063417689cdd66b.png

 

        RocketMQ整体分为4个角色,NameServer、Broker、Producer、Consumer、

        Broker:为RocketMQ的核心,负责消息的接受,存储,投递等功能。

        NameServer:消息队列的协商者,Broker向它注册路由信息,同时Producer和Consumer向其获取路由信息。

        Producer:消息的生产者,需要从NameServer获取Borker信息,然后与Broker建立连接,向Broker发送消息。

        Consumer:消息的消费者,需要从NameServer获取Broker信息,然后与Broker建立连接,从Broker获取消息。

        另外还包括别的组件,

        Topic:用来区分不同的消息类型,发送和接收消息前都要先创建Topic,针对Topic来发送和接收消息。

        Message Queue:消息队列,一个Topic可以设置一个或多个MessageQueue,这样消息就可以并行往各个Message Queue发送消息,消费者也可以并行的从多个Message Queue读取消息,提高性能和吞吐量。

        Message:消息的载体。

5.消息发送和接收(应用)

       搭建好SpringBoot项目后,先导入RocketMQ所需的依赖:

 <!--MQ-->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>4.4.0</version>
        </dependency>

5.1 同步发送        

        同步发送方式比较可靠,应用也比较广泛,比如:重要的消息通知,短信通知。

消息发送方:

//发送同步消息
public class RocketMQSendTest1 {
    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
        //1.创建消息生产者,指定生产者所属的组名
        DefaultMQProducer producer = new DefaultMQProducer("myproducer-group");
        //2.指定Nameserver地址
        producer.setNamesrvAddr("127.0.0.1:9876");
        //3.启动生产者
        producer.start();
        for (int i = 0; i < 10; i++) {
            Message message = new Message("myTopic", "myTag", ("十行代码九个错误八个警告竟敢说七日精通六天学会五湖四海也不见如此三心二意之程序简直一等下流" + i).getBytes());
            //发送消息
            SendResult sendResult = producer.send(message);
            System.out.println(sendResult);
        }

        //关闭生产者
        producer.shutdown();
    }
}

消息接收方:

//接收消息
public class RocketMQReceiveTest1 {
    public static void main(String[] args) throws MQClientException {
        //创建消息消费者。指定消费者所属的组名
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("myconsumer-group");
        //指定Nameserver地址
        consumer.setNamesrvAddr("127.0.0.1:9876");
        //指定消费者订阅的主题和标签
        consumer.subscribe("myTopic", "*");

        //设置回调函数,编写处理消息的方法
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                System.out.println("获取到的消费数据:" + list);
                System.out.println(new String(list.get(0).getBody()));
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });

        //启动消息消费者
        consumer.start();
        System.out.println("Consumer Starting.");
    }
}

        启动时,切记先启动消费者(接收方),再启动生产者(发送方)。

        启动测试,同步发送消息结果: 

        ff8315dd84b94c708fb27135329444ed.png

5.2 异步消息

        异步消息通常用在对响应时间敏感的业务场景,即发送端不能容忍长时间地等待Broker的响应。

发送方:

//发送异步消息
//异步消息比较浪费性能,经常会失败,所以多发送几次并且让线程休眠几秒
public class RocketMQSendTest2 {

    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException {
        //1.创建消息生产者,指定生产者所属的组名
        DefaultMQProducer producer = new DefaultMQProducer("myproducer-group");
        //2.设置NameServer地址
        producer.setNamesrvAddr("127.0.0.1:9876");
        //3.启动生产者
        producer.start();
        for (int i = 0; i < 10; i++) {
            //4.创建消息对象,制定主题、标签、消息体
            Message message = new Message("myTopic", "myTag2", ("十行代码九个错误八个警告竟敢说七日精通六天学会五湖四海也不见如此三心二意之程序简直一等下流").getBytes());
            //5.发送消息
            producer.send(message, new SendCallback() {
                @Override
                public void onSuccess(SendResult sendResult) {
                    System.out.println("发送成功:" + sendResult);
                }

                @Override
                public void onException(Throwable e) {
                    System.out.println("发送异常:" + e);
                }
            });

            //休眠
            TimeUnit.SECONDS.sleep(3);
        }

        //6.关闭生产者
        producer.shutdown();

    }
}

接收方:

public class RocketMQReceiveTest2 {
    public static void main(String[] args) throws MQClientException {
        //1.创建消息消费者,指定消费者所属的组名
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("myconsumer-group");

        //2.指定Nameserver地址
        consumer.setNamesrvAddr("127.0.0.1:9876");
        //3.指定消费者订阅的主题和标签
        consumer.subscribe("myTopic", "*");
        consumer.setMessageModel(MessageModel.BROADCASTING);
        //4.设置回调函数,编写处理请求的方法
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {

                System.out.println(new String(list.get(0).getBody()));
                //返回消费状态
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        //5.启动消息消费者
        consumer.start();
        System.out.println("Consumer Starting.");

    }
}

启动测试,异步发送消息结果: 

04a1bcc45c5e4302888c4f16a0340ef5.png

5.3 单行发送消息

      该方式用在不关注发送结果的场景,比如日志发送。

//单行发送消息
public class RocketMQSendTest3 {
    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
        DefaultMQProducer producer = new DefaultMQProducer("myproducer-group");
        producer.setNamesrvAddr("127.0.0.1:9876");
        producer.start();
        for (int i = 0; i < 10; i++) {
            Message message = new Message("myTopic", "myTag3", ("芜湖").getBytes());
            producer.sendOneway(message);

            TimeUnit.SECONDS.sleep(3);
        }
        producer.shutdown();
    }

}

启动两个消费者接收10条消息,结果如下:

4ac62d7e77994809babf36bd1e0b13bf.png

c4890f8db72d4ebe905bd574a3471b09.png

存在消息丢失的情况。

以上就是对RocketMQ的初步认识啦!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值