RocketMQ概述
概述
ApacheRocketMQ是一个低延时、高性能、可靠、海量并且灵活扩展性的分布式消息和流平台,于2017年9月25日成为Apache基金会顶级开源项目。它由4个部分组成:name servers、brokers、producers、consumers。每个部分都能水平扩展防止单点故障。

NameServer Cluster
Name servers提供轻量级的服务发现和路由功能。每个Name Server记录完整的路由信息,提供一致的读写服务并且支持快速的容量扩展。
Broker Cluster
Brokers关注消息存储通过轻量的TOPIC和QUEUE机制。它们支持Push和Pull模式,包含容错机制(2 copies or 3 copies),并且提供strong padding of peaks and capacity of accumulating hundreds of billion messages in their original time order.另外,Brokers提供灾难恢复、丰富的指标统计和警告机制,所有这些是传统的消息系统缺失的。
Producter Cluster
Producters支持分布式部署。分布式Producters通过多种负载均衡机制发送消息到Broker Cluster。发送进程支持快速失败并且低延时。
Consumer Cluster
Consumers支持Push和Pull两种分布式部署模式。也支持集群消费和消息广播。它提供实时消息订阅机制并且满足大多数消费场景。RocketMQ的网站为感兴趣的读者提供1个快速开始指南。
NameServer
NameServer是一个全功能的服务器,包括有2个功能:
- Broker管理:NameServer接受Broker cluster的注册,并且提供心跳机制检查broker是否alive
- 路由管理:每个NameServer拥有broker cluster的完整路由信息和供客户端查询的队列信息
据我们所知,RocketMQ客户端(Producer/Consumer)将会从NameServer查询队列路由信息,但是客户端是怎么发现NameServer的地址的呢?
有四种方式提供NameServer地址列表给客户端:
- 编程方式,例如
producer.setNamesrvAddr("ip:port") - Java Options,使用
rocketmq.namesrv.addr - 环境变量,使用
NAMESRV_ADDR - HTTP Endpoint
Broker Server
Broker Server是消息存储、传递、消息查询、高可用等的可靠保证。
下图显示的是Broker Server几个重要的子模块

- Remoting Module,broker的入口,处理客户端请求
- Client Manager,管理客户端(Producer/Consumer)并且维护Consumer的topic订阅
- Store Service,提供简单的API在物理磁盘存储或查询消息
- HA Service,提供master broker和slave broker之间的数据同步功能
- Index Service,通过制定的key构建消息索引和消息快速查找
其他功能
- 异步发送不处理结果,调用SendOneway方法即可,性能高,即使发失败也不会抛异常。但这种情况下,发送方对消息是否发成功全然不知,适用于量大但允许丢消息的场景。
- 异步发送,异步处理结果,producer的Send方法允许传入一个回调接口,此时,Send方法不阻塞直接返回,消息发送成功或失败时,会触发传入接口中的方法
- 广播消费,如果希望消息在同一个group的每台机器上都消费一次,可以使用广播消费。
- Tag过滤,被滤掉的消息会直接被这个consumer的group丢弃,不会再通过网络发送
- 拉模式
- 延时消息
最佳实践
Producer Group
- 同一个group的生产者一般尽量只创建一个,每次发消息时重复使用。
- 使用日志记录消息ID,便于出问题时排查。每条消息都有一个唯一的ID,消息发成功时,返回的结束里能拿到发成功的消息的ID。消费消息时,也能拿到此消息的ID。一般比较好的做法是在日志里把这个消息ID打出来,便于今后追踪问题。使用这个ID,还可以到后台查出消息内容。
- 注意消费方法是并发执行的。用户手册中有说明,消费时请留意线程安全问题。另外,一般没必要在消费方法里另外开个线程去处理消息,调整消费线程池的大小在大多数情况下就能达到目的。
- 用消息队列本身的重试机制。消息队列本身对消息的可靠消费做了一定的保证。如果消费时抛了异常,或返回了失败,消息会进入一个重试队列,定期重试消费,重试的间隔会逐次延长(1s、5s、10s、30s……最后一直是2小时)。如果你的消费方法里要做插数据库、调其它系统的接口等可能失败的操作,但又要保证消息最终要消费成功,可以利用这个特性,但要注意重试是会延时的,要留意这个延时对业务的影响。
- 如果对重复消费的情况零容忍,则一定要做幂等处理。消息系统保证消息可靠消费,但相应的,就不能保证消息不重复。大多数情况下一条消息在一个消费者组里只消费一次。但在网络抖动、消费者挂掉等异常情况下,可能会有少量的重复消费。如果重复消费会导致业务上不能容忍的错误(比如重复下单、重复扣款之类的),就一定要做去重处理。去重的方法根据业务逻辑可能各不相同,这里不能给出一个统一的方法。
- 注意发消息是可能失败抛异常的。网络故障、消息服务挂掉的情况下都会抛异常(虽然挂掉的机率是非常低的)。这时消息没发出去,也不会再重试了。如果业务对此零容忍,则需要做处理。
- 善用后台排查问题。后台可以看很多东西:消费者的在线情况、消息的消费进度、消息内容等等。很多调试问题都可以借助后台来排查
RocketMQ概述的更多相关文章
- RocketMQ 概述
Rocket 火箭 MQ的作用:同步转异步(异步解耦). 难点:如何确保消息一定被消费,而且仅消费一次. 1.消息架构:生产者.服务器.消费者.路由发现. 2.消息顺序:严格按照消息到达服务器的顺序进 ...
- RocketMQ入门(简介、特点)
简介: RocketMQ作为一款纯java.分布式.队列模型的开源消息中间件,支持事务消息.顺序消息.批量消息.定时消息.消息回溯等. 发展历程: 1. Metaq(Metamorphosis) 1. ...
- 【学习】025 RocketMQ
RocketMQ概述 RocketMQ 是一款分布式.队列模型的消息中间件,具有以下特点: 能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能 ...
- 消息中间件——rocketmq环境配置
产生原因 RocketMQ概述 RocketMQ 是一款分布式.队列模型的消息中间件,具有以下特点: 能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级 ...
- rocketmq消息存储概述
了解消息存储部分首先需要关注的几个方法,load()--Load previously stored messages.start()--Launch this message store.putMe ...
- RocketMQ在windows上安装和开发使用
1.概述 RocketMQ是alibaba公司开源的一个纯java的开源消息中间件. 2.开发测试环境搭建 到github上面rocketMQ,我选择的是alibaba-rocketmq-3.2.6. ...
- RocketMQ基本概念及原理介绍
基本概念 ProducerGroup 通常具有同样属性(处理的消息种类-topic.以及消息处理逻辑流程—分布式多个客户端)的一些producer可以归为同一个group.在事务消息机制中,如果某条发 ...
- 关于消息队列的使用----ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
一.消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,RabbitM ...
- rocketmq总结(消息的高可用、中间件选型)
rocketmq总结(消息的高可用.中间件选型) 参考: https://blog.csdn.net/meilong_whpu/article/details/76922456 http://blog ...
随机推荐
- JSP 9个内置对象
JSP内置对象(隐式对象)是JSP容器为每个页面自动实例化的一组对象,开发者可直接使用,也被称为预定义变量. JSP容器提供了9个内置对象 request // javax.servlet.http. ...
- [ES]ES集群内容灾
ES是如何实现节点容灾的? 1. ES中的index,首先会进行分片,每一个分片数据一般都会有自己的副本数据,ES分配分片的策略会保证同一个分片数据和自己的副本不会分配到同一个节点上2. 当集群中的某 ...
- No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal
No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in t ...
- 1.preparation
1)Evarobot 安装 http://wiki.ros.org/Robots/evarobot/Tutorials/indigo/Evarobot%20Installation 2)PC 安装 a ...
- EasyUI 分页 简洁代码
做分页代码,看到网上很多人实现的方法,那是各种调用,各种获取对象.我很不解,因为Easyui已经给我们了分页的具体实现,为什么有些人要画蛇添足呢. 其实真正的分页,在你的代码中,别人可能都没有注意到, ...
- jQuery Autocomplete 备忘录
之前使用过此 widget,如今再次需要,发现很多东西已经记不起来了,当然之前用的版本也不一样. 使用之前当然是先认真阅读官方的说明文档和示例,这点很重要,而不是东一块西一点的去网上瞎找资料.Opti ...
- [ASP.NET]static变量和viewstate的使用方法
在.Net平台下进行CS软件开发时,我们经常遇到以后还要用到某些变量上次修改后的值,为了简单起见,很多人都习惯用static来定义这些变量,我也是.这样非常方便,下一次调用某个函数时该变量仍然保存的是 ...
- ansible的playbook剧本
一.playbook剧本介绍 1)playbook介绍 Playbooks是Ansible的配置,部署和编排语言.它们可以描述您希望远程系统执行的策略,或一般IT流程中的一组步骤. 如果说ansibl ...
- java常用设计模式五:建造者模式
1.定义 是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 产品类:一般是一个较为复杂的对象,也就是说创建对象的 ...
- java socket之上传文件
一.功能介绍 该功能主要实现,将客户端的:F:/work/socketSample/filetemp/client/test_client.txt上传到服务端F:/work/socketSample/ ...