RocketMQ
一、是什么
RocketMQ是阿里巴巴开发并开源的分布式消息中间件,现在是Apache顶级项目。主要用于高性能、高可靠性的消息传递,适合金融、电商等复杂业务场景。
二、怎么用
-
安装和配置
- 下载RocketMQ的发行版并解压。
- 配置nameserver和broker。
- 启动nameserver和broker服务。
-
生产者发送消息
import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.common.message.Message; public class Producer { public static void main(String[] args) throws Exception { DefaultMQProducer producer = new DefaultMQProducer("producerGroup"); producer.setNamesrvAddr("localhost:9876"); producer.start(); Message msg = new Message("TopicTest", "TagA", ("Hello RocketMQ").getBytes()); producer.send(msg); producer.shutdown(); } }
- 消费者接收消息
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;
import java.util.List;
public class Consumer {
public static void main(String[] args) throws Exception {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumerGroup");
consumer.setNamesrvAddr("localhost:9876");
consumer.subscribe("TopicTest", "TagA");
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgs) {
System.out.println(new String(msg.getBody()));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
}
}
三、效果怎么样
- 高性能:处理高并发业务场景,支持百万级消息处理能力。
- 高可靠性:多副本存储、主从同步机制保证消息可靠性。
- 低延迟:消息传递延迟低,适合对延迟敏感的业务。
- 丰富的消息特性:支持顺序消息、延迟消息、事务消息等。
- 易于管理和维护:自带nameserver,简化部署和管理。
Kafka
一、Kafka 是什么
Apache Kafka 是由LinkedIn开发并开源的一款分布式流处理平台,现由Apache软件基金会维护。Kafka设计用于处理实时数据流,广泛应用于日志收集、数据流处理等大数据场景。
二、Kafka 的特点
- 高吞吐量:每秒可以处理数百万条消息,适合大规模数据流处理。
- 低延迟:消息传递延迟通常在毫秒级别。
- 分布式架构:通过分区和副本机制,确保高可用性和数据一致性。
- 持久化存储:消息持久化到磁盘,支持数据恢复和回放。
- 丰富的生态系统:支持Kafka Streams、Kafka Connect等丰富的流处理和数据集成工具。
三、Kafka 的使用
-
安装和配置
- 下载Kafka的发行版并解压。
- 配置zookeeper和Kafka broker。
- 启动zookeeper和Kafka broker服务。
-
生产者发送消息
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
public class Producer {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("my-topic", "key", "Hello Kafka"));
producer.close();
}
}
3. 消费者接收消息
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Collections;
import java.util.Properties;
public class Consumer {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singletonList("my-topic"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
records.forEach(record -> {
System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
});
}
}
}
四、Kafka 的效果
- 高吞吐量:单机吞吐量高,适合大规模数据流处理。
- 低延迟:消息传递延迟低,通常在毫秒级别。
- 数据持久化:支持消息持久化,确保数据不会丢失,可以进行数据恢复和回放。
- 高可用性:通过分区和副本机制,确保系统的高可用性和数据的一致性。
- 丰富的生态系统:集成了多种流处理框架和数据管道工具,如Kafka Streams、Kafka Connect等。
RocketMQ 和 Kafka 的联系和区别
联系
- 消息队列系统:两者都是分布式、高性能的消息队列系统,提供可靠的消息传递服务。
- 分布式架构:都支持集群部署,具有良好的扩展性和容错性。
- 持久化存储:消息都可以持久化到磁盘,保证数据的可靠性和恢复能力。
- 多种消息模式:都支持发布/订阅模式和点对点模式。
区别
-
架构设计:
- Kafka:依赖于Zookeeper进行集群管理和协调,采用分区和副本机制。
- RocketMQ:自带nameserver进行服务发现和负载均衡,采用主从架构。
-
性能和吞吐量:
- Kafka:单机吞吐量更高,适合大规模数据流处理,尤其是在大数据场景中表现突出。
- RocketMQ:性能略逊于Kafka,但在处理高并发业务场景表现优异。
-
消息特性:
- Kafka:主要关注于日志收集和流处理,支持丰富的流处理API(Kafka Streams)。
- RocketMQ:支持顺序消息、延迟消息、事务消息等丰富的消息特性,更适合金融、电商等需要复杂消息处理的业务场景。
-
管理和运维:
- Kafka:依赖于Zookeeper进行管理和协调,运维复杂度较高,需要同时管理Kafka和Zookeeper集群。
- RocketMQ:管理相对简单,自带nameserver和broker,易于部署和维护。
-
社区和生态:
- Kafka:拥有广泛的社区支持和丰富的生态系统,集成多种流处理框架和数据管道工具。
- RocketMQ:在国内有较大的使用者和支持者,国际社区和生态相对较小。
总的来说,Kafka和RocketMQ各有优势,选择哪种消息队列系统取决于具体的业务需求、技术栈和团队经验。Kafka在大规模数据流处理和日志收集方面表现出色,而RocketMQ在高并发、低延迟和复杂消息处理方面具有独特优势。