最近发现了一个比较好的学习网站和工具下载网站,相当便宜,感兴趣的同学请移步:
昂炎数据(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重复消费如何处理
推荐博客: