heima的mq实战------1

源码分析: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---

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值