您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

热门的消息队列框架比较、使用方法、优缺点,提供示例代码

时间:2023-10-11 12:48:29  来源:  作者:架构师老卢
热门的消息队列框架比较、使用方法、优缺点,提供示例代码

 

消息队列(Message Queue)是一种在分布式系统中用于消息传递的通信模式。它可以将消息发送者和接收者解耦,提高系统的可靠性、可扩展性和可维护性。下面将详细介绍3-5个常用的消息队列框架,包括RabbitMQ、Kafka、ActiveMQ、RocketMQ和NATS。

  1. RabbitMQ:
    RabbitMQ是一个开源的消息队列中间件,基于AMQP(Advanced Message Queuing Protocol)协议。它具有高度的可靠性、可扩展性和灵活性,广泛应用于分布式系统中。

特性:

  • 支持多种消息模式:包括点对点模式和发布/订阅模式。
  • 持久化消息:可以将消息存储到磁盘上,即使在重启后也不会丢失。
  • 高可靠性:支持消息的确认机制,确保消息被正确地发送和接收。
  • 可扩展性:支持集群部署,可以通过添加更多的节点来提高吞吐量和可用性。
  • 灵活的路由规则:可以根据消息的内容进行灵活的路由和过滤。

使用方法:
首先需要安装RabbitMQ服务器,并启动它。然后可以使用JAVA或C#等编程语言通过RabbitMQ的客户端库来发送和接收消息。

示例代码(Java):

// 发送消息
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
     Channel channel = connection.createChannel()) {
    String queueName = "hello";
    channel.queueDeclare(queueName, false, false, false, null);
    String message = "Hello, RabbitMQ!";
    channel.basicPublish("", queueName, null, message.getBytes());
    System.out.println("Sent message: " + message);
}

// 接收消息
try (Connection connection = factory.newConnection();
     Channel channel = connection.createChannel()) {
    String queueName = "hello";
    channel.queueDeclare(queueName, false, false, false, null);
    Consumer consumer = new DefaultConsumer(channel) {
        @Override
        public void handleDelivery(String consumerTag, Envelope envelope,
                                   AMQP.BasicProperties properties, byte[] body) throws IOException {
            String message = new String(body, "UTF-8");
            System.out.println("Received message: " + message);
        }
    };
    channel.basicConsume(queueName, true, consumer);
}

优缺点:

  • 优点:RabbitMQ具有丰富的特性和灵活的路由规则,支持多种消息模式,提供高可靠性和可扩展性。同时,它的社区活跃,有大量的文档和教程可供参考。
  • 缺点:RabbitMQ在处理大量消息时可能会有性能问题,因为它使用了较重的进程和线程模型。另外,它的消息吞吐量相对较低。
  1. Kafka:
    Kafka是一个分布式的流处理平台,也是一个高吞吐量的分布式消息队列系统。它具有持久化、可扩展和高性能的特点,广泛应用于大数据领域。

特性:

  • 高吞吐量:Kafka能够处理大量的消息并保持很低的延迟。
  • 持久化存储:Kafka将所有的消息都持久化到磁盘上,确保消息不会丢失。
  • 分布式架构:Kafka支持集群部署,可以通过添加更多的节点来提高吞吐量和可用性。
  • 多订阅者模式:Kafka允许多个消费者同时订阅同一个主题,实现消息的广播和分发。

使用方法:
首先需要安装Kafka服务器,并启动它。然后可以使用Java或C#等编程语言通过Kafka的客户端库来发送和接收消息。

示例代码(Java):

// 发送消息
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");
try (Producer<String, String> producer = new KafkaProducer<>(props)) {
    String topic = "my-topic";
    String message = "Hello, Kafka!";
    producer.send(new ProducerRecord<>(topic, message));
    System.out.println("Sent message: " + message);
}

// 接收消息
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
try (Consumer<String, String> consumer = new KafkaConsumer<>(props)) {
    String topic = "my-topic";
    consumer.subscribe(Collections.singletonList(topic));
    while (true) {
        ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
        for (ConsumerRecord<String, String> record : records) {
            String message = record.value();
            System.out.println("Received message: " + message);
        }
    }
}

优缺点:

  • 优点:Kafka具有高吞吐量、持久化存储和分布式架构的特点,适用于大数据领域的实时流处理。同时,它的社区活跃,有大量的文档和教程可供参考。
  • 缺点:Kafka相对于其他消息队列框架来说较为复杂,需要一定的学习成本。另外,它的配置和部署相对复杂,需要考虑到集群的搭建和数据的备份等问题。
  1. ActiveMQ:
    ActiveMQ是一个开源的消息队列中间件,支持多种消息协议,包括AMQP、STOMP和OpenWire等。它具有可靠性、可扩展性和高性能的特点,广泛应用于企业级应用。

特性:

  • 多种消息模式:ActiveMQ支持点对点模式和发布/订阅模式,可以根据需要选择合适的模式。
  • 消息持久化:可以将消息存储到磁盘上,即使在重启后也不会丢失。
  • 高可用性:ActiveMQ支持主备模式和集群模式,可以提供高可用的消息传递服务。
  • JMS支持:ActiveMQ是Java Message Service(JMS)的实现,可以与其他JMS兼容的系统进行集成。

使用方法:
首先需要安装ActiveMQ服务器,并启动它。然后可以使用Java或C#等编程语言通过ActiveMQ的客户端库来发送和接收消息。

示例代码(Java):

// 发送消息
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
try (Connection connection = factory.createConnection();
     Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)) {
    Destination destination = session.createQueue("my-queue");
    MessageProducer producer = session.createProducer(destination);
    TextMessage message = session.createTextMessage("Hello, ActiveMQ!");
    producer.send(message);
    System.out.println("Sent message: " + message.getText());
}

// 接收消息
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
try (Connection connection = factory.createConnection();
     Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)) {
    Destination destination = session.createQueue("my-queue");
    MessageConsumer consumer = session.createConsumer(destination);
    connection.start();
    Message message = consumer.receive();
    if (message instanceof TextMessage) {
        TextMessage textMessage= (TextMessage) message;
        System.out.println("Received message: " + textMessage.getText());
    }
}

优缺点:

  • 优点:ActiveMQ具有丰富的特性和灵活的配置选项,可以满足各种不同的需求。它支持多种消息协议和多种消息模式,适用于各种场景。同时,ActiveMQ有很好的社区支持和文档资料。
  • 缺点:ActiveMQ相对于其他消息队列框架来说比较重量级,需要一定的系统资源和配置。另外,它的性能相对较低,不适合高吞吐量和实时性要求较高的场景。
  1. RocketMQ:
    RocketMQ是由阿里巴巴开发的分布式消息队列中间件,它具有高吞吐量、低延迟和高可靠性的特点。RocketMQ支持消息的顺序传输和事务消息,并且具有灵活的消息模式和多样化的消息存储方式。

特性:

  • 高吞吐量:RocketMQ能够处理高并发的消息传输,适用于大规模的消息处理场景。
  • 消息顺序传输:RocketMQ支持消息的有序传输,可以保证消息按照发送的顺序进行消费。
  • 可靠性:RocketMQ提供了消息的持久化存储和消息的重试机制,可以保证消息的可靠传输。
  • 分布式架构:RocketMQ支持分布式部署和集群模式,可以提供高可用的消息传递服务。

使用方法:
首先需要安装RocketMQ服务器,并启动它。然后可以使用Java或其他编程语言通过RocketMQ的客户端库来发送和接收消息。

示例代码(Java):

// 发送消息
DefaultMQProducer producer = new DefaultMQProducer("producer-group");
producer.setNamesrvAddr("localhost:9876");
producer.start();
try {
    Message message = new Message("topic", "Hello, RocketMQ!".getBytes());
    SendResult result = producer.send(message);
    System.out.println("Sent message: " + result.getSendStatus());
} finally {
    producer.shutdown();
}

// 接收消息
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer-group");
consumer.setNamesrvAddr("localhost:9876");
consumer.subscribe("topic", "*");
consumer.registerMessageListener(new MessageListenerConcurrently() {
    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> messages, ConsumeConcurrentlyContext context) {
        for (MessageExt message : messages) {
            System.out.println("Received message: " + new String(message.getBody()));
        }
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }
});
consumer.start();
  1. NATS:
    NATS是一个轻量级的、高性能的消息队列中间件,由Cloud Native Computing Foundation(CNCF)维护。NATS具有简单易用、快速和可靠的特点,适用于微服务架构和云原生应用。

特性:

  • 简单易用:NATS的API简单易懂,上手容易。
  • 高性能:NATS具有低延迟和高吞吐量的特点,适用于高并发的消息传输。
  • 可靠性:NATS支持消息的持久化存储和消息的重试机制,可以保证消息的可靠传输。
  • 分布式架构:NATS支持分布式部署和集群模式,可以提供高可用的消息传递服务。

使用方法:
首先需要安装NATS服务器,并启动它。然后可以使用Java或其他编程语言通过NATS的客户端库来发送和接收消息。

示例代码(Java):

// 发送消息
Connection connection = Nats.connect("nats://localhost:4222");
try {
    connection.publish("subject", "Hello, NATS!".getBytes());
    System.out.println("Sent message");
} finally {
    connection.close();
}

// 接收消息
Connection connection = Nats.connect("nats://localhost:4222");
try {
    Dispatcher dispatcher = connection.createDispatcher((msg) -> {
        System.out.println("Received message: " + new String(msg.getData()));
    });
    dispatcher.subscribe("subject");
    connection.flush(Duration.ZERO);
    System.out.println("Listening for messages...");
    Thread.sleep(10000);
} finally {
    connection.close();
}

欢迎分享你的使用经验!



Tags:框架   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  Search: 框架  点击:(7)  评论:(0)  加入收藏
Htmx,它到底是框架还是库?
在最近的前端开发技术的探讨中,htmx经常成为热议的话题。一些人批评它,认为尽管htmx批评现代前端框架过于复杂,但它自己却似乎也是一个复杂的框架。这种看法值得我们深入思考。...【详细内容】
2024-03-28  Search: 框架  点击:(16)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  Search: 框架  点击:(46)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  Search: 框架  点击:(39)  评论:(0)  加入收藏
Go Gin框架实现优雅地重启和停止
在Web应用程序中,有时候我们需要重启或停止服务器,无论是因为更新代码还是进行例行维护。在这种情景下,我们需要保证应用程序的可用性和数据的一致性。这就需要优雅地关闭和重...【详细内容】
2024-01-30  Search: 框架  点击:(67)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  Search: 框架  点击:(67)  评论:(0)  加入收藏
OpenHarmony - 基于ArkUI框架实现日历应用
前言对于刚刚接触OpenHarmony应用开发的开发者,最快的入门方式就是开发一个简单的应用,下面记录了一个日历应用的开发过程,通过日历应用的开发,来熟悉基本图形的绘制,ArkUI的组件...【详细内容】
2024-01-16  Search: 框架  点击:(54)  评论:(0)  加入收藏
阿里“AI替换万物”框架火爆社区,网友:偶像不需要真人了?
白交 发自 凹非寺量子位 | 公众号 QbitAIReplace Anything as you want。现在只需框住你需要保留的区域,AI就可以替换万物了!比如让霉霉穿上中国旗袍,结果发饰、服装、背景等各...【详细内容】
2024-01-15  Search: 框架  点击:(66)  评论:(0)  加入收藏
分布式事务框架选择与实践
分布式事务是处理跨多个服务的原子操作的关键概念,而选择适合应用场景的框架对于确保事务一致性至关重要。以下是几个常见的分布式事务框架,并讨论它们的使用和实践。1. XA协...【详细内容】
2024-01-05  Search: 框架  点击:(96)  评论:(0)  加入收藏
JavaScript前端框架2024年展望
Angular、Next.js、React和Solid的维护者和创作者们展望2024年,分享了他们计划中的改进。译自2024 Predictions by JavaScript Frontend Framework Maintainers,作者 Loraine...【详细内容】
2024-01-05  Search: 框架  点击:(89)  评论:(0)  加入收藏
▌简易百科推荐
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(7)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(12)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(52)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(46)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(39)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(50)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(67)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(84)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(86)  评论:(0)  加入收藏
花 15 分钟把 Express.js 搞明白,全栈没有那么难
Express 是老牌的 Node.js 框架,以简单和轻量著称,几行代码就可以启动一个 HTTP 服务器。市面上主流的 Node.js 框架,如 Egg.js、Nest.js 等都与 Express 息息相关。Express 框...【详细内容】
2024-01-16  程序员成功  微信公众号  Tags:Express.js   点击:(85)  评论:(0)  加入收藏
站内最新
站内热门
站内头条