这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
一、重点内容:
1.1 知识要点有哪些?
- 消息队列
- kafka
- BMQ
- RocketMQ
二、详细知识点介绍:
2.1 消息队列
消息队列是一种分布式软件基础架构,它允许多个应用程序异步地发送,接收和存储消息。消息队列在多个应用之间创建了抽象的接口,这样应用就可以相互独立地运行,而不必重新部署或者影响整个系统。它还可以帮助解决分布式系统中的稀疏性问题,从而提高应用程序的扩展性和可用性。
2.2 kafka
Kafka是一种分布式发布/订阅消息系统。它由Apache软件基金会开发,旨在为跨越网络的分布式环境提供高吞吐量的消息传输解决方案。Kafka使用一种简单而有效的架构,并且具有高性能、可靠性和灵活性。它可以把任何类型的消息通过特定的代理存储和传输,并且可以与应用程序进行高效的集成。另外,Kafka可以提供丰富的管理工具,用于监控和管理集群中的消息。它还可以使用插件来扩展服务能力,以支持负载均衡、故障转移和连接管理等功能。 快速入门代码如下:
// 创建一个Kafka Producer
Properties props = new Properties();
props.put("bootstrap.servers", "kafka_server_ip: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);
// 发送消息
ProducerRecord<String, String> record = new ProducerRecord<>("topic1", "key1", "Hello, World!");
producer.send(record);
// 关闭Producer实例
producer.close();
其优点包括:
- 高吞吐量:Kafka支持大量客户端连接和数据处理,提供高吞吐量。
- 可扩展性:Kafka支持在分布式系统中解决稀疏性问题,可以很容易地进行水平扩展。
- 可靠性:Kafka具有容错性和高可用性,可以保证在集群中的数据安全性以及消息的可靠传输。
- 快速性:Kafka支持低延迟消息传输和处理,可以最大程度地减少时间延迟。
2.3 BMQ
RabbitMQ是一种高级消息队列系统,可以帮助开发人员解决分布式系统中的消息传递问题。它使用 AMQP (Advanced Message Queue Protocol) 协议,支持所有主流的编程语言,并提供丰富的API,允许开发者应用它的功能。RabbitMQ还可以提供丰富的管理工具,以便监控和管理集群中的消息。
快速入门代码如下:
// 创建一个RabbitMQ连接
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("rabbitmq_server_ip");
Connection connection = factory.newConnection();
// 创建一个RabbitMQ channel
Channel channel = connection.createChannel();
// 定义一个消息队列
String queueName = "myQueue";
channel.queueDeclare(queueName, false, false, false, null);
// 发送消息到消息队列中
String message = "Hello, World!";
channel.basicPublish("", queueName, null, message.getBytes());
// 关闭channel和connection
channel.close();
connection.close();
RabbitMQ优点如下:
- 可靠性 - RabbitMQ提供可靠性消息传递,可靠性策略可以定义在发布者和订阅者之间。
- 多种协议 - RabbitMQ支持多种协议,如AMQP,STOMP,MQTT,HTTP等,这样你就可以在不同的语言和框架中使用它。
- 扩展性 - RabbitMQ拥有高度可扩展性,支持水平和垂直的扩展,以满足数量和性能的要求。
2.4 RocketMQ
RocketMQ是一种分布式,可靠且可扩展的消息中间件,可以帮助应用程序以可靠,可靠和高效的方式实现消息同步和异步处理。RocketMQ主要具有如下特点:
- 容易上手 - 它拥有简单而直观的概念,使RockerMQ非常容易上手。
- 高可用性 - 它是一个分布式系统,可以支持多台服务器集群,从而提高可用性,并提供一致性保证。
- 可靠性 - RocketMQ保证消息的可靠性,保证消息的有序传递,并且可以检测和重发消息。
- 消息传输 - RocketMQ可以通过异步或同步的方式来传输消息,同时支持双工通信,以确保消息正确发送和接收。
// 创建Producer对象
DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
// 设置NameServer地址
producer.setNamesrvAddr("127.0.0.1:9876");
// 启动Producer
producer.start();
// 创建消息,并发送消息
Message message = new Message("TopicName","TagName","MessageKey", "MessageBody".getBytes());
SendResult sendResult = producer.send(message);
System.out.println(sendResult);
// 关闭Producer
producer.shutdown();
三、实践练习例子:
下面是用Go语言实现的消息队列示例代码:
// 创建消息队列,长度为1024
queue := make(chan string, 1024)
// 创建消费者线程
go func() {
for {
// 从队列中取出消息
msg := <-queue
// 处理消息
fmt.Println("消费消息:", msg)
}
}()
// 创建生产者线程
go func() {
for {
// 生成消息
msg := uuid.New().String()
// 添加消息到队列
queue <- msg
fmt.Println("生产消息:", msg)
}
}()
四、个人总结:
消息队列的主要作用是在后端开发中用于实现消息传输和异步处理。它提供了一种将消息从发送者发送到接收者的有效方法,支持保存消息并可以在不同时间再次使用。因此,消息队列在后端开发中起到了重要的作用,可以有效地实现异步处理、解耦、容错和流量削峰等功能。