RocketMQ-
第一课
下载源码并编译安装
这个broker对应的jar包启动时,传入到启动方法中的JVM参数
可以看到默认broker的最大内存和最小内存就是8G,如果虚拟机的内存不足8G,那么./mqBroker启动broker就会报错。所以需要把这几个参数值改小一点
提示找不到node-01这个主机名对应的ip地址
默认不加参数,就是启动broker,并直接在本机中找nameserver进行注册,我们也可以在启动时制定往哪台nameserver上连接
测试发送和接收消息
数据发送失败,提示找不到这个topic(就是因为当前要发送消息的broker,没有注册到nameserver上去)
通过启动broker,并注册到指定的nameserver后
此时,client端发送数据就成功了,可以看到发送的数据的topic就是TopicTest
消费者消费消息
rocketmq-console
像rocketmq-4.6.1-master这个里面就有pom文件,rocketmq-4.6.1-master目录下有namesrv、brokker、client、等等,master目录中有pom文件,所以这就是一个聚合项目,可以整个使用一次mvn命令进行编译
这里编译完成以后,是生成一个springboot框架的控制台项目jar包,我们需要通过jar -jar来启动这个控制台项目
正常java项目打包出来就是jar包,我们需要通过jar -jar来启动项目,就如当前的rocketmq-console项目,而上面的rocketmq-master可以通过./mqbroker启动项目,是因为写了runborker.sh的shell脚本文件,runborker.sh的shell脚本文件中就配置了很多JVM的启动参数等
这就是这个springboot项目的配置文件
或者,因为这是一个springboot项目,所以我们可以在jar -jar启动springboot项目的jar,在后面跟上一些参数
这个springboot写的控制台项目就启动起来了
可以看到有broker TOP 10的展示,说明RocketMQ生来就是为了多集群多broker,大数据量的存储而生的
整体架构
nameserver是无状态的(主要是为了高可用),也就是它里面什么属性、状态都不记录,所有的nameserver都是对等的,都干一模一样的事情,多台nameserver中缺了哪台都无所谓
producer只能连master,consumer既可以连master、又可以连slave进行消费
zk,没有自己写的nameserver的性能高。nameserver使用的是CAP中的AP,多个nameserver之间是不保证一致性的
dubbo、springcloud、rocketMQ的producer都是客户端负载均衡的典型,客户端侧缓存服务列表,自己选择负载均衡算法,快速失败以后,可以快速的发起重试调用,追求速度
Nginx、LVS这是服务端负载均衡的典型
Linux服务器时间校准
第二课
消息发送
同步发送
日常使用尽量就选这种发送方式,尽量看一下每次发送的SendResult是不是发送成功了
批量同步发送
如果不执行shutdown,那么producer会和broker一直建立长连接不关闭,producer会一直保持运行
批量发送的消息总量,尽量不要大于1M
异步消息发送
异步发送时,不能随便shutdown,因为无法确认异步发送的回调是什么时候来的
可以看到是,先停机、然后异步发送的回调才回来,并执行onException()方法
消费消费
默认就是集群消费模式,就是集群中有一个消费者消费成功就OK了
broker把一条消息push给了消费者A,消费者需要给broker回送CONSUME_SUCCESS或者RECONSUME_LATER这样的ACK确认,如果broker长时间没有收到这条消息对应从消费者A回来的ACK,那么broker可能会把这条消息重新投递给消费者B、当然也可能还是投给消费者A
广播消息
broker会给每个消费者都投递一次,每个消费者能不能接收到,就看网络情况了。只有集群消费模式,消费进度才会在broker端维护
消息消费状态
通过控制台可以看到某个topic下的某条消息的消费状态,并且是集群消费模式下,是整个xxoocsm集群中有一台消费者消费了这条消息,那么这条消息的消费状态,就会被设置为已消费
消费过滤
如果消费组xxoocsm,订阅的是topicA的tag1,但是当前broker发过来的是topicA的tag1消息,那么从消费组xxoocsm看来,topicA的tag1消息的状态就是已消费但被过滤(客户端过滤模式)
同一个消费组,必须是订阅的topic,并订阅相同的tag