- 面向对象:高可用性与跟踪和审计功能。
行业可持续发展:Trillion-level信息保障能力。
Vendor Neutral:A new open distributed messaging and streaming standard since latest 4.1 version.
厂商中立的:一个新的开放分布式消息和流标准以来最新的4.1版本。
BigData Friendly:Batch transferring with versatile integration for flooding throughput.
大数据友好:批量传输和多功能集成洪水的吞吐量。
Massive Accumulation:Given sufficient disk space, accumulate messages without performance loss.
大量积累:如果有足够的磁盘空间,积累信息没有性能损失。
2、去GitHub看看
原文:Apache RocketMQ is a distributed messaging and streaming platform with low latency, high performance and reliability, trillion-level capacity and flexible scalability.
译:Apache RocketMQ是一个具有低延迟、高性能和可靠性、万亿级容量和灵活可伸缩性的分布式消息和流平台。
2)
It offers a variety of features:
它提供了多种功能:
Pub/Sub messaging model
发布/订阅消息传递模型
Scheduled message delivery
将消息传递
Message retroactivity by time or offset
消息按时间或偏移量回溯
Log hub for streaming
串流日志集线器
Big data integration
大数据集成
Reliable FIFO and strict ordered messaging in the same queue
在同一个队列中可靠的FIFO和严格有序的消息传递
Efficient pull&push consumption model
高效的拉推消费模式
Million-level message accumulation capacity in a single queue
单个队列中的百万级消息积累容量
Multiple messaging protocols like JMS and OpenMessaging
多个消息传递协议,如JMS和OpenMessaging
Flexible distributed scale-out deployment architecture
灵活的分布式扩展部署体系结构
Lightning-fast batch message exchange system
闪电般的批处理消息交换系统
Various message filter mechanics such as SQL and Tag
各种消息过滤机制,如SQL和标记
Docker images for isolated testing and cloud isolated clusters
Docker映像用于隔离测试和云隔离集群
Feature-rich administrative dashboard for configuration, metrics and monitoring
功能丰富的管理仪表板,用于配置、度量和监视
二、适用场景
异步
解耦
削峰填谷
三、角色
1、Namesrv
Namesrv存储着 master 和 slaer
2、Broker
Broker是实际存储消息的数据节点;
Nameserver是服务发现节点,Producer发送消息到某一个Topic,并给到某个Consumer用于消费的过程中,需要先请求Nameserver拿到这个Topic的路由信息,即Topic在哪些Broker上有,每个Broker上有哪些队列,拿到这些请求后再把消息发送到Broker中;相对的,Consumer在消费的时候,也会经历这个流程。
一句话总结就是不同的Group是广播订阅的,同一个Group则是负载订阅的。
3、Producer
4、Consumer
多种consumer:
pullConsumer (不常用),非实时消费,连上去,拿下来;连上去,拿下来
PushConsumer,实时消费,观察者模式
重发
定时
概念模型
存储模型
============================安装、启动、停止============
64bit OS, Linux/Unix/Mac is recommended;64bit JDK 1.8+;Maven 3.2.xGit
3、运行
package com.live.test.mq;
com.live.test.mq;
import org.apache.rocketmq.client.exception.MQBrokerException;
org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;
org.apache.rocketmq.remoting.exception.RemotingException;
/**
* 生产者
* 生产者
* @author live
* @author live
*
*
*/
*/
public class Prodcer {
class Prodcer {
public static void main(String[] args) {
public static void main(String[] args) {
// DefaultMQProducer producer = new DefaultMQProducer();
DefaultMQProducer producer = new DefaultMQProducer();
DefaultMQProducer producer = new DefaultMQProducer("ProducerGroup01");
DefaultMQProducer producer = new DefaultMQProducer("ProducerGroup01");
System.out.println("创建一个 producer:" + producer);
System.out.println("创建一个 producer:" + producer);
producer.setNamesrvAddr("127.0.0.1:9876");
producer.setNamesrvAddr("127.0.0.1:9876");
System.out.println("producer 设置 Namesrv:" + producer);
System.out.println("producer 设置 Namesrv:" + producer);
try {
try {
System.out.println("启动 producer...");
System.out.println("启动 producer...");
producer.start();
producer.start();
System.out.println("启动 producer 成功。");
System.out.println("启动 producer 成功。");
} catch (MQClientException e1) {
} catch (MQClientException e1) {
e1.printStackTrace();
e1.printStackTrace();
}
}
Message msg = new Message("TopicCus", "TagCusAdd", "***Hello sxn!***".getBytes());
Message msg = new Message("TopicCus", "TagCusAdd", "***Hello sxn!***".getBytes());
try {
try {
SendResult result = producer.send(msg);
SendResult result = producer.send(msg);
System.out.println(">>>发送完成。\tmsg:" + new String( msg.getBody()) + "\t,result:"+ result);
System.out.println(">>>发送完成。\tmsg:" + new String( msg.getBody()) + "\t,result:"+ result);
} catch (MQClientException | RemotingException | MQBrokerException | InterruptedException e) {
} catch (MQClientException | RemotingException | MQBrokerException | InterruptedException e) {
System.out.println("发送失败!");
System.out.println("发送失败!");
e.printStackTrace();
e.printStackTrace();
}
}
producer.shutdown();
producer.shutdown();
}
}
}
package com.live.test.mq;
com.live.test.mq;
import java.util.List;
java.util.List;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
org.apache.rocketmq.common.message.MessageExt;
/**
* 消费者
* 消费者
* @author live
* @author live
*
*
*/
*/
public class Consumer {
class Consumer {
public static void main(String[] args) {
public static void main(String[] args) {
// 创建 Consumer
// 创建 Consumer
// 需要一个 consumerGroup 名字作为构造器的参数
// 需要一个 consumerGroup 名字作为构造器的参数
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroup01");
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroup01");
System.out.println("创建一个 Consumer:" + consumer);
System.out.println("创建一个 Consumer:" + consumer);
// 设置 Consumer 的 Namersrv
// 设置 Consumer 的 Namersrv
consumer.setNamesrvAddr("127.0.0.1:9876");
consumer.setNamesrvAddr("127.0.0.1:9876");
// 设置 Consumer 的消费策略
// 设置 Consumer 的消费策略
// CONSUME_FROM_LAST_OFFSET 默认策略,从该队列最尾开始消费,即跳过历史消息
// CONSUME_FROM_LAST_OFFSET 默认策略,从该队列最尾开始消费,即跳过历史消息
// CONSUME_FROM_FIRST_OFFSET 从队列最开始开始消费,即历史消息(还储存在broker的)全部消费一遍
// CONSUME_FROM_FIRST_OFFSET 从队列最开始开始消费,即历史消息(还储存在broker的)全部消费一遍
// CONSUME_FROM_TIMESTAMP
// CONSUME_FROM_TIMESTAMP
// 从某个时间点开始消费,和setConsumeTimestamp()配合使用,默认是半个小时以前
// 从某个时间点开始消费,和setConsumeTimestamp()配合使用,默认是半个小时以前
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
// 设置 Consumer 所订阅的Topic和Tag
// 设置 Consumer 所订阅的Topic和Tag
// *代表全部的Tag
// *代表全部的Tag
try {
try {
consumer.subscribe("TopicCus", "TagCusAdd");
consumer.subscribe("TopicCus", "TagCusAdd");
} catch (MQClientException e1) {
} catch (MQClientException e1) {
e1.printStackTrace();
e1.printStackTrace();
}
}
System.out.println("注册消息监听器,进行消息的逻辑处理...");
System.out.println("注册消息监听器,进行消息的逻辑处理...");
consumer.registerMessageListener(new MessageListenerConcurrently() {
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgList,
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgList,
ConsumeConcurrentlyContext context) {
ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgList) {
for (MessageExt msg : msgList) {
System.out.println("<<<消费一条。\tmsg:" + new String( msg.getBody()) + "\t,当前线程:"+ Thread.currentThread().getName());
System.out.println("<<<消费一条。\tmsg:" + new String( msg.getBody()) + "\t,当前线程:"+ Thread.currentThread().getName());
}
}
// 返回消费状态
// 返回消费状态
// CONSUME_SUCCESS 消费成功
// CONSUME_SUCCESS 消费成功
// RECONSUME_LATER 消费失败,需要稍后重新消费
// RECONSUME_LATER 消费失败,需要稍后重新消费
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
}
});
});
System.out.println("注册消息监听器完成。");
System.out.println("注册消息监听器完成。");
try {
try {
System.out.println("启动 Consumer...");
System.out.println("启动 Consumer...");
consumer.start();
consumer.start();
System.out.println("Consumer 启动成功。");
System.out.println("Consumer 启动成功。");
} catch (MQClientException e) {
} catch (MQClientException e) {
System.out.println("启动 Consumer 失败!");
System.out.println("启动 Consumer 失败!");
e.printStackTrace();
e.printStackTrace();
}
}
}
}
}