- 什么是MQ
消息队列,消息是在不同进程之间进行的传递的消息(通过RPC)
-
MQ的作用主要有三个:
-
解耦
-
减少服务与服务之间的阿依赖关系,提高系统整体之间的稳定性以及可扩展性。
-
解耦可以实现数据分发,生产者发送一个消息之后,可以由多个消费者进行消费,并且消费着增加或者减少对生产者没有影响。
-
异步
-
MQ在客户端和服务端之间会进行一个消息的传递,极大的提高了系统的吞吐量,极大提高了胸痛的响应速度
- 削峰
MQ暂存高峰时期产生的消息,下游以稳定的速度来处理前端海量的请求,处理突发的流量---秒杀,直播带货
RocketMQ的特点
消息丢失很少,高性能,高吞吐量,内部源码JAVA--扩展性比较好,适用于金融场景
RocketMq服务启动
RocketMQ启动服务的时候是有两个服务:NameServer,Broker----两个服务协调使用
jdk8以上默认使用的垃圾回收器就是G1,我们可以强制让它使用CMS
nohup bin/mqbroker & //后台挂起启动
less nphup.out
vi ~/.bash_profile //进入这个文件修改环境变量,修改NameServer的地址
关掉进程使用命令bin/mqshutdown 后面待两个参数,broker | namesrv
bin/tools.sh //tools工具提供一个Java 环境执行客户端的代码,在lib目录下面
通过上面的命令,执行客户端的代码,往rocketmq中发送消息,之后可以启动一个消费者消费消息
RocketMq可视化工具Dasjhbord下载编译
可视化的服务需要做的事情就是只当NameServer地址
分布式环境下构建RocketMQ
所有的Broker其实是类似于微服务的方式进行构建的,而微服务需要住粗中心,因此在RoketMq中只需要关心注册中新NameServer即可。NameSever相当于注册中心,Broker需要注册到其中,因此搭建集群前期需要进行分配。
broker中,0就代表Master,大于0就代表slave,在dashbord中每一个NameServer都是全的,指定一个或者多个NameServer都是一样的。dashborde中如果需要指定多个NameServer的话,在yml文件中配一个集合
rocketmq:
config:
namesrvAddrs:
- worker1:9876
- worker2:9876
- worker3:9876
kafka消息丢失:一旦有主从切换,如果在主从切换的过程中还要做消息同步那么必然有消息丢失,rocketMq优化了这个问题,在关闭主节点之后下面的slave节点不做变更,不做主从切换,但是rocketmq这样做虽然保证了安全性,但是服务可用性降低了。因此RocketMq在4.0版本之后构建了Dleger集群实现高可用-----让它具备自动选主的功能
Raft算法是一种从多数选取一个的算法,只有一个的Raft算法不会生效。
broker进行设计消息的读写,处理消息的请求,NameServe负责对broker进行注册。Producer和Consumer只需要跟NameServe打交道不需要知道Broker在哪。