源码分析:https://zhuanlan.zhihu.com/p/58728454
实战之前的热身:
producer只与master建立长连接,发心跳给master,master发现producer异常就关闭连接。
------
惯例,代码:
资料:
文档:
这个文档一定要看的:
控制台等软件,这里打包jar包:
---
安装:
下载这个版本就不用安装依赖了。
修改的参数:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
notwpad查看linux的文件:
--------------------------------------------------------------------
异步 削峰 解耦 数据分发
broker和nameServer:每个Broker与集群中的所有的nameServer建立长连接,定时注册topic信息到所有的nameServer。
producer与nameServer的其中的一个节点建立长连接,定时拉取路由信息。和提供topic服务的broker建立长连接(master),向broker(master)发送心跳。
consumer与namseServer其中一个节点建立长连接,定时拉取路由信息,和提供topic服务的broker(master和slave)建立长连接,向broker(master,slave)发送和心跳。
---01-11---
具体的配置hosts文件:
# nameserver
192.168.244.128 rocketmq-nameserver1
192.168.244.129 rocketmq-nameserver2
# broker
192.168.244.128 rocketmq-master1
192.168.244.128 rocketmq-slave2
192.168.244.129 rocketmq-master2
192.168.244.129 rocketmq-slave1
配置下环境变量:
路径:cd /usr/local/apps/rocketmq-all-4.4.0/distribution/target/apache-rocketmq
同步的
配置master1和slave2
配置master2和slave1
注意:对外监听的端口号是一定不可以重复的。
启动:
路径:cd /usr/local/apps/
nohup java -jar rocketmq-console-ng-1.0.1.jar
-
路径:cd /usr/local/apps/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/bin
nohup sh mqnamesrv &
master1的启动:nohup sh mqbroker -c ../conf/2m-2s-sync/broker-a.properties &
slave2的启动:nohup sh mqbroker -c ../conf/2m-2s-sync/broker-b-s.properties &
master2的启动:nohup sh mqbroker -c ../conf/2m-2s-sync/broker-b.properties &
slave1的启动:nohup sh mqbroker -c ../conf/2m-2s-sync/broker-a-s.properties &
-
路径:
cd 2m-2s-sync/
commitlog consumequeue index
---
mkdir /usr/local/rocketmq/store
mkdir /usr/local/rocketmq/store/commitlog
mkdir /usr/local/rocketmq/store/consumequeue
mkdir /usr/local/rocketmq/store/index
mkdir /usr/local/rocketmq/storeslave
mkdir /usr/local/rocketmq/storeslave/commitlog
mkdir /usr/local/rocketmq/storeslave/consumequeue
mkdir /usr/local/rocketmq/storeslave/index
---
监控器:
修改下配置文件:
虚拟机文件的地址
访问地址:http://192.168.244.128:8080/#/cluster
---12-17---
代码:
集群的地址:192.168.244.128:9876;192.168.244.129:9876
注意此时是不能访问的,要加入一句话:
普通的消息消费:
发送同步消息:
一个重要的知识点,如果两个消费者不在一个消费者组合的话,那么他们同时消费一个主题的话,会分别消费掉这个主题的全部信息,而不是负载均衡,相当于广播。
发送异步消息:
发送单向消息
消息消费的基本流程:
广播模式和集群模式:
这个反了。
默认是集群的负载均衡。
疑问:我们试验下不在一个消费者组:
集群模式不在一个消费者组合的话每个消费者组都消费一次消息。
顺序消息:
保证局部消息的顺序消费就可以了。
就是保证张三和李四的消费是有序的。
思路:张三的步骤都放在一个队列里面,消费的话对一个队列是单线程的消费。
顺序消息的消费者:
看下控制台输出的线程名称。
---
消费:
同一个订单是同一个线程。
空间不足的错误:https://www.cnblogs.com/shenrong/p/12670555.html
---
延时消息:
---
批量消息:
---
消息的过滤:tag和sql。
、
---
事务消息:
使用:
package com.itheima.mq.rocketmq.transaction;
import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.client.producer.*;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;
import java.util.concurrent.TimeUnit;
/**
* 发送同步消息
*/
public class Producer {
public static void main(String[] args) throws Exception {
//1.创建消息生产者producer,并制定生产者组名
TransactionMQProducer producer = new TransactionMQProducer("group5");
//2.指定Nameserver地址
producer.setNamesrvAddr("192.168.244.128:9876;192.168.244.129:9876");
//添加事务监听器
producer.setTransactionListener(new TransactionListener() {
/**
* 在该方法中执行本地事务
* @param msg
* @param arg
* @return
*/
@Override
public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
if (StringUtils.equals("TAGA", msg.getTags())) {
return LocalTransactionState.COMMIT_MESSAGE;
} else if (StringUtils.equals("TAGB", msg.getTags())) {
return LocalTransactionState.ROLLBACK_MESSAGE;
} else if (StringUtils.equals("TAGC", msg.getTags())) {
return LocalTransactionState.UNKNOW;
}
return LocalTransactionState.UNKNOW;
}
/**
* 该方法时MQ进行消息事务状态回查
* @param msg
* @return
*/
@Override
public LocalTransactionState checkLocalTransaction(MessageExt msg) {
System.out.println("消息的Tag:" + msg.getTags());
return LocalTransactionState.COMMIT_MESSAGE;
}
});
//3.启动producer
producer.start();
String[] tags = {"TAGA", "TAGB", "TAGC"};
for (int i = 0; i < 3; i++) {
//4.创建消息对象,指定主题Topic、Tag和消息体
/**
* 参数一:消息主题Topic
* 参数二:消息Tag
* 参数三:消息内容
*/
Message msg = new Message("TransactionTopic", tags[i], ("Hello World" + i).getBytes());
//5.发送消息 null标识不针对某个消息进行事务控制 而是所有的消息都是事务的
SendResult result = producer.sendMessageInTransaction(msg, null);
//发送状态
SendStatus status = result.getSendStatus();
System.out.println("发送结果:" + result);
//线程睡1秒
TimeUnit.SECONDS.sleep(2);
}
//6.关闭生产者producer
//producer.shutdown();
}
}
---18-34---