RocketMQ是一款消息中间件软件,个别时候也可以作为缓存数据库使用(如果你的BOSS不介意的话)。
RocketMQ前身是Alibaba的metaq,内部孵化几个版本之后重构而成(metaq3.0),目前已经是Apache基金会的顶级项目。
RocketMQ根据淘宝的业务背景,并借鉴kafka的设计理念,力争解决分布式事务消息及消息堆积问题。
RocketMQ处理解决事务堆积问题之外,还能解决应用分布式部署的问题,生产者和消费者完全解耦。
RocketMQ 适合java开发者,当然现在社区也很努力在支持其他语言和场景 例如spark python,大家可以在external项目中找到,目前rocketmq-externals-master显示支持的列表如下
l rocketmq-console
l rocketmq-cpp
l rocketmq-docker
l rocketmq-flink
l rocketmq-flume
l rocketmq-go
l rocketmq-jms
l rocketmq-mysql
l rocketmq-php
l rocketmq-redis
l rocketmq-spark
RocketMQ 使用的业务场景包括:日志处理、消息削峰、秒杀系统、应用解耦、异步消息。
不适用的场景包括:消息网关、数据清洗
NameServer:集群监控用,当节点异常时可提供恢复或者异常处理服务,可以看做进程体系里面的守护进程
Broker:消息存储,可看做数据库。
Producer:消息生产者,参考生产者消费者模型。
Consumer:消息消费者,参考生产者消费者模型。
Topic:消息归类用,标识集群的一类消息,通常和TAG一起用
TAG:用于在同一topic下对消息进行分类过滤
RocketMQ基于java语言开发,运行在jvm虚拟机上,一般官方推荐最低分配内存1G 存储空间按照3天的一般消息量来算可以预留
1K*1000*60*24*3*4=17280*1M=17G(消息大小*每秒量*分钟*小时*天数*队列数)
其他的是否需要考虑呢?比如log空间预留10G 因此 大约30G够用了
按上个问题所述RocketMQ 可分为单例版部署和集群部署 ,集群部署时 也可以用虚拟机,举例来说 M-A和M-B是两台机器,M-A和M-B可用互为Broker的主备
NameServ部署在这两台机器上,生产者和消费者各N台机器或者同一台机器跑多个都允许。
在用RocketMQ 开发之前,需要了解一些开发相关的知识,例如java、jvm、shell、maven、git等。
开源版本的RocketMQ是没有保证消息一致性的,需要自己结合实际业务处理
RocketMQ支撑有序消息。
消息包含 普通、顺序、事务,因此单纯说消息都有序是不准确的。
RocketMQ底层采用Netty框架发送消息Netty是一款很友好的通信中间件,可支持阻塞IO以及NIO通信模型。
在rocketmq-store中DefaultMessageStore具有消息持久化和宕机恢复的功能,
消息持久化是定时任务,定期对消息进行保存以及过期清理。
系统启动时检查是否存在abort文件,不存在则正常启动,存在则根据文件恢复
Zrocketmq中,存储的文件实体MappedFile 以 CopyOnWriteArrayList的形式记录。
几种文件形式:
Consumequeue、consumequeue_ext、Index、checkpoint、Abort、lock、
config.delayOffset.json、transaction.statetable
文件的加载、消息的提交和缓存由CommitLog调用MappedFile完成
遇到了一个小问题:CommitLog中MESSAGE_MAGIC_CODE和BLANK_MAGIC_CODE 有什么作用?