RocketMQ-总结

1 篇文章 0 订阅
1 篇文章 0 订阅
RocketMQ资料
1)云栖社区: https://m.aliyun.com/yunqi
2)公众号:“阿里巴巴中间件”
 
一、Apache RocketMQ 简介
1、去官网看看
 
主页:
 
 
原文:Apache RocketMQ™ is an open source distributed messaging and streaming data platform.
译: Apache RocketMQ™是一个开源的  分布式消息  和  流数据平台
 
 
 
Low Latency:More than 99.6% response latency within 1 millisecond under high pressure.
低延迟:超过99.6%的响应延迟在高压下1毫秒。
 
Finance Oriented:High availability with tracking and auditing features.
  • 面向对象:高可用性与跟踪和审计功能。
Industry Sustainable:Trillion-level message capacity guaranteed.

行业可持续发展:Trillion-level信息保障能力。

 

Vendor Neutral:A new open distributed messaging and streaming standard since latest 4.1 version.

厂商中立的:一个新的开放分布式消息和流标准以来最新的4.1版本。

 

BigData Friendly:Batch transferring with versatile integration for flooding throughput.

大数据友好:批量传输和多功能集成洪水的吞吐量。

 

Massive Accumulation:Given sufficient disk space, accumulate messages without performance loss.

大量积累:如果有足够的磁盘空间,积累信息没有性能损失。

 

2、去GitHub看看

 
 
1)

原文:Apache RocketMQ is a distributed messaging and streaming platform with low latency, high performance and reliability, trillion-level capacity and flexible scalability.

译:Apache RocketMQ是一个具有低延迟、高性能和可靠性、万亿级容量和灵活可伸缩性的分布式消息流平台

 

2)

It offers a variety of features:

它提供了多种功能:

 

Pub/Sub messaging model

发布/订阅消息传递模型

 

Scheduled message delivery

将消息传递

 

Message retroactivity by time or offset

消息按时间或偏移量回溯

 

Log hub for streaming

串流日志集线器

 

Big data integration

大数据集成

 

Reliable FIFO and strict ordered messaging in the same queue

在同一个队列中可靠的FIFO和严格有序的消息传递

 

Efficient pull&push consumption model

高效的拉推消费模式

 

Million-level message accumulation capacity in a single queue

单个队列中的百万级消息积累容量

 

Multiple messaging protocols like JMS and OpenMessaging

多个消息传递协议,如JMS和OpenMessaging

 

Flexible distributed scale-out deployment architecture

灵活的分布式扩展部署体系结构

 

Lightning-fast batch message exchange system

闪电般的批处理消息交换系统

 

Various message filter mechanics such as SQL and Tag

各种消息过滤机制,如SQL和标记

 

Docker images for isolated testing and cloud isolated clusters

Docker映像用于隔离测试和云隔离集群

 

Feature-rich administrative dashboard for configuration, metrics and monitoring

功能丰富的管理仪表板,用于配置、度量和监视

 

二、适用场景

异步

解耦

削峰填谷

 

三、角色

1、Namesrv

    Namesrv存储着 master 和 slaer

 

2、Broker

Broker是实际存储消息的数据节点;

 

Nameserver是服务发现节点,Producer发送消息到某一个Topic,并给到某个Consumer用于消费的过程中,需要先请求Nameserver拿到这个Topic的路由信息,即Topic在哪些Broker上有,每个Broker上有哪些队列,拿到这些请求后再把消息发送到Broker中;相对的,Consumer在消费的时候,也会经历这个流程。

 

一句话总结就是不同的Group是广播订阅的,同一个Group则是负载订阅的。

 

3、Producer

 

4、Consumer

多种consumer:

pullConsumer (不常用),非实时消费,连上去,拿下来;连上去,拿下来

PushConsumer,实时消费,观察者模式

重发

定时

 

 

 

概念模型

 

存储模型

最小位点、最大位点、消费位点
 
不停写,扩容
重置位点,在线
 
新特性(暂未开放)
1、定时(时间轮)
2、bath(批量发送,批量接受。端对端)
3、过滤
 
------
rocketmq支持从master 写,从slear读
内存映射,内存满了就存硬盘
可以设置消息过期
自动清理
内存调优

 

============================安装、启动、停止============

1、安装(4.3.0版本)
参考:官网 > Quick Start : http://rocketmq.apache.org/docs/quick-start
 
1)先决条件:
64bit OS, Linux/Unix/Mac is recommended;
64bit JDK 1.8+;
Maven 3.2.x
Git
 
2)下载、安装
方式一、下载source,需要用Maven构建一下
    > unzip rocketmq-all-4.3.0-source-release.zip
    > cd rocketmq-all-4.3.0/
    > mvn -Prelease-all -DskipTests clean install -U
 
方式二、下载binary,解压即可。
 
*RocketMQ环境变量:
export ROCKETMQ_HOME=/home/fan/mq/rocketmq-all-4.2.0/distribution/target/apache-rocketmq
PATH=$JAVA_HOME/bin:$M2_HOME/bin:$ROCKETMQ_HOME/bin:$PATH
 
*修改RocketMQ使用JDK
<profile>
    <id>jdk18</id>
    <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
    </activation>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
      </properties>
</profile>
 
2、启动 和 停止
简单体验RocketMQ:启动 nameserver -> 启动 broker -> 发送消息,查看发送状态 -> 消费消息,查看接收状态。
/home/fan/live/rocketmq-all-4.3.0/distribution/bin
2.1)Start Name Server
  > nohup sh bin/mqnamesrv &
  > jps
  > tail -f ~/logs/rocketmqlogs/namesrv.log 
uploading.4e448015.gif转存失败 重新上传 取消
 
注:实际执行的runbroker.sh
2.2)Start Broker
  > nohup sh bin/mqbroker -n localhost:9876 &
  > jps
  > tail -f ~/logs/rocketmqlogs/broker.log 
uploading.4e448015.gif转存失败 重新上传 取消
 
注:实际执行的是 runserver.sh
2.3)
> sh bin/mqshutdown broker
 
 
2.4)
> sh bin/mqshutdown namesrv
 
 
*如果Name Server启动失败,需要修改配置:
vi  alibaba-rocketmq/bin/runserver.sh 
 
*如果Broker启动失败,需要修改配置
vi  alibaba-rocketmq/bin/runbroker.sh 
 
3、Send & Receive Messages
Before sending/receiving messages, we need to tell clients the location of name servers. RocketMQ provides multiple ways to achieve this. For simplicity, we use environment variable NAMESRV_ADDR
 
1)生产消息
(为了方便测试,指定环境变量 NamESRV_ADDR)
> export NAMESRV_ADDR=localhost:9876
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
 
失败了?环境变量中的jdk变为了openJDK,解决:source /etc/profile.d
 
 
修正后:
 
 
2)消费消息
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
 
 
 
=================== RocketMQ 控制台============
1、MQ控制台
源码下载地址:https://github.com/apache/rocketmq-externals
 
从 这个地址下载 整个项目代码
然后,到 /rocketmq-externals-master 的 /rocketmq-console 项目 目录下。
可以看到,当前目录,就是 mq 的 console 项目根目录。
1、打开 ./src/main/resources , 修改 application.properties 配置文件。
修改 
server.contextPath=192.168.10.27
server.port=8080
rocketmq.config.namesrvAddr=192.168.10.27:9876
 
这三条值,改为对应的 IP 和端口。
 
2、切换到 项目根目录, 在 当前目录下运行命令 mvn package 
即可 在 target 目录下,找到 对应的 jar.

3、运行
java -jar rocketmq-console-ng-1.0.0.jar
java -jar rocketmq-console-ng-1.0.0.jar --server.port=12581 --rocketmq.config.namesrvAddr=127.0.0.1:9876
 
4、访问
http://192.168.10.27:8080
 
================ Java Demo ================
DefaultMQProducer producer = new DefaultMQProducer("ProducerGroup01");
 
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroup01");
consumer.setConsumeFromWhere(ConsumeFromWhere. CONSUME_FROM_FIRST_OFFSET);//消费策略
 
1、Prodcer.java
 
 
 
 
 
package com.live.test.mq; com.live.test.mq;
import org.apache.rocketmq.client.exception.MQBrokerException; org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException; org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer; org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult; org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message; org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException; org.apache.rocketmq.remoting.exception.RemotingException;
/**
 * 生产者* 生产者
 * @author live* @author live
 **
 */*/
public class Prodcer { class Prodcer {
    public static void main(String[] args) {public static void main(String[] args) {
//      DefaultMQProducer producer = new DefaultMQProducer();      DefaultMQProducer producer = new DefaultMQProducer();
        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroup01");    DefaultMQProducer producer = new DefaultMQProducer("ProducerGroup01");
        System.out.println("创建一个 producer:" + producer);    System.out.println("创建一个 producer:" + producer);
        
        producer.setNamesrvAddr("127.0.0.1:9876");    producer.setNamesrvAddr("127.0.0.1:9876");
        System.out.println("producer 设置 Namesrv:" + producer);    System.out.println("producer 设置 Namesrv:" + producer);
        
        try {    try {
            System.out.println("启动 producer...");        System.out.println("启动 producer...");
            producer.start();        producer.start();
            System.out.println("启动 producer 成功。");        System.out.println("启动 producer 成功。");
        } catch (MQClientException e1) {    } catch (MQClientException e1) {
            e1.printStackTrace();        e1.printStackTrace();
        }    }
        
        Message msg = new Message("TopicCus", "TagCusAdd", "***Hello sxn!***".getBytes());    Message msg = new Message("TopicCus", "TagCusAdd", "***Hello sxn!***".getBytes());
        try {    try {
            SendResult result = producer.send(msg);        SendResult result = producer.send(msg);
            System.out.println(">>>发送完成。\tmsg:" + new String( msg.getBody()) + "\t,result:"+ result);        System.out.println(">>>发送完成。\tmsg:" + new String( msg.getBody()) + "\t,result:"+ result);
        } catch (MQClientException | RemotingException | MQBrokerException | InterruptedException e) {    } catch (MQClientException | RemotingException | MQBrokerException | InterruptedException e) {
            System.out.println("发送失败!");        System.out.println("发送失败!");
            e.printStackTrace();        e.printStackTrace();
        }    }
        
        producer.shutdown();    producer.shutdown();
    }}
}
 
 
 
Consumer.java
 
 
 
 
 
package com.live.test.mq; com.live.test.mq;
import java.util.List; java.util.List;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException; org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere; org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt; org.apache.rocketmq.common.message.MessageExt;
/**
 * 消费者* 消费者
 * @author live* @author live
 **
 */*/
public class Consumer { class Consumer {
    public static void main(String[] args) {public static void main(String[] args) {
        // 创建 Consumer    // 创建 Consumer
        // 需要一个 consumerGroup 名字作为构造器的参数    // 需要一个 consumerGroup 名字作为构造器的参数
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroup01");    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroup01");
        System.out.println("创建一个 Consumer:" + consumer);    System.out.println("创建一个 Consumer:" + consumer);
        // 设置 Consumer 的 Namersrv    // 设置 Consumer 的 Namersrv
        consumer.setNamesrvAddr("127.0.0.1:9876");    consumer.setNamesrvAddr("127.0.0.1:9876");
        // 设置 Consumer 的消费策略    // 设置 Consumer 的消费策略
        // CONSUME_FROM_LAST_OFFSET 默认策略,从该队列最尾开始消费,即跳过历史消息    // CONSUME_FROM_LAST_OFFSET 默认策略,从该队列最尾开始消费,即跳过历史消息
        // CONSUME_FROM_FIRST_OFFSET 从队列最开始开始消费,即历史消息(还储存在broker的)全部消费一遍    // CONSUME_FROM_FIRST_OFFSET 从队列最开始开始消费,即历史消息(还储存在broker的)全部消费一遍
        // CONSUME_FROM_TIMESTAMP    // CONSUME_FROM_TIMESTAMP
        // 从某个时间点开始消费,和setConsumeTimestamp()配合使用,默认是半个小时以前    // 从某个时间点开始消费,和setConsumeTimestamp()配合使用,默认是半个小时以前
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);    consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        // 设置 Consumer 所订阅的Topic和Tag    // 设置 Consumer 所订阅的Topic和Tag
        // *代表全部的Tag    // *代表全部的Tag
        try {    try {
            consumer.subscribe("TopicCus", "TagCusAdd");        consumer.subscribe("TopicCus", "TagCusAdd");
        } catch (MQClientException e1) {    } catch (MQClientException e1) {
            e1.printStackTrace();        e1.printStackTrace();
        }    }
        System.out.println("注册消息监听器,进行消息的逻辑处理...");    System.out.println("注册消息监听器,进行消息的逻辑处理...");
        consumer.registerMessageListener(new MessageListenerConcurrently() {    consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override        @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgList,        public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgList,
                    ConsumeConcurrentlyContext context) {                ConsumeConcurrentlyContext context) {
                for (MessageExt msg : msgList) {            for (MessageExt msg : msgList) {
                    System.out.println("<<<消费一条。\tmsg:" + new String( msg.getBody()) + "\t,当前线程:"+ Thread.currentThread().getName());                System.out.println("<<<消费一条。\tmsg:" + new String( msg.getBody()) + "\t,当前线程:"+ Thread.currentThread().getName());
                }            }
                // 返回消费状态            // 返回消费状态
                // CONSUME_SUCCESS 消费成功            // CONSUME_SUCCESS 消费成功
                // RECONSUME_LATER 消费失败,需要稍后重新消费            // RECONSUME_LATER 消费失败,需要稍后重新消费
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }        }
        });    });
        System.out.println("注册消息监听器完成。");    System.out.println("注册消息监听器完成。");
        try {    try {
            System.out.println("启动 Consumer...");        System.out.println("启动 Consumer...");
            consumer.start();        consumer.start();
            System.out.println("Consumer 启动成功。");        System.out.println("Consumer 启动成功。");
        } catch (MQClientException e) {    } catch (MQClientException e) {
            System.out.println("启动 Consumer 失败!");        System.out.println("启动 Consumer 失败!");
            e.printStackTrace();        e.printStackTrace();
        }    }
    }}
}
 
 
 
一、广播消费 集群消费
 
一、近期经典RocketMQ系列文章分享:
1、RocketMQ实战:生产环境中,autoCreateTopicEnable为什么不能设置为true
https://mp.weixin.qq.com/s/GbSlS3hi8IE0kznTynV4ZQ
 
2、RocketMQ 消息发送system busy、broker busy原因分析与解决方案
https://mp.weixin.qq.com/s/N_ttVjBpqVUA0CGrOybNLA
 
3、RocketMQ HA机制(主从同步)
https://mp.weixin.qq.com/s/QnFDFBOoI6pDZf8L2KpBDg
 
4、RocketMQ ACL使用指南
https://mp.weixin.qq.com/s/el7miaJGILP0wYjC3v3Twg
 
5、源码分析RocketMQ ACL实现机制
https://mp.weixin.qq.com/s/x2oVbT3Fj1MRJuWEHQ39nw
 
 
*代码地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值