rocket MQ

最近发现了一个比较好的学习网站和工具下载网站,相当便宜,感兴趣的同学请移步:

昂炎数据(www.ayshuju.com)

各个MQ的优劣

kafka

优点:吞吐量高,量级是每秒几十万的QPS。

缺点:功能单一,丢数据(因为消息是存在了磁盘缓冲区)

使用场景:一般使用kafka做日志的采集

Rabbit MQ

优点:数据不丢失,保证高可用。高级功能(死信队列,消息重试)

缺点:QPS不高,万级,开发语言是erlang

RocketMQ

优点:单机十万,集群好部署,高级功能(),数据不会丢失

缺点:没有缺点(国产,要多夸夸)

RocketMQ

1、NameServer

担任职责:负责管理Topic和broker的映射关系,支持集群部署,以达到高可用的目的

其实NameServer更像一个路由中心,生产者从这里获取到broker的信息,然后和broker直连。消费者从Name server获取broker信息,和broker直连

broker呢,在name server注册信息,然后每隔30s发送心跳去更新topic信息。

有可视化界面可以监控生产者,消费者,broker,topic情况

2、broker

Topic:主题,顾名思义,通过Topic区分消息的种类,每个Topic可以有多个队列

担任职责:创建Topic,负责接受消息,推送消息。队列的载体

master broker

slave broker

上面两个概念类似于 数据库的主从库。

broker启动后会向所有Name Server注册,每隔30s向 NameServer发送心跳,心跳的内容有自己所有的topic 和 broker 的映射关系。name server每隔10s检查这些心跳信息,超过120s的就认为是挂掉了。这里的心跳都是长链接

master如何同步信息给slave?

这里其实是slave去master定期拉消息的

既然类似于数据库的主从库,会不会是读写分离的呢?

这个不一定,为什么这么说呢,当消费者去读取消息的时候,master 如果负载比较高了,会建议消费者下次去slave 读消息。

如果master挂掉了怎么办?

4.5以前master挂掉了,rocketmq是没办法自己切换到slave broker读取消息的,需要手动切换。

4.5以后,基于dledger技术可以进行选举,推举一个slave成master。

topic'中的数据如何在broker上存储的?

分布式存储,假如有2个master,topic中有1000万条消息,每个master平均分配500万条消息,这个在创建topic时就已经约定好,分布存储在那几个broker上了。

3、生产者

生产者定期去NameServer 获取所有broker的信息,生产者存下这些信息后,就直接和broker进行通信。

生产者发送消息三种方式:

1、同步

public static DefaultMQproducer producer  = new DefaultMQProducer("");

static{

producer.setNamesrvAddr("");

producer.start();

}

producer.send(msg);

第二种:异步

设置异步发送失败的重试次数

producer.setRetryTimesWhenSendAsyncFailed(0)

producer.send(message,new SendCallback(){

public void onSuccess(SendReslt sendResult){

}

});

第三步:单向消息

producer.sendOneWay(msg);

部署MQ

1、下载dledger

git clone https://github.com/openmessaging/openmessaging-storage-dledger.git

cd openmessaging-storage-dledger

mvn clean install -DskipTest

2、下载rocket mq

git clone  https://github.com/apache/rocketmq.git

cd rocketmq

git checkout -b store_with_dledger origin/store_with_dledger

mvn -Prelease-all -DskipTest clean install -U

cd distribution/target/apache-rocketmq

在这个目录中发现三个文件,1个是bin/runserver.sh,一个是bin/runbroker.sh,另一个是bin/tools.sh

在里面找到 JAVA_HOME = $HOME/jdk/java ,把jdk地址切换成自己的jdk目录

rocket mq的集群启动

sh bin/dledger/fast-try.sh start 

查看集群状态

sh bin/mqadmin clusterList -n 127.0.0.1:9876

启动name server:

nohup sh mqnamesrv & 

启动broker

nohup sh bin/mqbroker -c conf/dledger/broker -n0.conf &

上面conf是n0机器的conf,conf里面的参数

# 集群的名字

brokerClusterName = Raftcluster

# broker的名字(这里说的是master和slave,他们是一组的)

brokerName = 

# 顾名思义,监听的端口号

listenPort

# name server的地址

namesrvAddr=

# 存放broker数据的地方

storePathRootDir = 

storePathCommitLog=

#启用dleger

enableDlegerCommitLog = true

#这个建议和broker保持一致即可

dlegerGroup = 

#这里几个broker一组就写几个 

dlegerPeers = n0-127.0.0.1:40911;n1-127.0.0.1:40922

#发送消息的线程数量

sendMessageThreadPoolNums = 24

#这个代表该broker在组里的id,这个得和dlegerPeers上的一致

dlegerSelfid = n0

问题:

1、mq超时如何处理

2、mq重复消费如何处理

推荐博客:

MetaQ中间件原理 - 简书

rocketmq-常见问题总结(消息的顺序、重复、消费模式) - xuwc - 博客园

rocketMq - rebalance介绍 - 简书

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值