RocketMQ之术语了解
来源:互联网 发布:下载布鲁帝同志软件 编辑:程序博客网 时间:2024/05/22 14:10
RocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点:
能够保证严格的消息顺序
提供丰富的消息拉取模式
高效的订阅者水平扩展能力
实时的消息订阅机制
亿级消息堆积能力
Metaq3.0 版本改名,产品名称改为RocketMQ
先学习几个术语:
Producer
消息生产者,负责产生消息,一般由业务系统负责产生消息。
Consumer
消息消费者,负责消费消息,一般是后台系统负责异步消费。
消息获取方式:
Push Consumer
Consumer的一种,应用通常向Consumer对象注册一个Listener接口,一旦收到消息,Consumer对象立 刻回调Listener接口方法。
Pull Consumer
Consumer的一种,应用通常主动调用Consumer的拉消息方法从Broker拉消息,主动权由应用控制。
Producer Group
一类Producer的集合名称,这类Producer通常发送一类消息,且发送逻辑一致。
Consumer Group
一类Consumer的集合名称,这类Consumer通常消费一类消息,且消费逻辑一致。
Broker
消息中转角色,负责存储消息,转发消息,一般也称为Server。在JMS规范中称为Provider。
消费方式:
广播消费
一条消息被多个Consumer消费,即使这些Consumer属于同一个Consumer Group,消息也会被Consumer Group中的每个Consumer都消费一次,广播消费中的Consumer Group概念可以认为在消息划分方面无意义。
在CORBA Notification规范中,消费方式都属于广播消费。
在JMS规范中,相当于JMS publish/subscribe model
集群消费
一个Consumer Group中的Consumer实例平均分摊消费消息。例如某个Topic有9条消息,其中一个Consumer Group有3个实例(可能是3个进程,或者3台机器),那么每个实例只消费其中的3条消息。
在CORBA Notification规范中,无此消费方式。
在JMS规范中,JMS point-to-point model与之类似,但是RocketMQ的集群消费功能大等于PTP模型。因为RocketMQ单个Consumer Group内的消费者类似于PTP,但是一个Topic/Queue可以被多个Consumer Group消费。
消息顺序:
顺序消息
消费消息的顺序要同发送消息的顺序一致,在RocketMQ中,主要指的是局部顺序,即一类消息为满足顺序性,必须Producer单线程顺序发送,且发送到同一个队列,这样Consumer就可以按照Producer发送的顺序去消费消息。(可以业务处理,将特定的业务处理到同一队列中,比如:根据id/10为条件判断)
普通顺序消息
顺序消息的一种,正常情况下可以保证完全的顺序消息,但是一旦发生通信异常,Broker重启,由于队列总数发生变化,哈希取模后定位的队列会变化,产生短暂的消息顺序不一致。
如果业务能容忍在集群异常情况(如某个Broker宕机或者重启)下,消息短暂的乱序,使用普通顺序方式比较合适。
严格顺序消息
顺序消息的一种,无论正常异常情况都能保证顺序,但是牺牲了分布式Failover特性,即Broker集群中只要有一台机器不可用,则整个集群都不可用,服务可用性大大降低。
如果服务器部署为同步双写模式,此缺陷可通过备机自动切换为主避免,不过仍然会存在几分钟的服务不可用。(依赖同步双写,主备自动切换,自动切换功能目前还未实现)
目前已知的应用只有数据库binlog同步强依赖严格顺序消息,其他应用绝大部分都可以容忍短暂乱序,推荐使用普通的顺序消息。
Message Queue
在RocketMQ中,所有消息队列都是持久化,长度无限的数据结构,所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用Offset来访问,offset为java long类型,64位,理论上在100年内不会溢出,所以认为是长度无限,另外队列中只保存最近几天的数据,之前的数据会按照过期时间来删除。
也可以认为Message Queue是一个长度无限的数组,offset就是下标。
offset是消息队列的下标(所以在代码中使用maxOffset-curOffset就可以知道消息堆积量),代码如下:
public class TestConsumeMsg { public static void main(String[] args) throws InterruptedException, MQClientException { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("groupName"); consumer.setNamesrvAddr("ip:port"); consumer.setConsumeMessageBatchMaxSize(10); /** * 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费<br> * 如果非第一次启动,那么按照上次消费的位置继续消费 */ consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); consumer.subscribe("topicName", "*"); consumer.registerMessageListener(new MessageListenerConcurrently() { public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {// 获取消息对象,记录信息:获取当前消息的堆积量-difflong offset = msgs.get(0).getQueueOffset();String maxOffset = msgs.get(0).getProperty(MessageConst.PROPERTY_MAX_OFFSET);long diff = Long.parseLong(maxOffset) - offset;System.out.println("【" + msgs.get(0).getTopic() + "】消息堆积量:" + diff); try { System.out.println("msgs的长度" + msgs.size() + context.toString()); System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + msgs); } catch (Exception e) { e.printStackTrace(); return ConsumeConcurrentlyStatus.RECONSUME_LATER; } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer.start(); System.out.println("Consumer Started."); }}
阅读全文
0 0
- RocketMQ之术语了解
- RocketMQ入门(1.术语)
- 一步一步学DataGuard(2)基础之术语再了解大概
- rocketmq之事物消息
- 了解的几个Microsoft术语
- [转]新手入门了解RFID术语
- rocketmq介绍,先了解rmq,后研究
- RocketMQ原理(2)——核心概念及术语
- RocketMQ源码分析之NameServer
- RocketMQ 实战之快速入门
- RocketMQ 实战之快速入门
- RocketMQ
- Rocketmq
- RocketMQ
- RocketMQ
- RocketMQ
- RocketMQ
- rocketmq
- 简述 Docker比你想象的简单
- 买电脑要看哪些参数?(个人拙见)
- c++数据结构的实现
- HRegionServer的详解
- 为什么JAVA文件中只能含有一个Public类
- RocketMQ之术语了解
- 030-Java-21
- sklearn与GBDT入门案例
- FreeLine实现AndroidStudio秒级编译
- 微信对接token验证失败的问题
- openvpn注销用户证书
- SDUT-数据结构实验之图论七:驴友计划
- html5+nodejs多文件上传
- Android Studio 开发调试简介